docker-compose详解

固定容器

compose会查找之前的容器,把旧容器的volume-data拷贝到容器中。除非手动用docker rm命令删除容器,否则CONTAINER ID不会发生改变。

版本

Compose file format Docker Engine
1 1.9.0+
2.0 1.10.0+
2.1 1.12.0+
2.2, 3.0, 3.1, 3.2 1.13.0+
2.3, 3.3, 3.4, 3.5 17.06.0+
2.4 17.12.0+
3.6 18.02.0+
3.7 18.06.0+

文件结构说明

根节点

  • version 定义了版本信息
  • services 定义了服务的配置信息
  • networks 定义了网络信息,提供给 services 中的 具体容器使用
  • volumes 定义了卷信息,提供给 services 中的 具体容器使用
  1. services 的定义包含应用于为该服务启动的每个容器的配置,非常类似于将命令行的 docker container create
  2. networks 的定义类似于命令行的 docker network create
  3. volumes 的定义类似于命令行的 docker volume create

顶级配置

container_name

指定容器名称。Compose 的容器默认名称格式是:<项目名称><服务名称><序号>

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

labels

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

1
2
3
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"

构建时应用的配置选项

注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像

如果使用 build 指令,那么在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中再次设置

build

指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

类似于命令行的 docker build .

1
2
3
4
version: '3'
services:
webapp:
build: .
context

指定 Dockerfile 所在文件夹的路径

dockerfile

指定 Dockerfile 文件名

args

类似Dockerfile 中的 ARG 指令,它可以在构建过程中指定环境变量,但是在构建成功后消失

context

指定 Dockerfile 所在文件夹的路径

一个build配置的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '3'
services:
serviceXXX:
build:
context: ./config
dockerfile: My_Dockerfile
args:
buildno: 1
password: secret
#一般下面这种写法
- buildno=1
- password=secret
#与env不同,arg允许空值
- buildno

image

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

如果同时指定了 image和 build,, image 不在具有单独使用它的意义,而是指定了目前要构建的镜像的名称。 也就是说 Compose 构建的镜像则使用 image 中指定的名字webapp:tag命名

command

使用 command 可以覆盖容器启动后默认执行的命令

command: bundle exec thin -p 3000

也可以写成类似 Dockerfile 中的格式:

command: [bundle, exec, thin, -p, 3000]

depends_on

解决容器的依赖、启动先后的问题。以下例子中会先启动 redis db 再启动 web

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

注意:web 服务不会等待redis和db完全启动之后才启动,它是容器启动后就启动,里面的服务有可能还没有起来。

解决办法:
一个方面是在连接层面使用自动重连策略,比如mysql jdbc可以有auto reconnect自动重连参数。或者使用下面建议的用一个脚本(wait-for-it.sh)来探测依赖服务已经完全准备好,或者自己编写一个health check脚本来检测依赖服务的健康状况来判断依赖服务是否启动完成。

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# wait-for-postgres.sh
set -e
host="$1"
shift
cmd="$@"
until psql -h "$host" -U "postgres" -c '\q'; do
>&2 echo "Postgres is unavailable - sleeping"
sleep 1
done
>&2 echo "Postgres is up - executing command"
exec $cmd

command: [“./wait-for-postgres.sh”, “db”, “python”, “app.py”]
注意如果你使用wait-for-it.sh脚本,如果你的基础镜像不包含bash命令(比如alpine镜像)需要安装bash,不然没法执行wait-for-it.sh脚本导致容器启动失败。

如果Dockerfile的基础镜像用的是alpine相关的基础镜像的话,记得添加如下指令安装bash:

1
2
3
RUN apk update
RUN apk upgrade
RUN apk add --no-cache bash

environment

设置环境变量。你可以使用数组或字典两种格式。

只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。

1
2
3
4
5
6
7
8
version: '3.5'
services:
tomcat_idocv_veiw_rjy:
image: XXX
environment:
- VIRTUAL_HOST=tomcat_idocv_veiw_rjy
- VIRTUAL_PORT=8080
- VIRTUAL_NAME=nginx_idocv_veiw_rjy

YAML中如果变量名称或者值中用到 true|false,yes|no 等表达布尔 含义的词汇,最好放到引号(单双均可)里,避免 YML 自动解析某些内容为对应的布尔语义。这些特定词汇,包括

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

expose

暴露端口,但不映射到宿主机,只被连接的服务访问。

仅可以指定容器内部的端口为参数

