Docker Compose
是定义和运行多个 Docker 容器的应用。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)
两个术语
服务 (service
):一个应用容器,实际上可以运行多个相同镜像的实例。
项目 (project
):由一组关联的应用容器组成的一个完整业务单元。
Docker Compose 模板文件常用指令
默认的模板文件名称为 docker-compose.yml
,格式为 YAML 格式。注意每个服务都必须通过 image
指令指定镜像或 build
指令(需要 Dockerfile)等来自动构建生成镜像。
如果使用 build
指令,在 Dockerfile
中设置的选项(例如:CMD
, EXPOSE
, VOLUME
, ENV
等) 将会自动被获取,无需在 docker-compose.yml
中重复设置。
1 | # docker compose的版本 |
build
Compose file build reference (docker.com)
指定 Dockerfile
所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。会使用这个Dockerfile
来生成镜像
1 | version: "3" |
build
指定的路径里面默认的Dockerfile
的名字就是Dockerfile
context、dockerfile
可以使用 context
指令指定 Dockerfile
所在文件夹的路径。
使用 dockerfile
指令指定 Dockerfile
文件名。
1 | version: "3" |
arg
指令指定构建镜像时的变量,就是在Dockerfile
中定义的
command
覆盖容器启动后默认执行的命令(也就是在dockerFile中定义的CMD
指令)
如果值设置为 null
,就会以镜像中的为准,如果值为[]
或者''
,就会覆盖镜像中的并设置为空
container_name
指定容器的名称,默认将会使用 项目名称_服务名称_序号
这样的格式
注意: 指定容器名称后,该服务将无法进行扩展(scale),因为 Docker 不允许多个容器具有相同的名称
depends_on
声明依赖关系,白话意思就是要启动现在这个服务要先启动谁
1 | version: "3" |
瞎写的,举例一下用法
dns
自定义 DNS
服务器。可以是一个值,也可以是一个列表。
1 | dns: 8.8.8.8 |
dns_search
配置 DNS
搜索域。可以是一个值,也可以是一个列表。
1 | dns_search: example.com |
entrypoint
指定服务容器启动后执行的入口文件,这个会覆盖在DockerFile
中ENTRYPOINT
指令所设置的
env_file
从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过 docker-compose -f FILE
方式来指定 Compose 模板文件,则 env_file
中变量的路径会基于模板文件路径。
如果有变量名称与 environment
指令冲突,则按照惯例,以后者为准。
1 | env_file: .env |
环境变量文件中每一行必须符合格式,支持 #
开头的注释行。
1 | # common.env: Set development environment |
environment
设置环境变量。你可以使用数组或字典两种格式。
有两种设置方式:
1 | environment: |
env_file 和 environment 同时设置,environment 设置的优先
extra_hosts
类似 Docker 中的 --add-host
参数,指定额外的 host 名称映射信息。
1 | extra_hosts: |
会在启动后的服务容器中 /etc/hosts
文件中添加如下两条条目。
1 | 8.8.8.8 googledns |
image
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose
将会尝试拉取这个镜像。
labels
为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。
links
链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS)
格式都可以。
1 | links: |
ports
暴露端口信息。
使用宿主端口:容器端口 (HOST:CONTAINER)
格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
1 | ports: |
volumes
数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER
)或者数据卷名称(VOLUME:CONTAINER
),并且可以设置访问模式 (HOST:CONTAINER:ro
)。
该指令中路径支持相对路径。
1 | volumes: |