docker-compose

前言

以前我做 docker 的时候一般都用不到 docker-compose,毕竟很多时候我只需要用一个容器就够了。

现在发现要搭建复杂一点的环境还是用 docker-compose 更方便一点,所以就来学习一下。

感觉生产环境还是使用 Alpine Linux 来得好?体积小,要装什么也可以使用 apk。


安装

docker-compose 的安装很简单:https://docs.docker.com/compose/install/

就 Linux 来说,装好依赖的环境只需要使用 CURL 将 docker-compose 下载到本地就可以了。

版本

就 docker-compose 而言,需要关注的主要有三个组件的版本:docker engine、docker-compose、compose file。

有的 compose file 的写法在不同版本不一定都支持。

装最新版就对了(√)。

具体的版本对应在这里:https://docs.docker.com/compose/compose-file/compose-versioning/

docker-compose cli

参考文档:https://docs.docker.com/compose/reference/overview/

查看帮助信息:

1
docker-compose --help

完整的 docker-compose 命令:

1
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

-f 可以指定 docker-compose.yml 文件的路径,-p 则可以指定项目名称。

cli 环境变量

我们可以使用 export 来设置和删除环境变量,也可以使用 .env 文件,来配置一些 docker-compose cli 的操作。

可使用的环境变量如下:

变量名 使用效果
COMPOSE_PROJECT_NAME 设置项目名称。启动时,此值将与服务名称拼接来命名容器。
例如,如果你的项目名称为 myapp,它包括两个服务 db 和 web,容器名则分别为 myapp_db_1 和 myapp_web_1。
设置此选项是可选的。如果未设置此项,则 COMPOSE_PROJECT_NAME 默认为 basename 项目目录的默认值。
COMPOSE_FILE 指定 compose 文件的路径。如果未提供,compose 将查找当前目录,然后查找每个父目录,直到找到 docker-compose.yml 文件。(翻父目录真是神奇)
此变量支持由路径分隔符分隔的多个 compose 文件(在 Linux 和 macOS 上,路径分隔符是 : ,在 Windows 上则是 ; )。
例如: COMPOSE_FILE=docker-compose.yml:docker-compose.prod.yml。
路径分隔符也可以使用自定义 COMPOSE_PATH_SEPARATOR。
COMPOSE_API_VERSION 如果遇到类似的问题:client and server don’t have same version (client : 1.22, server: 1.18),可以通过设置 docker-compose 的 api 版本来解决。
这是 docker-compose 使用的 docker API 版本不匹配 docker 守护进程监听服务的问题。
可以设置为 auto 来进行匹配。
DOCKER_HOST(不常用) 设置 docker 守护程序的路径。
与 docker 客户端一样,默认为 unix:///var/run/docker.sock。
DOCKER_TLS_VERIFY(不常用) 设置为空字符串以外的任何内容时,启用与 docker 守护程序的 TLS 通信。
DOCKER_CERT_PATH(不常用) 配置 ca.pem,cert.pem 以及 key.pem 的路径,用于 TLS 验证。
默认为 ~/.docker。
COMPOSE_HTTP_TIMEOUT(不常用) 配置 compose 对 docker 守护程序的请求的超时时间(以秒为单位)。
默认为60秒。
COMPOSE_TLS_VERSION(不常用) 配置使用哪个 TLS 版本与 docker 守护程序进行 TLS 通信。默认为 TLSv1。
支持的值是:TLSv1,TLSv1_1,TLSv1_2。
COMPOSE_CONVERT_WINDOWS_PATHS(不常用) 启用将路径样式从 Windows 样式到 Unix 样式的转换。
Windows上 的 docker machine 和 docker toolbox 的用户应始终设置此项。
默认为0。支持的值:true 或 1 启用 false 或 0 禁用。
COMPOSE_PATH_SEPARATOR 如果设置此项,COMPOSE_FILE 则使用此字符作为路径分隔符来分隔环境变量的值为多个路径。
COMPOSE_FORCE_WINDOWS_HOST(不常用) 如果设置,强制认定主机路径为 Windows 路径,即使 compose 运行在基于 UNIX 的系统上。
支持的值:true 或 1 启用 false 或 0 禁用。
COMPOSE_IGNORE_ORPHANS 如果设置,compose 不会尝试检测项目中的的孤立容器,即项目中没有在 docker-compose.yml 中定义的容器。
支持的值:true 或 1 启用 false 或 0 禁用。
COMPOSE_PARALLEL_LIMIT(不常用) 设置 compose 可以并行执行的操作数限制。
默认值为 64,并且可能不会设置为低于 2。
COMPOSE_INTERACTIVE_NO_CLI(不常用) 如果设置,compose 不会尝试使用 docker cli 进行来进行交互性的 run 和 exec 操作。在需要 cli 的 Windows 上,此选项不可用。
支持:true 或 1 启用 false 或 0 禁用。

命令完成

就像个扩展一样,装了之后 docker-compose 的命令可以写得更简单一点吧大概。

命令

build

从 docker-compose.yml 文件创建项目,镜像默认名为 project_service,也可以自行设置:

1
2
3
4
5
6
7
8
9
10
Usage: build [options] [--build-arg key=val...] [SERVICE...]

Options:
--compress Compress the build context using gzip.
--force-rm Always remove intermediate containers.
--no-cache Do not use cache when building the image.
--pull Always attempt to pull a newer version of the image.
-m, --memory MEM Sets memory limit for the build container.
--build-arg key=val Set build-time variables for services.
--parallel Build images in parallel.
bundle

从Compose文件生成分布式应用程序包(DAB):

1
2
3
4
5
6
7
8
Usage: bundle [options]

Options:
--push-images Automatically push images for any services
which have a `build` option specified.

-o, --output PATH Path to write the bundle file to.
Defaults to "<project name>.dab".
config

验证并查看 compose 文件:

1
2
3
4
5
6
7
8
9
10
Usage: config [options]

Options:
--resolve-image-digests Pin image tags to digests.
-q, --quiet Only validate the configuration, don't print anything.
--services Print the service names, one per line.
--volumes Print the volume names, one per line.
--hash="*" Print the service config hash, one per line.
Set "service1,service2" for a list of specified services
or use the wildcard symbol to display all services.
create

从项目创建容器但是不启动,被版本抛弃了,现在使用 up 以及 –no-start 选项来替代。

down

关闭 up 启动的项目,会暂停并删除容器、网络、存储卷和镜像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Usage: down [options]

Options:
--rmi type Remove images. Type must be one of:
'all': Remove all images used by any service.
'local': Remove only images that don't have a
custom tag set by the `image` field.
-v, --volumes Remove named volumes declared in the `volumes`
section of the Compose file and anonymous volumes
attached to containers.
--remove-orphans Remove containers for services not defined in the
Compose file
-t, --timeout TIMEOUT Specify a shutdown timeout in seconds.
(default: 10)

默认情况下会删除的是:

  • compose file 中定义的容器
  • compose file 中定义的网络
  • 使用了的默认网络
  • 定义为 external 的存储卷的网络则不会被删除。
events

打印容器事件:

1
2
3
4
Usage: events [options] [SERVICE...]

Options:
--json Output events as a stream of json objects
exec

跟 docker exec 一样的用法,不同的是使用的不是容器名而是 docker-compose.yml 中定义的 service 名,以及命令默认是交互式执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
Usage: exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]

Options:
-d, --detach Detached mode: Run command in the background.
--privileged Give extended privileges to the process.
-u, --user USER Run the command as this user.
-T Disable pseudo-tty allocation. By default `docker-compose exec`
allocates a TTY.
--index=index index of the container if there are multiple
instances of a service [default: 1]
-e, --env KEY=VAL Set environment variables (can be used multiple times,
not supported in API < 1.25)
-w, --workdir DIR Path to workdir directory for this command.
help

显示命令的帮助和使用说明:

1
Usage: help COMMAND
kill

通过发送SIGKILL信号强制运行中的容器停止,也可以传递可选信号:

1
2
3
4
5
Usage: kill [options] [SERVICE...]

Options:
-s SIGNAL SIGNAL to send to the container.
Default signal is SIGKILL.
logs

打印容器日志:

1
2
3
4
5
6
7
8
Usage: logs [options] [SERVICE...]

Options:
--no-color Produce monochrome output.
-f, --follow Follow log output.
-t, --timestamps Show timestamps.
--tail="all" Number of lines to show from the end of the logs
for each container.
pause

暂停正在运行的容器中的进程,可以使用 unpause 重新启动:

1
Usage: pause [SERVICE...]
port

打印容器内端口的外部映射:

1
2
3
4
5
6
Usage: port [options] SERVICE PRIVATE_PORT

Options:
--protocol=proto tcp or udp [default: tcp]
--index=index index of the container if there are multiple
instances of a service [default: 1]
ps

列出项目中正在运行的容器:

1
2
3
4
5
6
7
Usage: ps [options] [SERVICE...]

Options:
-q, --quiet Only display IDs
--services Display services
--filter KEY=VAL Filter services by a property
-a, --all Show all stopped containers (including those created by the run command)
pull

与 docker pull 相似,拉取与 docker-compose.yml 文件中定义的服务相关联的镜像,但不会根据这些镜像启动容器:

1
2
3
4
5
6
7
8
Usage: pull [options] [SERVICE...]

Options:
--ignore-pull-failures Pull what it can and ignores images with pull failures.
--parallel Deprecated, pull multiple images in parallel (enabled by default).
--no-parallel Disable parallel pulling.
-q, --quiet Pull without printing progress information
--include-deps Also pull services declared as dependencies
push

与 docker push 相似,将 docker-compose.yml 文件中定义的服务相关联的镜像推送到服务端:

1
2
3
4
Usage: push [options] [SERVICE...]

Options:
--ignore-push-failures Push what it can and ignores images with push failures.
restart

重启容器,重启不会反映 docker-compose.yml 文件中的修改:

1
2
3
4
5
Usage: restart [options] [SERVICE...]

Options:
-t, --timeout TIMEOUT Specify a shutdown timeout in seconds.
(default: 10)
rm

与 docker rm 相似,删除已经停止的容器,默认情况下,不会删除附加到容器的匿名存储卷,使用 docker volume ls 可以列出所有存储卷:

1
2
3
4
5
6
Usage: rm [options] [SERVICE...]

Options:
-f, --force Don't ask to confirm removal
-s, --stop Stop the containers, if required, before removing
-v Remove any anonymous volumes attached to containers
run

与 docker run 相似,会调用服务中定义的配置,但是会覆盖启动命令,同时不会开启端口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Usage:
run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] [-l KEY=VALUE...]
SERVICE [COMMAND] [ARGS...]

Options:
-d, --detach Detached mode: Run container in the background, print
new container name.
--name NAME Assign a name to the container
--entrypoint CMD Override the entrypoint of the image.
-e KEY=VAL Set an environment variable (can be used multiple times)
-l, --label KEY=VAL Add or override a label (can be used multiple times)
-u, --user="" Run as specified username or uid
--no-deps Don't start linked services.
--rm Remove container after run. Ignored in detached mode.
-p, --publish=[] Publish a container's port(s) to the host
--service-ports Run command with the service's ports enabled and mapped
to the host.
--use-aliases Use the service's network aliases in the network(s) the
container connects to.
-v, --volume=[] Bind mount a volume (default [])
-T Disable pseudo-tty allocation. By default `docker-compose run`
allocates a TTY.
-w, --workdir="" Working directory inside the container
scale

设置要运行的容器数量,建议使用 up 命令中的 –scale 选项。

start

启动现有的容器:

1
Usage: start [SERVICE...]
stop

关闭正在运行的容器:

1
2
3
4
5
Usage: stop [options] [SERVICE...]

Options:
-t, --timeout TIMEOUT Specify a shutdown timeout in seconds.
(default: 10)
top

显示正在运行的进程:

1
Usage: top [SERVICE...]
unpause

启动暂停服务的容器中的进程:

1
Usage: unpause [SERVICE...]
up

构建,(重新)创建,启动和关联服务相关容器:

如果进程遇到错误,则此命令的退出代码为 1。

如果使用 SIGINT(ctrl+ C)或者中断进程 SIGTERM,则停止容器,退出代码为 0。

如果 SIGINT 或 SIGTERM 在这段停机阶段再次发送,运行容器被 kill,退出代码为 2。

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
Usage: up [options] [--scale SERVICE=NUM...] [SERVICE...]

Options:
-d, --detach Detached mode: Run containers in the background,
print new container names. Incompatible with
--abort-on-container-exit.
--no-color Produce monochrome output.
--quiet-pull Pull without printing progress information
--no-deps Don't start linked services.
--force-recreate Recreate containers even if their configuration
and image haven't changed.
--always-recreate-deps Recreate dependent containers.
Incompatible with --no-recreate.
--no-recreate If containers already exist, don't recreate
them. Incompatible with --force-recreate and -V.
--no-build Don't build an image, even if it's missing.
--no-start Don't start the services after creating them.
--build Build images before starting containers.
--abort-on-container-exit Stops all containers if any container was
stopped. Incompatible with -d.
-t, --timeout TIMEOUT Use this timeout in seconds for container
shutdown when attached or when containers are
already running. (default: 10)
-V, --renew-anon-volumes Recreate anonymous volumes instead of retrieving
data from the previous containers.
--remove-orphans Remove containers for services not defined
in the Compose file.
--exit-code-from SERVICE Return the exit code of the selected service
container. Implies --abort-on-container-exit.
--scale SERVICE=NUM Scale SERVICE to NUM instances. Overrides the
`scale` setting in the Compose file if present.

