本文主要列举docker-compose的服务配置文件docker-compose.yml的常规配置项
详细说明参考官方网址:Compose file version 3 reference | Docker Documentation
注意:以下配置项均需遵守yaml格式
yaml格式常见注意事项如下:
- 不支持制表符tab键缩进,需要使用空格缩进
- 通常开头缩进2个空格
- 字符后缩进1个空格,
常用配置
build
# 构建镜像上下文路径
#加载dir目录下的dockerfile,编译构建服务镜像
services:
web:
build: ./dir
services:
web:
build:
context: ./dir //上下文根目录,即项目构建路径
dockerfile: Dockerfile-alternate //指定编译的dockerfile
args: //编译入参,在Dockerfile中指定的参数
buildno: 1
image
# 构建服务用的镜像
services:
redis_service:
image: redis
command
# 覆盖容器启动后默认执行的命令, 支持 shell 格式和 [] 格式
services:
web:
command: cat /test.env
command: ["cat","/test.env"]
container_name
#自定义容器名称
services:
web:
container_name: my-web-container
deploy
# 指定与部署和运行相关的配置。限版本3,deploy 部分是 docker stack 使用的, docker stack 依赖 docker swarm
version: '3'
services:
redis:
image: redis:alpine
deploy:
replicas: 6
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
depend_on
# 服务之间的依赖,控制服务启动顺序。正常是按顺序启动服务,依赖的服务优先启动,但不会等到依赖的服务启动完成再启动,而是依赖服务一启动,就立马启动当前服务
#web服务依赖redis和db,优先启动redis和db,然后启动web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
dns
# 自定义DNS服务器,可以是单个值或列表
#支持单个值或列表
services:
web:
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
entrypoint
# 覆盖容器的默认 entrypoint 指令 (等同于 docker run --entrypoint 的作用),即覆盖dockerfile中的entrypoint指令
services:
web:
entrypoint: /code/entrypoint.sh
entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]
env_file
# 从指定文件添加环境变量,会将文件中的变量添加到服务中的environment配置项中,可以是单个值或列表
services:
web:
env_file:
- ./common.env
- ./apps/web.env
- /opt/runtime_opts.env
#效果同
services:
web:
environment:
- common_key:common_value
- env_key:env_value
注意:如果指定添加的多个文件中,存在相同的属性变量,则后者覆盖前者
environment
# 添加环境变量,可以是数组或字典。布尔值用引号括起来,该环境变量提供给容器中的服务使用
services:
web:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
expose
# 声明容器服务端口
services:
web:
expose:
- "3000"
- "8000"
注意:和ports的区别是ports会构建主机和容器之间的端口的映射关系,而expose不会将端口暴露给主机,主机无法访问expose的端口,expose暴露的端口是提供给处于同一个容器网络平台的其他服务容器访问的(即同一编排文件中定义的服务)
links
# 连接到另一个容器,同depend_on相似,但links是version-2中使用的,当 docker-compose
执行 V2 文件时会自动在容器间创建一个网络,每一个容器都能够立即通过名字来访问到另外的容器。 因此,不再需要 links
services:
web:
links:
- db
- db:database
- redis
external_links
# 连接Compose之外的容器(非通过当前docker-compose.yml构建的服务容器),特别是对于提供共享或公共服务的容器,需遵循以下格式:CONTAINER:ALIAS
services:
web:
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
extra_hosts
# 添加主机名映射,其会在容器中的/etc/hosts文件中创建主机名和ip的映射关系
services:
web:
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
network_mode
# 网络模式,同docker客户端--network 的参数一致,包含(host,none,bridge和container模式)
services:
web:
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
networks
# 要加入的网络。可以通过加入自定义网络,隔离开同一compose构建的服务
#proxy和db之间的网络是相互隔离的,但app可以同时访问两个服务
services:
proxy:
build: ./proxy
networks:
- front
app:
build: ./app
networks:
- front
- back
db:
image: postgres
networks:
- back
networks:
front:
# Use a custom driver
driver: custom-driver-1
back:
# Use a custom driver which takes special options
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2"
alias
# 网络上此服务的别名(备用主机名),即同一服务在不同的网络上可以存在多个不同的别名
# 在网络new方面,可以通过db或database访问到db容器;在legacy网络,可以通过db或mysql访问到db容器
version: "3.9"
services:
web:
image: "nginx:alpine"
networks:
- new
worker:
image: "my-worker-image:latest"
networks:
- legacy
db:
image: mysql
networks:
new:
aliases:
- database
legacy:
aliases:
- mysql
networks:
new:
legacy:
ipv4_address,ipv6_address
# 加入网络时,为此服务的容器指定静态 IP 地址。
# 指定当前容器处于app_net网桥上分配的ip为172.16.238.10,必须处于配置的子网网段
version: "3.9"
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"
pid
# 将PID模式设置为主机PID模式。这将打开容器和主机操作系统之间的PID地址空间共享,即容器和宿主机系统之间可以通过进程 ID 来相互访问和操作。
services:
web:
pid: "host"
ports
# 暴露端口,与-p相同。但端口不低于60(端口映射不兼容network_mode: host
)
#短语法
ports:
- "3000" //主机会随机开启一个端口和容器3000端口进行映射
- "3000-3005" //主机随机开启几个端口和容器3000-3005端口进行映射
- "8000:8000" //主机8000端口映射容器8000端口
- "9090-9091:8080-8081" //主机9090-9091端口映射容器8080-8081
- "127.0.0.1:8001:8001" //主机127.0.0.1:8001端口进入的流量分配到容器的8001端口
- "127.0.0.1:5000-5010:5000-5010" //主机127.0.0.1:5000-5001端口进入的流量分配到容器5000-5001端口
- "6060:6060/udp" //主机6060端口映射容器udp连接端口6060
#长语法,version-3.2开始启用
ports:
- target: 80 //容器内的端口
published: 8080 //主机端口
protocol: tcp //端口协议(tcp,udp)
mode: host
profiles
# 配置规划要启用的一系列服务
version: "3.9"
services:
frontend:
image: frontend
profiles: ["frontend"]
phpmyadmin:
image: phpmyadmin
depends_on:
- db
profiles:
- debug
backend:
image: backend
db:
image: mysql
在这里,服务frontend
和phpmyadmin
被分配给配置文件 frontend
,并且debug
仅在启用它们各自的配置文件时才启动。
没有profiles
属性的服务将始终启用,即在这种情况下运行docker-compose up
只会启动backend
和db
。
通过docker-compose --profile frontend up 会启动frontend、backend和db
通过docker-compose --profile debug up会启动phpmyadmin、backend和db
sysctls
# 在容器内设置内核参数,可以是数组或字典
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
ulimits
# 覆盖容器的默认ulimits
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
volumes
# 挂载一个目录或一个已存在的数据卷容器到容器
version: "3.9"
services:
#数据卷长语法
web:
image: nginx:alpine
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static
#数据卷短语法
db:
image: postgres:latest
volumes:
- "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
- "dbdata:/var/lib/postgresql/data"
volumes:
mydata:
dbdata:
短语法:
volumes:
# Just specify a path and let the Engine create a volume
- /var/lib/mysql
# Specify an absolute path mapping
- /opt/data:/var/lib/mysql
# Path on the host, relative to the Compose file
- ./cache:/tmp/cache
# User-relative path
- ~/configs:/etc/configs/:ro
# Named volume
- datavolume:/var/lib/mysql
长语法:(version-3.2开始加入)
长格式语法允许配置无法以短格式表示的附加字段。
type
: 挂载类型volume
,bind
,tmpfs
或npipe
source
: 挂载的来源,主机上用于绑定挂载的路径,或者在 顶级volumeskey中定义的卷的名称。不适用于 tmpfs 挂载。target
: 容器中安装卷的路径read_only
: 将卷设置为只读的标志bind
: 配置额外的绑定选项propagation
:用于绑定的传播模式
volume
:配置额外的volume选项nocopy
: 创建卷时禁止从容器复制数据的标志
tmpfs
: 配置额外的 tmpfs 选项size
: tmpfs 挂载的大小(以字节为单位)
version: "3.9"
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static
networks:
webnet:
volumes:
mydata:
restart
# 默 认 no , 主要包含几种模式:always|onfailure|unless-stopped
always:
容器总是重新启动on-failure:
如果故障退出,则重启unless-stopped:
总是重新启动容器,除非容器停止(手动或其他方式)
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir
# 其中每一个值,都类似于它的 docker run对应项。请注意,这mac_address
是一个旧选项。
user: postgresql
working_dir: /code
domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43
privileged: true
read_only: true
shm_size: 64M
stdin_open: true
tty: true