docker-compopse.yml 版本和Docker兼容性表
详情请看官网文档
*配置项
-
version 定义了版本信息
-
services 定义了服务的配置信息
-
networks 定义了网络信息,提供给 services 中的 具体容器使用
-
volumes 定义了卷信息,提供给 services 中的 具体容器使用
示例:
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
result:
image: dockersamples/examplevotingapp_result:before
ports:
- "5001:80"
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
services配置指令
1. container_name
指定容器名称
version: "3"
services:
redis:
image: redis:alpine
container_name: redis_test
2. image
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
version: "3"
services:
redis:
image: redis:alpine
3. build
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
version: '3'
services:
webapp:
build: ./dir
也可以使用 context 指令指定 Dockerfile 所在文件夹的路径(或者是git仓库的URL)。同时使用 dockerfile 指令指定 Dockerfile 文件名。
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-name
注意:
如果同时指定了 image和 build, image 不在具有单独使用它的意义,而是指定了目前要构建的镜像的名称。 也就是说 Compose 会使用 build 指令中指定的 Dockerfile 构建的镜像,之后构建的镜像名称使用 image 中指定的名字 webapp:tag命名。
4. command
使用 command 可以覆盖容器启动后默认执行的命令。
#写成shell形式
command: bundle exec thin -p 3000
#写成Dockerfile中的exec格式
command: [bundle, exec, thin, -p, 3000]
5. depends_on
解决容器的依赖、启动先后的问题。
version: '3'
services:
web:
image: redis:alpine
container_name: redis_test
depends_on:
- db
6. environment
设置环境变量。可以使用数组或字典两种格式。
只给定名称的变量会自动获取运行 Compose 主机上的对应变量的信息。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
如果变量名称或者值中用到 true|false,yes|no 等表达 布尔 含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。这些特定词汇。
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
7. expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定容器内部的端口为参数
expose:
- "3000"
- "8000"
8. ports
映射端口信息。
宿主端口:容器端口 (即:HOST:CONTAINER) 的格式格式,或者仅仅指定容器的端口(宿主将会随机选择端口)。
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。
9. extra_hosts
类似 Docker 中的 --add-host 参数,指定额外的 host 名称映射信息。会在启动后的服务容器中 /etc/hosts 文件中添加host映射信息。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
10. networks
要加入的网络,使用* networks 定义下的条目 。
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:
11. entrypoint
指定服务容器启动后执行的入口文件。
12. user
指定容器中运行应用的用户名。
13. working_dir
指定容器中工作目录。
14. restart
指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境 中推荐配置为 always 或者 unless-stopped 。
restart: always
15. alias
网络上此服务的别名(备用主机名)。同一网络上的其他容器可以使用服务名称或此别名连接到其中一个服务的容器。
由于aliases是网络范围的,因此相同的服务可以在不同的网络上具有不同的别名。
注意:网络范围的别名可以由多个容器共享,甚至可以由多个服务共享。如果是,则无法保证名称解析为的容器。
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
volumes配置指令
数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加*问模式 (HOST:CONTAINER:ro)。
该指令中路径支持相对路径。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
volumes配置指令
1. 未显式声明网络环境的docker-compose.yml
使用docker-compose up启动容器后,这些容器都会被加入app_default网络中。使用docker network ls可以查看网络列表,docker network inspect 可以查看对应网络的配置。
version: '3'
services:
web:
mage: nginx:latest
container_name: web
depends_on:
- db
ports:
- "9090:80"
links:
- db
db:
image: mysql
container_name: db
2. networks关键字指定自定义网络
例如下面的docker-compose.yml文件,定义了front和back网络,实现了网络隔离。其中proxy和db之间只能通过app来实现通信。其中,custom-driver-1并不能直接使用,你应该替换为host, bridge, overlay等选项中的一种。
version: '3'
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"
3. 配置默认网络
version: '2'
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
networks:
default:
# Use a custom driver
driver: custom-driver-1
4. 使用已存在的网络
networks:
default:
external:
name: my-pre-existing-network