Docker Compose 常用配置指令详解【三】
1. version
指定本yml从compose那个版本制定的。
Compose目前有三个版本分别为Version1,Version2,Version3,Compose区分Version1、Version2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用。
2. image
image是指定服务的镜像名称或镜像ID,如果镜像本地不存在,Compose将会尝试从仓库中拉取镜像。
services:
web:
image: hello-world
3. build
服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用up启动时执行构建任务,构建标签是build,可以指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器。
#绝对路径
build: /path/to/build/dir
#相对路径
build: ./dir
#对象
build:
context: ./dir
dockerfile: Dockerfile
args:
buildno: 1
注:如果同时指定image和build俩个标签,那么Compose会构建镜像并且把镜像命名为image值指定的名字。
4. commond
使用command可以覆盖容器启动后默认执行的命令。
command: bundle exec thin -p 3000
或
command: [bundle,exec,thin,-p,3000]
5. 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
6. container_name
指定自定义容器名称,而不是生成的默认名称。
container_name: my-web-container
7. depends_on
设置服务之间的依赖关系。
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
上面yml文件中定义的容器会先启动redis和db俩个服务,最后才启动web服务。但是web服务不会等待redis、db完全启动之后才启动,一旦redis、db的状态为up就开始启动web。
8. port
用于映射端口的标签。
ports:
- "3000" #宿主机随机映射的端口到容器的3000端口
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001
注:
当使用HOST:CONTAINER格式来映射端口时,如果使用的容器端口小于60可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。
9. port
添加主机名的标签,会在/etc/hosts文件中添加一些记录。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
10. volumes
挂载一个目录或者一个已存在的数据卷容器。
volumes:
- /var/lib/mysql #匿名数据卷,会在宿主机中随机创建一个目录。
- /opt/data:/var/lib/mysql #使用绝对路径挂载数据卷(宿主机:容器)
- ./cache:/tmp/cache #相对于Compose配置文件路径作为数据挂载卷挂载到容器。
- ~/configs:/etc/configs/:rw #使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
- datavolume:/var/lib/mysql #已经存在的命名的数据卷。
11. volumes_from
从另一个服务或容器挂载其数据卷。
volumes_from:
- service_name
- container_name
12. dns
自定义DNS服务器。可以是一个值,也可以是一个列表。
dns:8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
13. expose
暴露端口,但不映射到宿主机,只被连接的服务访问,与Dockerfile中expose 对应。
expose:
- "3000"
- "8000"
14. port
对外暴露的端口定义。
ports: # 暴露端口信息 - "宿主机端口:容器暴露端口"
- "8763:8763"
- "8763:8763"
15. links
将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况。
links: # 指定服务名称:别名
- db
- db:database
- redis
16. network_mode
设置网络模式。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
17. environment
环境变量配置,可以用数组或字典两种方式。
environment:
RACK_ENV: development
SHOW: 'ture'
-------------------------
environment:
- RACK_ENV=development
- SHOW=ture
18. env_file
从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量。
env_file: .env
---------------
env_file:
- ./common.env
19. restart
设置重启的策略
- no:是默认的重启策略,在任何情况下都不会重启容器。
- always:容器总是重新启动。
- on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
- unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
注:
swarm 集群模式,请改用 restart_policy。
20 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
21. Docker-Compose模板文件示例
version: '3'
services:
web1:
image: nginx
ports:
- "6061:80"
container_name: "web1"
networks:
- dev
web2:
image: nginx
ports:
- "6062:80"
container_name: "web2"
networks:
- dev
- pro
web3:
image: nginx
ports:
- "6063:80"
container_name: "web3"
networks:
- pro
networks:
dev:
driver: bridge
pro:
driver: bridge