1
2
3
expose:
- "3000"
- "8000"

ports

暴露端口信息

使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以

1
2
3
4
5
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"

注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式

expose

暴露端口,但不映射到宿主机,只被连接的服务访问。暴露给连接的服务,而不暴露给主机

1
2
3
expose:
- "3000"
- "8000"

env_file

从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量
如果在配置文件中有build操作,变量并不会进入构建过程中。

1
2
3
4
env_file: .env
---------------
env_file:
- ./common.env

将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况

1
2
links:    # 指定服务名称:别名 
- docker-compose-eureka-server:compose-eureka

volumes卷挂载路径

设置网络模式

1
2
3
volumes:
- /lib
- /var

dns

配置 dns 服务器,可以是一个值或列表

1
2
3
4
5
dns: 8.8.8.8
------------
dns:
- 8.8.8.8
- 9.9.9.9

extra_hosts

添加主机名的标签,会在/etc/hosts文件中添加一些记录。

1
2
3
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"

volumes_from

从另一个服务或容器挂载其数据卷

1
2
3
volumes_from:
- service_name
- container_name

entrypoint

在Dockerfile中有一个指令叫做ENTRYPOINT指令,用于指定接入点。
在docker-compose.yml中可以定义接入点,覆盖Dockerfile中的定义:
entrypoint: /code/entrypoint.sh

cap_add

增加指定容器的内核能力(capacity)。
让容器具有所有能力可以指定

1
2
cap_add:
- ALL

cap_drop

去掉指定容器的内核能力(capacity)。
去掉NET_ADMIN能力可以指定:

1
2
cap_drop:
- NET_ADMIN

cgroup_parent

创建了一个cgroup组名称为cgroups_1:
cgroup_parent: cgroups_1

devices

指定设备映射关系,例如:

1
2
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"

extends

基于其它模板文件进行扩展。例如,对于webapp服务定义了一个基础模板文件为common.yml

1
2
3
4
5
6
# common.yml
webapp:
build: ./webapp
environment:
- DEBUG=false
- SEND_EMAILS=false

再编写一个新的development.yml文件,使用common.yml中的webapp服务进行扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
# development.yml
web:
extends:
file: common.yml
service: webapp
ports:
- "8000:8000"
links:
- db
environment:
- DEBUG=true
db:
image: mysql

后者会自动继承common.yml中的webapp服务及环境变量定义。
extends限制如下:
A、要避免出现循环依赖
B、extends不会继承links和volumes_from中定义的容器和数据卷资源
推荐在基础模板中只定义一些可以共享的镜像和环境变量,在扩展模板中具体指定应用变量、链接、数据卷等信息

链接到docker-compose.yml外部的容器,可以是非Compose管理的外部容器。

1
2
3
4
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql

labels

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

1
2
labels:
com.startupteam.description: "webapp for a strtup team"

log_driver

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

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

log_opt

日志驱动的相关参数

1
2
log_driver: "syslog"log_opt: 
syslog-address: "tcp://192.168.0.42:123"

network_mode

设置网络模式

1
2
3
4
5
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

net

设置网络模式

1
2
3
net: "bridge"
net: "none"
net: "host"

security_opt

指定容器模板标签(label)机制的默认属性(用户、角色、类型、级别等)。例如,配置标签的用户名和角色名

1
2
3
security_opt:
- label:user:USER
- label:role:ROLE

环境变量

环境变量可以用来配置Docker-Compose的行为。
COMPOSE_PROJECT_NAME
设置通过Compose启动的每一个容器前添加的项目名称,默认是当前工作目录的名字。
COMPOSE_FILE
设置docker-compose.yml模板文件的路径。默认路径是当前工作目录。
DOCKER_HOST
设置Docker daemon的地址。默认使用unix:///var/run/docker.sock。 DOCKER_TLS_VERIFY
如果设置不为空,则与Docker daemon交互通过TLS进行。
DOCKER_CERT_PATH
配置TLS通信所需要的验证(ca.pem、cert.pem 和 key.pem)文件的路径,默认是 ~/.docker

指令部分整理自以下网友,感谢

https://www.jianshu.com/p/ba77c7bdf03e

https://www.jianshu.com/p/7d1fe36ba45c

https://blog.51cto.com/9291927/2310444



- - - - - - 本文结束 感谢您的阅读 - - - - - -
觉得文章不错?请我喝杯奶茶吧~蓝莓味~
0%