Docker Compose 模版文件
hanpy

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
2
3
4
5
6
7
8
9
10
11
12
13
14
# docker compose的版本
version: "3"
# 服务列表
services:
# 服务的名称是 webapp
webapp:
# 使用的惊喜那个是 examples/web
image: examples/web
# 映射的端口
ports:
- "80:80"
# 挂载的目录
volumes:
- "/data"

build

Compose file build reference (docker.com)

指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。会使用这个Dockerfile来生成镜像

1
2
3
4
5
version: "3"

services:
nginx:
build: ./nginx

build指定的路径里面默认的Dockerfile的名字就是Dockerfile

context、dockerfile

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

1
2
3
4
5
6
7
version: "3"

services:
nginx:
build:
context: ./nginx
dockerfile: Dockerfile-nginx

arg

指令指定构建镜像时的变量,就是在Dockerfile中定义的

command

覆盖容器启动后默认执行的命令(也就是在dockerFile中定义的CMD指令)

如果值设置为 null,就会以镜像中的为准,如果值为[]或者'',就会覆盖镜像中的并设置为空

container_name

指定容器的名称,默认将会使用 项目名称_服务名称_序号 这样的格式

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

depends_on

声明依赖关系,白话意思就是要启动现在这个服务要先启动谁

1
2
3
4
5
6
7
8
9
10
11
version: "3"

services:
nginx:
build:
context: ./nginx
dockerfile: DockerFile-nginx
container_name: hanpy_nginx
depends_on:
- redis
- php

瞎写的,举例一下用法

dns

自定义 DNS 服务器。可以是一个值,也可以是一个列表。

1
2
3
4
5
dns: 8.8.8.8

dns:
- 8.8.8.8
- 114.114.114.114

配置 DNS 搜索域。可以是一个值,也可以是一个列表。

1
2
3
4
5
dns_search: example.com

dns_search:
- domain1.example.com
- domain2.example.com

entrypoint

指定服务容器启动后执行的入口文件,这个会覆盖在DockerFileENTRYPOINT指令所设置的

env_file

从文件中获取环境变量,可以为单独的文件路径或列表。

如果通过 docker-compose -f FILE 方式来指定 Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径。

如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。

1
2
3
4
5
6
env_file: .env

env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env

环境变量文件中每一行必须符合格式,支持 # 开头的注释行。

1
2
# common.env: Set development environment
PROG_ENV=development

environment

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

有两种设置方式:

1
2
3
4
5
6
7
8
9
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:

environment:
- RACK_ENV=development
- SHOW=true
- USER_INPUT

env_fileenvironment 同时设置,environment 设置的优先

extra_hosts

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

1
2
3
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"

会在启动后的服务容器中 /etc/hosts 文件中添加如下两条条目。

1
2
8.8.8.8 googledns
52.1.157.61 dockerhub

image

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

labels

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

链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以。

1
2
3
4
links:
- db
- db:database
- redis

ports

暴露端口信息。

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

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

volumes

数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式 (HOST:CONTAINER:ro)。

该指令中路径支持相对路径。

1
2
3
4
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro