尝试使用Windows上的Docker Compose创建多容器环境

一句概括:

我在Windows10上建立了Docker环境,所以试了一些东西。这次是关于在构建Web系统等需要同时使用多个容器,如WEB服务器/ AP服务器/ DB服务器等时使用的容器配置信息统一管理工具”Docker Compose”。它定义了docker-compose.yml文件的方式和总结。

可以参考以下内容查找Docker和docker-compose.yml的关联

试着整理一下Docker的基本功能和整体概览的形象。

請查看以下的指引以了解動作環境和Docker環境構築的方法。

    • Windows 10 Pro 64bit

 

    Docker for Windows

尝试在Windows上运行Docker环境。

「Docker Compose」是在安装Docker for Windows时同时安装的。

大约的工作时间

1个小时

参考书籍

命令列表

docker run --link 接続したいコンテナ名:エイリアス名 イメージ名 実行コマンド
docker-compose up
docker-compose scale コンテナ名=数
docker-compose ps
docker-compose logs
docker-compose run コンテナ名 実行コマンド
docker-compose start
docker-compose stop
docker-compose restart
docker-compose kill
docker-compose rm

docker-compose.yml的定义列表

image イメージ名
build ファイルパス
command 実行コマンド
links/external_links コンテナ名:エイリアス名
ports/expose "ポート番号"
volumes マウントポイント
volumes_from マウント先のコンテナ名
environment 環境変数名=値
container_name コンテナ名
labels ラベル内容

基本的なdocker-compose.ymlの書き方は、YAML形式で記述されます。

    • インデント(半角スペース)でデータ階層構造を表す

 

    • #はコメントになる

 

    • 配列を使用するときは先頭「- 」(ハイフンと半角スペース)に続き定義内容を記載する

 

    インデントなしの行の先頭に定義するコンテナの種類ごとにコンテナ名を指定する

图像的名称

可以通过指定基本镜像来确定基本图像。类似于Docker命令,可以继续指定标签(省略标签以指定最新图像)。

testserver:
 image: ubuntu

测试服务器生成的容器名称

构建文件路径

如果您在创建图像时使用 Dockerfile,可以在“build”之后指定 Dockerfile 文件的路径。

testserver:
 build: .

在docker-compose.yml文件中,需要指定image或者build其中之一。
如果使用build(Dockerfile),则需要首先创建镜像,然后再创建容器。

执行命令

如果要执行命令,请指定命令。
如果Dockerfile中有CMD指定,则会被覆盖。

testserver:
 image: ubuntu

 command: /bin/bash

链接/外部链接 容器名称:别名

通过自动在环境变量中设置IP地址等,使得能够容易地访问指定的容器,并能够通过容器名称或别名来访问的功能(链接功能)。

testserver:
 image: ubuntu

 links:
  - dbserver:mysql

只有在同一个docker-compose.yml文件中定义的容器才可以使用links参数进行指定。而external_links参数则用于在与外部其他容器进行协作时使用链接功能。如果不使用docker-compose.yml文件,则可以通过以下命令在docker run时指定链接功能。

使用 Docker 运行命令:–link 连接容器名:别名 镜像名 执行命令。

对于通过参数指定的容器,会自动为其设置环境变量。
然而,这个限制是它只能在同一主机上运行的容器之间才能访问。

暴露端口/公开”端口号”

在容器的端口映射中,可以显式地指定主机端口,格式为“主机端口号:容器端口号”,但如果没有指定,则会使用随机端口。注意必须用双引号括起来。

testserver:
 image: ubuntu

 ports:
  - "80:80"

如果只向使用链接功能来协作的容器公开端口,而不向主机公开,那么应该使用expose指令。
在这种情况下,可以省略主机的端口号。

testserver:
 image: ubuntu

 expose:
  - "8000"

卷 链接点。

如果要挂载卷,则需要指定主机上要挂载的路径,格式为“主机机器的文件夹路径:容器的文件夹路径”。

testserver:
 image: ubuntu

 volumes:
  - /var/lib/mysql

从名称为”マウント先のコンテナ名”的容器中加载卷。

在将卷载入特定的容器时使用。

testserver:
 image: ubuntu

 volumes_from:
  - dataserver

環境的變數名稱和值為何?

使用时指定环境变量

testserver:
 image: ubuntu

 environment:
  - HOGE=hoge

容器名称

给生成的容器命名时使用

testserver:
 image: ubuntu

 container_name: webserver

标签内容

使用时贴标签在容器上。

testserver:
 image: ubuntu

 labels:
  - "description=testserver"

使用docker-compose.yml文件生成容器的docker-compose命令。

使用Docker Compose启动

使用docker-compose.yml文件生成/启动多个容器。

可以使用-f选项指定docker-compose.yml文件
如果没有-f选项,则使用当前目录中的docker-compose.yml文件
可以使用-d选项在后台启动

> docker-compose -f webdb-docker-compose.yml up -d
Creating wordpress_dbserver_1 ...
Creating wordpress_dbserver_1 ... done
Creating wordpress_webserver_1 ...
Creating wordpress_webserver_1 ... done
webserver:
 image: wordpress
 ports:
  - "80:80"
 links:
  - dbserver:mysql

dbserver:
 image: mysql
 environment:
  MYSQL_ROOT_PASSWORD: password

确认容器启动

> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES
d9c5c3b521a5        wordpress           "docker-entrypoint..."   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   wordpress_webserver_1
f02a94dcee33        mysql               "docker-entrypoint..."   About a minute ago   Up About a minute   3306/tcp             wordpress_dbserver_1

容器的名称确切地说是”执行文件夹_docker-compose.yml的容器名称_通数”,因此docker-compose.yml中所写的容器名称被称为服务名。

使用docker-compose 扩展容器数量,容器名=数

使用时指定启动容器数

> docker-compose scale webserver=1 dbserver=2
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Creating wordpress_webserver_1 ...
Creating wordpress_webserver_1 ... done
Creating wordpress_dbserver_1 ...
Creating wordpress_dbserver_2 ...
Creating wordpress_dbserver_1 ... done
Creating wordpress_dbserver_2 ... done

如果多个实例同时启动时发生冲突,将会导致错误。例如,如果启动两个web服务器,端口80将会发生冲突。

> docker-compose scale webserver=2 dbserver=1
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
WARNING: The "webserver" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Creating wordpress_webserver_1 ...
Creating wordpress_webserver_2 ...
Creating wordpress_webserver_1 ... error
Creating wordpress_webserver_2 ... done

ERROR: for wordpress_webserver_1  Cannot start service webserver: driver failed programming external connectivity on endpoint wordpress_webserver_1 (e1a6f29e4ec9f31c40b5470cf9109c98765c5a7e03a10013758063beb54b8436): Bind for 0.0.0.0:80 failed: port is already allocated
ERROR: Cannot start service webserver: driver failed programming external connectivity on endpoint wordpress_webserver_1 (e1a6f29e4ec9f31c40b5470cf9109c98765c5a7e03a10013758063beb54b8436): Bind for 0.0.0.0:80 failed: port is already allocated

docker-compose ps 可以被转述为 “列出当前的 Docker Compose 服务状态”。

进行显示多个容器的列表
相比docker ps命令,变得更简洁?

> docker-compose ps
        Name                       Command               State         Ports
-----------------------------------------------------------------------------------
wordpress_dbserver_1    docker-entrypoint.sh mysqld      Up      3306/tcp
wordpress_dbserver_2    docker-entrypoint.sh mysqld      Up      3306/tcp
wordpress_webserver_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:80->80/tcp

> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
d9f2dec9af02        mysql               "docker-entrypoint..."   5 minutes ago       Up 5 minutes        3306/tcp             wordpress_dbserver_1
cde58d78dc3d        mysql               "docker-entrypoint..."   5 minutes ago       Up 5 minutes        3306/tcp             wordpress_dbserver_2
816fcbe2c4f7        wordpress           "docker-entrypoint..."   5 minutes ago       Up 5 minutes        0.0.0.0:80->80/tcp   wordpress_webserver_1

使用docker-compose查看日志

使用这个选项来查看容器的日志
将显示每个容器的日志

> docker-compose logs
Attaching to wordpress_dbserver_1, wordpress_dbserver_2, wordpress_webserver_1
webserver_1  | WordPress not found in /var/www/html - copying now...
webserver_1  | Complete! WordPress has been successfully copied to /var/www/html
dbserver_1   | Initializing database
webserver_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
dbserver_2   | Initializing database
dbserver_1   | 2018-01-27T02:09:56.866053Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
webserver_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
dbserver_2   | 2018-01-27T02:09:56.887342Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
~~~省略~~~

使用docker-compose运行容器并执行命令的方式是:docker-compose run 容器名 実行命令

在启动的容器中执行新的命令时使用
在run后指定容器名称,只操作指定的容器(其他命令也是同样)
若要在容器内执行命令,例如执行/bin/bash

> docker-compose run webserver /bin/bash
Starting wordpress_dbserver_1 ... done
Starting wordpress_dbserver_2 ... done
root@8271d38f7036:/var/www/html#

docker-compose 启动

在需要批量启动多个容器的情况下使用

> docker-compose start
Starting dbserver  ... done
Starting webserver ... done

> docker-compose ps
        Name                       Command               State         Ports
-----------------------------------------------------------------------------------
wordpress_dbserver_1    docker-entrypoint.sh mysqld      Up      3306/tcp
wordpress_dbserver_2    docker-entrypoint.sh mysqld      Up      3306/tcp
wordpress_webserver_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:80->80/tcp

停止docker-compose

当需要一次停止多个容器时使用。

> docker-compose stop
Stopping wordpress_dbserver_1  ... done
Stopping wordpress_dbserver_2  ... done
Stopping wordpress_webserver_1 ... done

使用Docker Compose重启

使用此选项来批量重新启动多个容器。

> docker-compose restart
Restarting wordpress_dbserver_1  ... done
Restarting wordpress_dbserver_2  ... done
Restarting wordpress_webserver_1 ... done

使用docker-compose kill命令

使用时批量强制停止多个容器

> docker-compose kill
Killing wordpress_dbserver_1  ... done
Killing wordpress_dbserver_2  ... done
Killing wordpress_webserver_1 ... done

> docker-compose ps
        Name                       Command                State     Ports
-------------------------------------------------------------------------
wordpress_dbserver_1    docker-entrypoint.sh mysqld      Exit 137
wordpress_dbserver_2    docker-entrypoint.sh mysqld      Exit 137
wordpress_webserver_1   docker-entrypoint.sh apach ...   Exit 137

删除 Docker Compose 容器。

使用这个选项来批量删除多个容器。

> docker-compose rm
Going to remove wordpress_dbserver_1, wordpress_dbserver_2, wordpress_webserver_1
Are you sure? [yN] y
Removing wordpress_dbserver_1      ... done
Removing wordpress_dbserver_2      ... done
Removing wordpress_webserver_1     ... done
广告
将在 10 秒后关闭
bannerAds