docker入门教程六:容器编排compose

简介与安装

Docker Compose 是通过python编写的,Docker的服务编排工具,主要用来构建基于Docker的复杂应用,Compose 通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景。其代码目前在 https://github.com/docker/compose 上开源。其定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。

我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。如LNMP运行环境。compose就是来做这样的事情的。通过一个单独的 docker-compose.yml 模板文件来定义一组相关联的应用容器为一个项目。Compose 中有两个重要的概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

所谓的项目,其实就是上一层目录名,而服务是指在 docker-compose.yml 定义的镜像。

安装的方法非常简单,从 官方 GitHub Release 处直接下载编译好的二进制文件即可。

1
2
3
4
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
#bash 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

使用方法

有关使用方法以及 docker-compose.yml 文件的语法,请直接阅读:https://yeasy.gitbooks.io/docker_practice/content/compose/commands.html ,以下介绍常用使用方法。

docker-compass的完整命令的用法是:docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...] 主要分为2段,一是options,二是COMMAND。

常用options有:

  • -f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
  • -p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
  • --verbose 输出更多调试信息。
  • -v, --version 打印版本并退出。
  • --env-file PATH设置环境变量

常用COMMAND有:

  • build:构建(重新构建)项目中的服务容器。
  • config:验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因。
  • down:此命令将会停止 up 命令所启动的容器,并移除网络
  • docker-compose exec service名称 COMMAND:进入指定的容器。
  • images:列出 Compose 文件中包含的镜像。
  • docker-compose logs <service名称>:查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。
  • scale:通过service=num 设置指定服务运行的容器个数。如docker-compose scale web=3 db=2
  • up:将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。大部分时候都可以直接通过该命令来启动一个项目。默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。当通过 Ctrl-C 停止命令时,所有容器将会停止。如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。
    • -d 在后台运行服务容器。
    • --no-color 不使用颜色来区分不同的服务的控制台输出。
    • --no-deps 不启动服务所链接的容器。
    • --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
    • --no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
    • --no-build 不自动构建缺失的服务镜像。
    • -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

而compose默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。其常用的指令有:

  • services:后面一行接的是服务名,当compose运行之后 ,其容器名为:项目名_服务名_1
  • image:后接镜像名,image与bulid只能出现一个
  • bulid:后接 Dockerfile 所在文件夹的路径。Compose将会利用它自动构建这个镜像,然后使用这个镜像。也可以使用 context 指令指定 Dockerfile 所在文件夹的路径,再使用 dockerfile 指令指定 Dockerfile 文件名。
  • command:覆盖容器启动后默认执行的命令。
  • depends_on:先启动容器所依赖的服务名,再来启动自己的。
  • environment:设置环境变量。只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
  • env_file:从文件中获取环境变量,可以为单独的文件路径或列表。如果变量很多,可以将变量写入到一个文件里面,然后使用env_file来配置文件路径。另外:Compose 模板文件支持动态读取主机的系统环境变量和当前目录下的 .env 文件中的变量。若当前目录存在 .env 文件,执行 docker-compose 命令时将从该文件中读取变量。
  • ports:暴露端口信息。使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
  • volumes:数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式 (HOST:CONTAINER:ro)。如果路径为数据卷名称,必须在文件中配置数据卷。

实例

docker-compose.yml

创建一个目录wordpress且进入这个目录,在创建一个docker-compose.yml文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@master wordpress]# cat docker-compose.yml
version: "3"
services:
db:
image: mysql:5.7
#command:
# - --default_authentication_plugin=mysql_native_password
# - --character-set-server=utf8mb4
# - --collation-server=utf8mb4_unicode_ci
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: 123456789

wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- web:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: 123456789
volumes:
db_data:
web:

如docker-compose.yml文件所示,其项目名为wordpress,定义了2个service,分别为db、wordpress,使用了mysql 5.7的镜像,root密码是123456,给wordpress使用的数据库以及用户名为:wordpress,密码为123456789,创建了2个volumes分区,用来持久化数据。而wordpress去连接mysql,就是通过 db 这个名字来实现的。

docker-compose up

直接使用docker-compose up -d来运行,会自动创建网络,分区,如果本地没有镜像,会自动下载,且在后台运行。创建的容器名需要注意一下,是以 项目名_服务名_num 来命名的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost wordpress]# docker-compose up -d
Creating network "wordpress_default" with the default driver
Creating volume "wordpress_db_data" with default driver
Creating volume "wordpress_web" with default driver
Pulling wordpress (wordpress:latest)...
latest: Pulling from library/wordpress
b8f262c62ec6: Pull complete
a98660e7def6: Pull complete
4d75689ceb37: Pull complete
...
Digest: sha256:2a59aa247c062019db4997714eb06f87c85a59a6cfa4ddd7be4c113c1c1226ac
Status: Downloaded newer image for wordpress:latest
Creating wordpress_db_1 ... done
Creating wordpress_wordpress_1 ... done
[root@localhost wordpress]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------
wordpress_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
wordpress_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8000->80/tcp

docker-compose logs

查看状态使用 docker-compose ps,查看全部服务的log使用 docker-compose logs 或者 使用 docker-compose logs 服务名 单个服务的日志。

1
2
3
4
5
6
7
8
9
10
11
[root@localhost wordpress]# docker-compose logs db |tail
db_1 | 2019-10-05T03:29:50.877192Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
db_1 | 2019-10-05T03:29:50.877228Z 0 [Note] IPv6 is available.
db_1 | 2019-10-05T03:29:50.877237Z 0 [Note] - '::' resolves to '::';
db_1 | 2019-10-05T03:29:50.877250Z 0 [Note] Server socket created on IP: '::'.
db_1 | 2019-10-05T03:29:50.877518Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
db_1 | 2019-10-05T03:29:50.879520Z 0 [Note] InnoDB: Buffer pool(s) load completed at 191005 3:29:50
db_1 | 2019-10-05T03:29:50.883459Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
db_1 | 2019-10-05T03:29:50.889607Z 0 [Note] Event Scheduler: Loaded 0 events
db_1 | 2019-10-05T03:29:50.889712Z 0 [Note] mysqld: ready for connections.
db_1 | Version: '5.7.27' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)

docker-compose images

查看镜像:

1
2
3
4
5
[root@localhost wordpress]# docker-compose images
Container Repository Tag Image Id Size
---------------------------------------------------------------------
wordpress_db_1 mysql 5.7 383867b75fd2 356 MB
wordpress_wordpress_1 wordpress latest aa4bde9e337a 516.5 MB

运行命令,使用docker-compose exec 服务名 COMMAND,也可以使用docker-compose run来实现,但是先会去启动容器。建议还是直接使用 docker-compose exec

1
2
3
4
5
6
7
8
[root@localhost wordpress]# docker-compose exec wordpress w
05:07:05 up 7 days, 19:36, 0 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
[root@localhost wordpress]#
[root@localhost wordpress]# docker-compose run wordpress w
Starting wordpress_db_1 ... done
05:07:15 up 7 days, 19:36, 0 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

docker-compose scale

指定运行服务的数量,使用 docker-compose scale [options] [SERVICE=NUM...]实现。注意的是,由于wordpress有绑定了端口,所以运行2个以上的wordpress是会出现问题的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost wordpress]# docker-compose scale wordpress=2
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
WARNING: The "wordpress" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Starting wordpress_wordpress_1 ... done
Creating wordpress_wordpress_2 ... error

ERROR: for wordpress_wordpress_2 Cannot start service wordpress: driver failed programming external connectivity on endpoint wordpress_wordpress_2 (867cb11684ba32c65756e63dfd1ad98c7f689de58d6d487b2cc73a80bc164b5c): Bind for 0.0.0.0:8000 failed: port is already allocated
ERROR: Cannot start service wordpress: driver failed programming external connectivity on endpoint wordpress_wordpress_2 (867cb11684ba32c65756e63dfd1ad98c7f689de58d6d487b2cc73a80bc164b5c): Bind for 0.0.0.0:8000 failed: port is already allocated
[root@localhost wordpress]#
[root@localhost wordpress]# docker-compose scale db=2
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting wordpress_db_1 ... done
Creating wordpress_db_2 ... done
[root@localhost wordpress]# docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------
wordpress_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
wordpress_db_2 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
wordpress_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8000->80/tcp
wordpress_wordpress_2 docker-entrypoint.sh apach ... Exit 128

docker-compose down

使用docker-compose down 会停止 up 命令所启动的容器,并移除网络,但不会移除分区。

1
2
3
4
5
6
[root@master wordpress]# docker-compose down
Stopping wordpress_wordpress_1 ... done
Stopping wordpress_db_1 ... done
Removing wordpress_wordpress_1 ... done
Removing wordpress_db_1 ... done
Removing network wordpress_default

从上面可以看出,docker-compose的命令参数跟docker相差不了多少,但其功能还不一样的,此2个命令必须熟练掌握。

参考链接

Docker Compose 项目

Docker三剑客之Docker Compose(七)

  • 本文作者: wumingx
  • 本文链接: https://www.wumingx.com/k8s/docker-compose.html
  • 本文主题: docker入门教程六:容器编排compose
  • 版权声明: 本博客所有文章除特别声明外,转载请注明出处!如有侵权,请联系我删除。
0%