compose file(2.x)

blkio_config

一组用于限制 IO 的配置选项:

选项 效果/键
DEVICE_READ_BPS
DEVICE_WRITE_BPS
为给定设备上的读/写操作设置每秒字节数限制。
path:定义受影响设备的符号路径。
rate:表示字节数的整数值,或者是表示字节值的字符串。
DEVICE_READ_IOPS
DEVICE_WRITE_IOPS
为给定设备上的读/写操作设置每秒操作限制。
path:定义受影响设备的符号路径。
rate:表示每秒允许操作数的整数值。
weight 修改分配给此服务的带宽相对于其他服务的比例。
取一个10到1000之间的整数值,默认值为500。
weight_device 按设备微调带宽分配。
path:定义受影响设备的符号路径。
weight:10到1000之间的整数值。
build/image

一组用于构建镜像的配置选项,build 可以从自己的 dockerfile 中创建镜像,image 则是使用已用的镜像。

在 1.x 版本中,build 和 image 不能同时使用,在 2.x 的版本中,同时使用会使用在 build 中配置的 dockerfile 创建镜像,并命名为 image 配置的名称。

选项如下:

选项 效果
cache_from 指定用于构建镜像的缓存。
context 指定 dockerfile 的路径。
dockerfile 指定 dockerfile 的文件名。
args 添加用在 dockerfile 中的参数变量。
需要在 dockerfile 中使用 ARG 指定参数名。
如果省略值,则会使用运行 compose 的环境中的值。
布尔值(true,false,yes,no,on,off)必须用引号括起来,这样分析器会将它们解释为字符串。
extra_hosts 添加 DNS 主机名映射。
isolation 指定容器的隔离技术:https://docs.docker.com/engine/reference/commandline/run/#specify-isolation-technology-for-container---isolation
labels 为容器添加Docker元数据(metadata)信息。
network 设置网络容器连接,可以设置 IP 地址以及是否与外部隔离。
shm_size 设置 /dev/shm 分区的大小。
指定为表示字节数的整数值或表示字节值的字符串。
target 在内部定义构建指定的阶段 dockerfile:https://docs.docker.com/develop/develop-images/multistage-build/
cap_add,cap_drop

添加或删除容器功能。

command

覆盖容器启动后默认执行的命令。

cgroup_parent

为容器指定一个可选的所属组(当以 swarm 模式部署栈时该选项会被忽略)。

CONTAINER_NAME

指定自定义容器名称,而不是生成的默认名称。

cpu_rt_runtime,cpu_rt_period

使用 docker 守护程序实时调度程序来配置 CPU 分配参数。(不懂)

device_cgroup_rules

将规则添加到cgroup允许的设备列表。(也不懂)

devices

设备映射列表。

depend on

服务之间的依赖,会影响启动顺序,启动一个服务的同时会启动它所依赖的服务。

dns

自定义 DNS 服务器。

dns_opt

要添加到容器resolv.conf文件的自定义 DNS 选项列表。

自定义 DNS 搜索域。可以是单个值或列表。

tmpfs

在容器内安装临时文件系统。可以是单个值或列表。

entrypoint

设置容器的启动命令。

env_file

从文件添加环境变量。可以是单个值或列表。

environment

添加环境变量。您可以使用数组或字典。任何布尔值:true,false,yes,no,需要用引号括起来,以确保解析器不会将它们转换为 True 或 False。

会覆盖 env_file 中配置的环境变量。

expose

暴露端口而不将它们发布到主机,它们只能被链接服务访问。只能指定内部端口。

extends

用于扩展服务:https://docs.docker.com/compose/extends/#extending-services

链接到此容器外部 docker-compose.yml 甚至是 compose 外部的容器,尤其是对于提供共享或公共服务的容器。 external_links 遵循类似于 links 指定容器名称和链接别名(CONTAINER:ALIAS)时的语义。

extra_hosts

添加 DNS 主机名映射。

group_add

给容器内的用户添加组。

healthcheck

配置运行的检查以确定此服务的容器是否“健康”:https://docs.docker.com/engine/reference/builder/#healthcheck

