一 compose命令和模板说明

A. compse命令列表说明

每个命令后后还有很多参数,具体的请用--help去查看

命令名 参数说明
build 构建项目中的服务容器
images 列出所有镜像
kill 通过发送SIGKILL信号来强制停止服务容器
logs 查看服务器容器的输出
pause 暂停一个服务容器
port 打印某个容器的端口所映射的公共端口
ps 列出项目中目前的所有容器
pull 拉取服务依赖的镜像
push 推送服务依赖的镜像
restart 重启项目中的服务
rm 删除所有的服务器容器(停止状态的)
run 在指定服务上执行一个命令
scale 设置指定服务运行的容器个数
start 启动已经存在的服务容器
stop 停止已经处于运行状态的容器,但不删除它
top 展示运行的进程
unpause 恢复处于暂停状态中的服务
up 自动完成包括构建镜像、创建服务、启动服务并关联服务相关容器的一系列操作

B. Compose模板文件的说明

  1. compose模板文件官方文档
  2. compose模板文件有三个版本,现在用第三版
  3. 模板文件可以使用的扩展名为.yml或.yaml
  4. 模板文件使用的yaml语法,用空格缩进不支持tab缩进
    • 结构通过空格来表示缩进,推荐2个空格,不支持tab
    • 连续的项目通过减号-来表示,键值对用冒号:分割
    • 每个散列项(键值对k: v)冒号和值之间至少有一个空格
  5. 模板有4个顶级的配置项,顶级配置项包含非常多的子项:
    • version 定义版本信息
    • services 定义服务的配置信息,类似docker container create
    • networks 定义网络,给 给容器使用,类似docker network create
    • volumes 定义卷,给具体容器使用,类似docker volume create

定义卷和定义网络这两个顶级配置,定义的东西都是为了让容器可以用的

二 services普通选项说明

以下仅仅讨论常用的配置指令

A. container_name容器名

容器名默认将会使用(项目名称_服务名称_序号)的格式,如果使用container_name,可以指定该容器的名称.

1
2
3
4
version: '3'
services:
webapp:
container_name: web01

注意: 指定容器名称后,该服务将无法进行扩展(scale),因为Docker不允许多个容器具有相同的名称。

B. labels标签信息

为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。

1
2
3
4
5
6
7
version: '3'
services:
xxxapp:
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com.startupteam.release: "rc3 for v1.0"

C. command容器启动命令

使用 command 可以覆盖容器启动后默认执行的命令,支持shell和exec格式。

1
2
3
4
5
version: '3'
services:
xxxapp:
command: bundle exec thin -p 3000
command: [bundle, exec, thin, -p, 3000]

D. depends_on依赖关系

解决容器的依赖、启动先后的问题,注意不要弄错循环依赖了。

1
2
3
4
5
6
7
8
version: '3'
services:
web:
build: .
depends_on:
- db
db:
image: postgres

注意web服务不会等待db[完全启动]之后才启动。

E. environment和env_file环境变量

environment可设置环境变量,可以使用数组或字典两种格式。
如果只给定变量名不赋值,会自动获取运行 Compose 主机上对应变量的值

1
2
3
4
5
6
7
8
9
version: '3'
services:
xxxapp:
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET

如果变量名称或者值中用到 true|false| 等布尔含义的词汇,需要放到引号里,包括

    y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF

env_file可从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量

1
2
3
4
5
6
7
version: '3'
services:
xxxapp:
env_file: .env
---------------
env_file:
- ./common.env

F. expose和ports端口

  1. expose向容器暴露端口
    仅暴露端口,但不映射到宿主机,只被连接的服务访问,可以指定容器内部的端口为参数
1
2
3
4
5
6
version: '3'
services:
xxxapp:
expose:
- "3000"
- "8000"
  1. ports端口映射
    宿主端口:容器端口(即:HOST:CONTAINER)的格式格式,或者仅仅指定容器的端口(宿主将会随机选择端口)。
1
2
3
4
5
6
7
8
version: '3'
services:
xxxapp:
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"

数字串都采用引号包括起来的字符串格式。

G. extra_hosts主机名映射

类似 Docker 中的–add-host参数,指定额外的host名称映射信息。

1
2
3
4
5
6
version: '3'
services:
xxxapp:
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"

会在启动后的服务容器中/etc/hosts文件中添加IP地址与主机名的映射记录。

H. healthcheck健康检查

通过命令检查容器是否健康运行,需要设置测试的命令,间隔时间,超时时间,判断次数等

1
2
3
4
5
6
7
services:
......
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3

I. logging日志

配置日志选项,指定日志驱动和该驱动下可用的选项

1
2
3
4
5
6
7
8
9
version: "3.7"
services:
some-service:
image: some-service
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"

目前支持三种日志驱动类型。

1
2
3
driver: "json-file"
driver: "syslog"
driver: "none"

options 配置日志驱动的相关参数。

1
2
3
options:
max-size: "200k"
max-file: "10"
  1. dns:配置 dns 服务器,可以是一个值或列表
1
2
3
4
5
6
7
8
version: '3'
services:
xxxapp:
dns: 8.8.8.8
------------
dns:
- 8.8.8.8
- 9.9.9.9
  1. dns_search:配置 DNS 搜索域,可以是一个值或列表
1
2
3
4
5
6
7
8
version: '3'
services:
xxxapp:
dns_search: example.com
------------------------
dns_search:
- dc1.example.com
- dc2.example.com

