docker-compose中的配置命令很多都是Dockerfile中的命令,不过需要遵循yml的文件格式。下面讲解yml配置是针对单服务器的容器管理,如果是集群模式配置会稍微有些不同。
version
指定本 yml 依从的 compose 哪个版本制定的。
build
指定为构建镜像上下文路径:
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
version: "3.7"
services:
webapp:
build: ./dir
或者,作为具有在上下文指定的路径的对象,以及可选的参数 Dockerfile 和 args等:
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
- context:上下文路径。
- dockerfile:指定构建镜像的 Dockerfile 文件名。
- args:添加构建参数,这是只能在构建过程中访问的环境变量。
- labels:设置构建镜像的标签。
image
指定容器从哪个镜像运行启动。以下格式都可以:
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # 镜像id
container_name
自定义运行后容器名称,而不是生成的默认名称。
container_name: my-web-container
volumes
将主机的数据卷或着文件挂载到容器里。
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"
command
覆盖容器启动的默认命令。
command: ["bundle", "exec", "thin", "-p", "3000"]
entrypoint
覆盖容器默认的 entrypoint。
entrypoint: /code/entrypoint.sh
也可以是以下格式:
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
depends_on
设置依赖关系。
- docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。注意:web 服务不会等待 redis、db 完全启动 之后才启动。
- docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
- docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
restart
- no:是默认的重启策略,在任何情况下都不会重启容器。
- always:容器总是重新启动。
- on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
- unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
expose
暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数:
expose:
- "3000"
- "8000"
environment和env_file
environment添加环境变量。可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
environment:
RACK_ENV: ${development} #可以从环境中读取环境变量
SHOW: 'true'
env_file: docker compose 对环境变量的使用提供了非常丰富支持和灵活的使用方式。可以从文件添加环境变量,默认从当前下的。可以是单个值或列表的多个值。
env_file: .env
也可以是列表格式:
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
前面的的一些命令相对比较常用,下面给出一个具体的yml文件配置示例:
version: '3'
services:
my-search:
build:
context: .
container_name: my-search
image: my_search:v1
depends_on:
- elasticsearch
ports:
- 8500:8500/tcp
environment:
- MySQL_CASE_HOST=10.201.187.225
- MySQL_CASE_PORT=123456
- MySQL_CASE_USER=root
- MySQL_CASE_PASSWD=screte
- DEFAULT_CASE_DATABASE=gov_init_1
- CASE_TYPE=kingbase # 如果mysql数据TPYE改成mysql
restart: always
command: python start_service.py
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
container_name: "elasticsearch"
ports:
- 9200:9200
- 9300:9300
environment:
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
- cluster.name=hanscal-es
- bootstrap.memory_lock=true
- discovery.type=single-node
volumes:
- ./data/elasticsearch/data:/usr/share/elasticsearch/data
- ./data/elasticsearch/logs:/usr/share/elasticsearch/logs
- ./data/elasticsearch/plugins/ik:/usr/share/elasticsearch/plugins/ik
kibana:
image: docker.elastic.co/kibana/kibana:7.6.2
container_name: kibana
depends_on:
- elasticsearch
ports:
- 5601:5601
volumes:
- ./config/kibana.yml:/usr/share/kibana/config/kibana.yml
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
links:
- elasticsearch
下面的命令使用频率稍微低一点。
networks和network_mode
networks配置容器连接的网络,引用顶级 networks 下的条目 。
services:
some-service:
networks:
some-network:
aliases:
- alias1
other-network:
aliases:
- alias2
networks:
some-network:
# Use a custom driver
driver: custom-driver-1
other-network:
# Use a custom driver which takes special options
driver: custom-driver-2
network_mode设置网络模式。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
healthcheck
用于检测 docker 服务是否健康运行。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序
interval: 1m30s # 设置检测间隔
timeout: 10s # 设置检测超时时间
retries: 3 # 设置重试次数
start_period: 40s # 启动后,多少秒开始启动检测程序
secrets
存储敏感数据,例如密码:
version: "3.1"
services:
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret.txt
aliases
同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
extra_hosts
添加主机名映射。类似 docker client --add-host。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:
162.242.195.82 somehost
50.31.209.229 otherhost
logging
服务的日志记录配置。
driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项
driver: "json-file"
driver: "syslog"
driver: "none"
在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。当达到文件限制上限,会自动删除旧得文件。
logging:
driver: json-file
options:
max-size: "200k" # 单个文件大小为200k
max-file: "10" # 最多10个文件
syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"