简介与安装
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 | curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/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 | [root@master wordpress]# cat docker-compose.yml |
如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 | [root@localhost wordpress]# docker-compose up -d |
docker-compose logs
查看状态使用 docker-compose ps
,查看全部服务的log使用 docker-compose logs
或者 使用 docker-compose logs 服务名
单个服务的日志。
1 | [root@localhost wordpress]# docker-compose logs db |tail |
docker-compose images
查看镜像:
1 | [root@localhost wordpress]# docker-compose images |
运行命令,使用docker-compose exec 服务名 COMMAND
,也可以使用docker-compose run
来实现,但是先会去启动容器。建议还是直接使用 docker-compose exec
。
1 | [root@localhost wordpress]# docker-compose exec wordpress w |
docker-compose scale
指定运行服务的数量,使用 docker-compose scale [options] [SERVICE=NUM...]
实现。注意的是,由于wordpress有绑定了端口,所以运行2个以上的wordpress是会出现问题的。
1 | [root@localhost wordpress]# docker-compose scale wordpress=2 |
docker-compose down
使用docker-compose down
会停止 up 命令所启动的容器,并移除网络,但不会移除分区。
1 | [root@master wordpress]# docker-compose down |
从上面可以看出,docker-compose的命令参数跟docker相差不了多少,但其功能还不一样的,此2个命令必须熟练掌握。