尝试使用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