Docker 进阶篇之Compose
Compose
项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
简介
Compose
定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。 Compose
代码目前在 https://github.com/docker/compose 上开源。
安装与卸载
安装
Mac/Windows
Docker Desktop for Mac/Windows
自带docker-compose
二进制文件,安装 Docker 之后可以直接使用。Ubuntu
1、通过下载二进制包
1
2
3$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose2、 pip安装
1
$ sudo pip install -U docker-compose
3、bash补全命令
1
$ curl -L https://raw.githubusercontent.com/docker/compose/1.25.5/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
卸载
1、删除二进制包文件
1
$ sudo rm /usr/local/bin/docker-compose
2、pip移除
1
$ sudo pip uninstall docker-compose
使用以及说明
术语
首先介绍几个术语。
- 服务 (
service
):一个应用容器,实际上可以运行多个相同镜像的实例。 - 项目 (
project
):由一组关联的应用容器组成的一个完整业务单元。
可见,一个项目可以由多个服务(容器)关联而成,
Compose
面向项目进行管理。- 服务 (
命令
基本格式
1
$ docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
命令选项
-f, --file FILE
指定使用的 Compose 模板文件,默认为docker-compose.yml
,可以多次指定。-p, --project-name NAME
指定项目名称,默认将使用所在目录名称作为项目名。--x-networking
使用 Docker 的可拔插网络后端特性--x-network-driver DRIVER
指定网络后端的驱动,默认为bridge
--verbose
输出更多调试信息。-v, --version
打印版本并退出。build
格式为
docker-compose build [options] [SERVICE...]
。构建(重新构建)项目中的服务容器。服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。
选项包括:
--force-rm
删除构建过程中的临时容器。--no-cache
构建镜像过程中不使用 cache(这将加长构建过程)。--pull
始终尝试通过 pull 来获取更新版本的镜像。
config
验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因。
down
此命令将会停止
up
命令所启动的容器,并移除网络start
格式为
docker-compose start [SERVICE...]
。启动已经存在的服务容器。
stop
格式为
docker-compose stop [options] [SERVICE...]
。停止已经处于运行状态的容器,但不删除它。通过
docker-compose start
可以再次启动这些容器。选项:
-t, --timeout TIMEOUT
停止容器时候的超时(默认为 10 秒)。
exec
进入指定容器
images
列出 Compose 文件中包含的镜像。
kill
格式为
docker-compose kill [options] [SERVICE...]
。通过发送
SIGKILL
信号来强制停止服务容器。logs
格式为
docker-compose logs [options] [SERVICE...]
。该命令在调试问题的时候十分有用。
pause
格式为
docker-compose pause [SERVICE...]
。暂停一个服务容器。
unpause
格式为
docker-compose unpause [SERVICE...]
。恢复处于暂停状态中的服务。
port
格式为
docker-compose port [options] SERVICE PRIVATE_PORT
。打印某个容器端口所映射的公共端口。
ps
格式为
docker-compose ps [options] [SERVICE...]
。列出项目中目前的所有容器。
pull
格式为
docker-compose pull [options] [SERVICE...]
。拉取服务依赖的镜像。
选项:
--ignore-pull-failures
忽略拉取镜像过程中的错误。
push
推送服务依赖的镜像到 Docker 镜像仓库。
restart
格式为
docker-compose restart [options] [SERVICE...]
。重启项目中的服务。
rm
格式为
docker-compose rm [options] [SERVICE...]
。删除所有(停止状态的)服务容器。推荐先执行
docker-compose stop
命令来停止容器。选项:
-f, --force
强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。-v
删除容器所挂载的数据卷。
run
格式为
docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
。在指定服务上执行一个命令。
选项:
-d
后台运行容器。--name NAME
为容器指定一个名字。--entrypoint CMD
覆盖默认的容器启动指令。-e KEY=VAL
设置环境变量值,可多次使用选项来设置多个环境变量。-u, --user=""
指定运行容器的用户名或者 uid。--no-deps
不自动启动关联的服务容器。--rm
运行命令后自动删除容器,d
模式下将忽略。-p, --publish=[]
映射容器端口到本地主机。--service-ports
配置服务端口并映射到本地主机。-T
不分配伪 tty,意味着依赖 tty 的指令将无法运行。
scale
格式为
docker-compose scale [options] [SERVICE=NUM...]
。设置指定服务运行的容器个数。
1
2
3# 通过 service=num 的参数来设置数量
$ docker-compose scale web=3 db=2
# 将启动 3 个容器运行 web 服务,2 个容器运行 db 服务选项:
-t, --timeout TIMEOUT
停止容器时候的超时(默认为 10 秒)。
top
查看各个服务容器内运行的进程。
up
格式为
docker-compose up [options] [SERVICE...]
。该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
默认情况,
docker-compose up
启动的容器都在前台,docker-compose up -d
(生产环境下使用),将会在后台启动并运行所有的容器。如果用户不希望容器被停止并重新创建,可以使用
docker-compose up --no-recreate
, 只会启动处于停止状态的容器,而忽略已经运行的服务; 如果用户只想重新部署某个服务,可以使用docker-compose up --no-deps -d <SERVICE_NAME>
来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。选项:
-d
在后台运行服务容器。--no-color
不使用颜色来区分不同的服务的控制台输出。--no-deps
不启动服务所链接的容器。--force-recreate
强制重新创建容器,不能与--no-recreate
同时使用。--no-recreate
如果容器已经存在了,则不重新创建,不能与--force-recreate
同时使用。--no-build
不自动构建缺失的服务镜像。-t, --timeout TIMEOUT
停止容器时候的超时(默认为 10 秒)。
version
格式为
docker-compose version
。打印版本信息。
Compose 模板文件
大部分指令跟
docker run
相关参数的含义都是类似的。默认的模板文件名称为docker-compose.yml
,格式为 YAML 格式。每个服务都必须通过
image
指令指定镜像或build
指令(需要 Dockerfile)等来自动构建生成镜像。build
指定
Dockerfile
所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)Compose
将会利用它自动构建这个镜像,然后使用这个镜像。1
2
3
4
5version: '3'
services:
webapp:
build: ./dir也可以使用
context
指令指定Dockerfile
所在文件夹的路径,dockerfile
指令指定Dockerfile
文件名,arg
指令指定构建镜像时的变量1
2
3
4
5
6
7
8
9version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1cache_from
指定构建镜像的缓存1
2
3
4
5build:
context: .
cache_from:
- alpine:latest
- corp/web_app:3.14cap_add, cap_drop
指定容器的内核能力(capacity)分配
command
覆盖容器启动后默认执行的命令。
1
command: echo "hello world"
cgroup_parent
指定父
cgroup
组,意味着将继承该组的资源限制。1
2# 创建了一个 cgroup 组名称为 cgroups_1
cgroup_parent: cgroups_1container_name
指定容器名称。默认将会使用
项目名称_服务名称_序号
这样的格式。1
container_name: docker-web-container
注意: 指定容器名称后,该服务将无法进行扩展(scale),因为 Docker 不允许多个容器具有相同的名称。
devices
指定设备映射关系。
1
2devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"depends_on
解决容器的依赖、启动先后的问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres例子中会先启动
redis
db
再启动web
,web
服务不会等待redis
db
「完全启动」之后才启动。dns
自定义
DNS
服务器。可以是一个值,也可以是一个列表。1
2
3
4
5dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114dns_search
配置
DNS
搜索域。可以是一个值,也可以是一个列表。1
2
3
4
5dns_search: example.com
dns_search:
- domain1.example.com
- domain2.example.comtmpfs
挂载一个 tmpfs 文件系统到容器。
1
2
3
4tmpfs: /run
tmpfs:
- /run
- /tmpenv_file
从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过
docker-compose -f FILE
方式来指定 Compose 模板文件,则env_file
中变量的路径会基于模板文件路径。如果有变量名称与
environment
指令冲突,则按照惯例,以后者为准。1
2
3
4
5
6env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.envenvironment
设置环境变量。可以使用数组或字典两种格式。
1
2
3
4
5
6
7environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRETexpose
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数
1
2
3expose:
- "3000"
- "8000"extra_hosts
指定额外的 host 名称映射信息
1
2
3extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"会在启动后的服务容器中
/etc/hosts
文件中添加如下两条条目。1
28.8.8.8 googledns
52.1.157.61 dockerhubimage
指定为镜像名称或镜像 ID。如果镜像在本地不存在,
Compose
将会尝试拉取这个镜像。1
2
3image: ubuntu
image: orchardup/postgresql
image: a4bc65fdlabels
为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。
1
2
3
4labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com.startupteam.release: "rc3 for v1.0"logging
配置日志选项。
1
2
3
4
5
6
7
8
9logging:
# 目前支持三种日志驱动类型 json-file syslog none
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
# options:
# max-size: "200k"
# max-file: "10"
network_mode
设置网络模式。使用和
docker run
的--network
参数一样的值。1
2
3
4
5network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"networks
配置容器连接的网络。
1
2
3
4
5
6
7
8
9
10
11version: "3"
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:pid
跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程 ID 来相互访问和操作。
1
pid: "host"
ports
暴露端口信息。
使用宿主端口:容器端口
(HOST:CONTAINER)
格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。1
2
3
4
5ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"volumes
数据卷所挂载路径设置。可以设置为宿主机路径(
HOST:CONTAINER
)或者数据卷名称(VOLUME:CONTAINER
),并且可以设置访问模式 (HOST:CONTAINER:ro
)。1
2
3
4volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro如果路径为数据卷名称,必须在文件中配置数据卷。
1
2
3
4
5
6
7
8
9
10version: "3"
services:
my_src:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
- 标题: Docker 进阶篇之Compose
- 作者: Yaurora
- 创建于 : 2020-08-02 23:11:19
- 更新于 : 2020-08-09 13:49:57
- 链接: https://jingyu.life/2020/08/02/docker/compose/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。