四 build和image镜像设置

每个服务都必须要有 imagebuild 指令二者之一

A. 单独bulid指令

指定 Dockerfile 所在文件夹的绝对或相对路径。 Compose 将会利用它自动构建和使用这个镜像。类似于命令行的 docker build .

1
2
3
4
5
version: '3'
services:
xxxapp:
build: ./dir
[1-docker-compose快速入门](1-docker-compose%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8.md)

也可以使用 context 指令指定 Dockerfile 所在文件夹的路径,同时使用 dockerfile 指令指定 Dockerfile 文件名。

1
2
3
4
5
6
version: '3'
services:
xxxapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate

B. 单独image指令

指定为镜像名称或镜像 ID。如果镜像不存在将会尝试拉取这个镜像。

1
2
3
4
5
6
version: '3'
services:
xxxapp:
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd

C. 同时使用image和build

如果同时指定了 image和 build,Compose 会使用 build指令中指定的 Dockerfile构建的镜像,镜像名称使用 image中指定的名字webapp:tag命名。

1
2
3
4
5
version: '3'
services:
xxxapp:
build: ./dir
image: webapp:tag

五 volumes的配置说明

volumes可以直接使用目录挂载,也可以先创建volume卷,然后用卷名进行挂载,其实就是docker挂载目录,文件,容器管理卷等操作

A. 直接挂载目录

可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。
有长短两种格式,短格式就直接是源:目的,长格式需要写出每一项的属性

  1. 短格式示例
1
2
3
4
5
6
services:
xxxapp:
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
  1. 长格式示例
1
2
3
4
5
6
7
8
9
10
11
services:
xxxapp:
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static

B. 容器卷方式挂载

需要用顶级配置项volumes先创建卷,然后容器中直接使用卷名进行挂载,

1
2
3
4
5
6
7
8
volumes:
mysql:
services:
mysql:
image: mysql
container_name: mysql
volumes:
- mysql:/var/lib/mysql

C. 长格式的所有参数

  • type: 挂载的类型.有[volume|bind|tmpfs]
  • source: 挂载的源、目录或卷名-file/#volume-configuration-reference). Not applicable for a tmpfs mount.
  • target: 挂载到容器中的目的地
  • read_only: 设置为只读
  • bind: 配置附加的绑定选项
    • propagation: 绑定使用的传播模式
  • volume: 配置附加的卷选项
    • nocopy: 创建卷时禁用从容器复制数据
  • tmpfs: 配置附加的tmpfs选项
    • size: tmpfs挂载的大小

D. 顶级配置项中的volumes

volumes不仅可以是容器卷,也支持通过driver插件的方法支持其他类型的存储

  1. driver_opts指定其他类型存储
1
2
3
4
5
6
7
8
services:
xxxapp:
volumes:
example:
driver_opts:
type: "nfs"
o: "addr=10.40.0.199,nolock,soft,rw"
device: ":/docker/example"
  1. external设置扩展信息
    默认compose会创建卷data,但如果指定该参数为true,则只会寻找已有的data卷来使用,而不会创建
1
2
3
4
5
services:
xxxapp:
volumes:
data:
external: true
  1. labels和name
    labels设置卷的元数据信息(标签),name设置源的指定名字,而不让卷被compose自动命名
1
2
3
4
5
6
7
8
version: "3.7"
volumes:
data:
external: true
name: my-app-data
labels:
- "com.example.description=Database volume"
- "com.example.department=IT/Ops"

六 networks网络配置

设置要加入的网络,需要使用顶级networks 定义下的条目 。

A. service中的networds

1
2
3
4
5
6
7
8
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:
  1. 网络的alias别名
    设置此服务的别名(备用主机名)。同一网络上的其他容器可以使用此别名连接容器。
    由于aliases是网络范围的,因此相同的服务可以在不同的网络上具有不同的别名。
1
2
3
4
5
6
7
8
9
10
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
  1. 指定IP地址
    默认都是自动分配的ip地址,但也可以手动指定,但顶级网络配置部分中对应的网络配置必须有一个ipam块才行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: "3.7"
services:
app:
image: nginx:alpine
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
networks:
app_net:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
- subnet: "2001:3984:3989::/64"

B. 顶级模块中的networks

  1. driver网络驱动
    与docker引擎配置有关,默认情况下单机是bridge,多机是overlay,当然还支持其他网络(如host,none等),差异很大,略过
1
2
3
networks:
mynet1:
driver: overlay
  1. driver_opts传输参数
    给对应的驱动传输相应的参数,驱动不同参数差异很大,简单举例
1
2
3
4
5
networks:
mynet1:
driver_opts:
foo: "bar"
baz: 1
  1. attachable是否允许附加
    当网络为overlay是才能用,用途是允许该网络被此项目外的其他独立容器使用
1
2
3
4
networks:
mynet1:
driver: overlay
attachable: true
  1. ipam配置IP地址信息
1
2
3
4
5
6
networks:
mynet1:
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
  1. name和external
    name设置网络名,external设置使用已创建好的网络,而不是自己创建
1
2
3
4
5
version: "3.7"
networks:
network1:
external: true
name: my-app-net

八 关于容器的限制的参数

A. sysctls内核参数控制

配置容器内核参数。

1
2
3
4
5
6
7
8
services:
some-service:
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0

B. ulimits进程和句柄数控制

指定容器的 ulimits 限制值。
例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)。

1
2
3
4
5
6
7
services:
some-service:
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000