image

上面说过了,不说了。

init

在容器内运行 init,使用的默认 init 二进制文件是 Tini:https://github.com/krallin/tini

关于 init:https://www.cnblogs.com/ilinuxer/p/6188303.html

isolation

指定容器的隔离技术:https://docs.docker.com/engine/reference/commandline/run/#specify-isolation-technology-for-container---isolation

labels

使用 docker 标签向容器添加元数据,可以使用数组或字典。

链接到另一个服务中的容器。指定服务名称和链接别名(”SERVICE:ALIAS”),或仅指定服务名称。

使用 links 可以将服务名 DNS 解析为 IP。

链接是一种传统选择,建议使用网络。

logging

配置记录服务的方式。

network_mode

网络模式。

networks

要加入的网络,可以用于规划内网,需要自行配置网络,选项如下:

选项 效果
ipv4_address
ipv6_address
在加入网络时为此服务指定容器的静态IP地址。
link_local_ips 指定链接本地IP列表。
priority 指定优先级以指示 compose 应将服务的容器连接到其网络的顺序。如果未指定,则默认值为0。
PID

如果设置为以下形式之一:container:<container_name>,, service:<service_name> 则服务共享指定容器或服务的 PID 地址空间。

如果设置为“host”,则服务的 PID 模式为主机 PID 模式。这打开了容器和主机操作系统之间的 PID 地址空间共享。使用此标志启动的容器可以访问和操作裸机计算机命名空间中的其他容器,反之亦然。

pids_limit

调整容器的PID限制。设置-1为无限制的PID。

platform

此参数确定将拉下哪个版本的映像、将在哪个平台上执行服务的构建。

ports

暴露端口。指定 ports(HOST:CONTAINER)或仅指定容器端口(选择短暂的主机端口),可以是一个范围内的端口。

runtime

指定用于服务容器的 runtime 。默认 runtime 和可用 runtime 可以用 docker info 查看。

scale

指定要为此服务部署的默认容器数。

security_opt

覆盖每个容器的默认标签方案。

stop_grace_period

指定 stop_signal 在发送 SIGKILL 之前,如果它未处理 SIGTERM(或指定了任何停止信号),则尝试停止容器时要等待多长时间 。指定为持续时间。默认情况下,stop 在发送 SIGKILL 之前等待容器退出 10 秒。

stop_signal

设置替代信号以停止容器。默认情况下 stop 使用 SIGTERM。使用 stop_signal 设置一个替代信号来让 stop 来发送该停止信号。

storage_opt

设置此服务的存储驱动程序选项。

sysctls

要在容器中设置的内核参数。

ulimits

覆盖容器的默认 ulimits。您可以将单个限制指定为整数,也可以将软/硬限制指定为映射。

userns_mode

如果 docker 守护程序配置了用户空间,则禁用此服务的用户空间:https://docs.docker.com/engine/reference/commandline/dockerd/#disable-user-namespace-for-a-container

volumes

设置文件映射,详细的参考文档。

volume_driver

指定要用于此服务上所有已声明卷的默认卷驱动程序:https://docs.docker.com/engine/userguide/dockervolumes/https://docs.docker.com/engine/extend/plugins_volume/

volumes_from

从另一个服务或容器挂载所有卷。

restart

no 是默认的重新启动策略,它不会在任何情况下重新启动容器。当 always 指定时,容器总是重新启动。指定为 on-failure 时则在退出代码表示为故障错误时重启。

cpu_count,cpu_percent,cpu_shares,cpu_period,cpu_quota,cpus,cpuset,domainname,hostname,ipc,mac_address,mem_limit,memswap_limit,mem_swappiness,mem_reservation,oom_kill_disable,oom_score_adj,privileged,read_only,shm_size,stdin_open,tty,user,working_dir

跟 docker run 的选项一致:https://docs.docker.com/engine/reference/run/

Volume configuration reference

比较复杂一般用不着,详细看文档。

Network configuration reference

如何配置自己的网络,主要使用 internal、IPAM 选项。

internal 选项用于配置是否与外部隔离,IPAM 选项用于配置子网、IP 范围等。

一个配置实例如下,在 service 中:

1
2
3
networks:
my_network:
ipv4_address: 10.0.20.10

然后在 networs 中:

1
2
3
4
5
6
my_network:
internal: true
ipam:
driver: default
config:
- subnet: 10.0.20.0/24

就可以配置一个内网容器。


Orz