-
2021-12-12 11:20:25
Docker-Compose允许用户通过一个docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose模板文件是一个定义服务、网络和卷的YAML文件。Compose模板文件默认路径是当前目录下的docker-compose.yml,可以使用.yml或.yaml作为文件扩展名。
Docker-Compose标准模板文件应该包含version、services、networks三大部分,最关键的是services和networks两个部分。
参考官网:https://github.com/compose-spec/compose-spec/blob/master/spec.md
举例:
version: '2' services: web: image: dockercloud/hello-world ports: - 8080 networks: - front-tier - back-tier redis: image: redis links: - web networks: - back-tier lb: image: dockercloud/haproxy ports: - 80:80 links: - web networks: - front-tier - back-tier volumes: - /var/run/docker.sock:/var/run/docker.sock networks: front-tier: driver: bridge back-tier: driver: bridge
version
Compose目前有三个版本分别为Version 1,Version 2,Version 3,Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用。
image
image是指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。
services: web: image: dockercloud/hello-world
build
服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用up启动时执行构建任务,构建标签是build,可以指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器。
build: /path/to/build/dir
也可以是相对路径,只要上下文确定就可以读取到Dockerfile。
build: ./dir
设定上下文根目录,然后以该目录为准指定Dockerfile。
build: context: ../ dockerfile: path/of/Dockerfile
build都是一个目录,如果要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定。如果同时指定image和build两个标签,那么Compose会构建镜像并且把镜像命名为image值指定的名字。
context
context选项可以是Dockerfile的文件路径,也可以是到链接到git仓库的url,当提供的值是相对路径时,被解析为相对于撰写文件的路径,此目录也是发送到Docker守护进程的context
build: context: ./dir
dockerfile
使用dockerfile文件来构建,必须指定构建路径
build: context: . dockerfile: Dockerfile-alternate
command
使用command可以覆盖容器启动后默认执行的命令。
command: bundle exec thin -p 3000
container_name
Compose的容器名称格式是:<项目名称><服务名称><序号>
可以自定义项目名称、服务名称,但如果想完全控制容器的命名,可以使用标签指定:
container_name: app
depends_on
在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题:
version: '2' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
上述YAML文件定义的容器会先启动redis和db两个服务,最后才启动web服务。
PID
pid: "host"
将PID模式设置为主机PID模式,跟主机系统共享进程命名空间。容器使用pid标签将能够访问和操纵其他容器和宿主机的名称空间。
ports
ports用于映射端口的标签。
使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。
ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001"
当使用HOST:CONTAINER格式来映射端口时,如果使用的容器端口小于60可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。
extra_hosts
添加主机名的标签,会在/etc/hosts文件中添加一些记录。
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"
启动后查看容器内部hosts:
162.242.195.82 somehost 50.31.209.229 otherhost
volumes
挂载一个目录或者一个已存在的数据卷容器,可以直接使用[HOST:CONTAINER]格式,或者使用[HOST:CONTAINER:ro]格式,后者对于容器来说,数据卷是只读的,可以有效保护宿主机的文件系统。Compose的数据卷指定路径可以是相对路径,使用.或者…来指定相对目录。
数据卷的格式可以是下面多种形式
volumes: // 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。 - /var/lib/mysql // 使用绝对路径挂载数据卷 - /opt/data:/var/lib/mysql // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。 - ./cache:/tmp/cache // 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。 - ~/configs:/etc/configs/:ro // 已经存在的命名的数据卷。 - datavolume:/var/lib/mysql
如果不使用宿主机的路径,可以指定一个volume_driver。
volume_driver: mydriver
volumes_from
从另一个服务或容器挂载其数据卷:
volumes_from: - service_name - container_name
dns
自定义DNS服务器。可以是一个值,也可以是一个列表。
dns:8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
expose
暴露端口,但不映射到宿主机,只允许能被连接的服务访问。仅可以指定内部端口为参数,如下所示:
expose: - "3000" - "8000"
links
链接到其它服务中的容器。使用服务名称(同时作为别名),或者“服务名称:服务别名”(如 SERVICE:ALIAS),例如:
links: - db - db:database - redis
net
设置网络模式。
net: "bridge" net: "none" net: "host"
cap_add,cap_drop
添加或删除容器拥有的宿主机的内核功能。
cap_add: - ALL # 开启全部权限 cap_drop: - SYS_PTRACE # 关闭 ptrace权限
cgroup_parent
为容器指定父cgroup组,意味着将继承该组的资源限制。
cgroup_parent: m-executor-abcd
dns_search
自定义DNS搜索域。可以是单个值或列表。
dns_search: example.com dns_search: - dc1.example.com - dc2.example.com
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
env_file
从文件添加环境变量。可以是单个值或列表的多个值。
env_file: .env
也可以是列表格式:
env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
environment
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
environment: RACK_ENV: development SHOW: 'true'
healthcheck
用于检测docker服务是否健康运行。
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序 interval: 1m30s # 设置检测间隔 timeout: 10s # 设置检测超时时间 retries: 3 # 设置重试次数 start_period: 40s # 启动后,多少秒开始启动检测程序
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"
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
aliases:同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
restart
- no:是默认的重启策略,在任何情况下都不会重启容器。
- always:容器总是重新启动。
- on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
- unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
restart: "no" restart: always restart: on-failure restart: unless-stopped
注:swarm集群模式,请改用restart_policy。
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
security_opt
修改容器默认的schema标签。
security-opt: - label:user:USER # 设置容器的用户标签 - label:role:ROLE # 设置容器的角色标签 - label:type:TYPE # 设置容器的安全策略标签 - label:level:LEVEL # 设置容器的安全等级标签
stop_grace_period
指定在容器无法处理SIGTERM (或者任何 stop_signal 的信号),等待多久后发送SIGKILL信号关闭容器。
stop_grace_period: 1s # 等待 1 秒 stop_grace_period: 1m30s # 等待 1 分 30 秒
默认的等待时间是10秒。
stop_signal
设置停止容器的替代信号。默认情况下使用SIGTERM 。
以下示例,使用SIGUSR1替代信号SIGTERM来停止容器。
stop_signal: SIGUSR1
sysctls
设置容器中的内核参数,可以使用数组或字典格式。
sysctls: net.core.somaxconn: 1024 net.ipv4.tcp_syncookies: 0 sysctls: - net.core.somaxconn=1024 - net.ipv4.tcp_syncookies=0
tmpfs
在容器内安装一个临时文件系统。可以是单个值或列表的多个值。
tmpfs: /run tmpfs: - /run - /tmp
ulimits
覆盖容器默认的ulimit。
ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000
devices
指定设备映射列表。
devices: - "/dev/ttyUSB0:/dev/ttyUSB0"
更多相关内容 -
Linux命令模板 licote 1.1.0
2013-07-20 08:45:05Licote是Linux command template的缩写,顾名思义就是Linux命令模板。用于快速编写一个linux环境的命令程序,当然如果你愿意,你可以用于任何程序中;Licote的主要任务就是帮助你解析linux环境下的常用命令选项,让... -
Linux命令模板 licote 1.2.2
2013-08-01 23:20:28Licote是Linux command template的缩写,顾名思义就是Linux命令模板。用于快速编写一个linux环境的命令程序,当然如果你愿意,你可以用于任何程序中;Licote的主要任务就是帮助你解析linux环境下的常用命令选项,让... -
team_profile_generator:从后端使用命令模板生成团队档案
2021-02-22 04:46:51team_profile_generator 从后端使用命令模板生成团队资料 -
pentest-studio:审核员的项目管理。 创建命令模板并一键执行
2021-02-06 16:50:31pentest-studio:审核员的项目管理。 创建命令模板并一键执行 -
Linux命令模板 licote 1.3.2
2013-08-28 21:41:50Licote是Linux command template的缩写,顾名思义就是Linux命令模板。用于快速编写一个linux环境的命令程序,Licote的主要任务是帮助你解析linux环境下的常用命令选项,让你快速编写命令程序的同时,为用户提供灵活而... -
Linux命令模板 licote 1.2.3
2013-08-04 14:10:23Licote是Linux command template的缩写,顾名思义就是Linux命令模板。用于快速编写一个linux环境的命令程序,当然如果你愿意,你可以用于任何程序中;Licote的主要任务就是帮助你解析linux环境下的常用命令选项,让... -
Linux命令模板 licote 1.1.1
2013-07-21 15:49:50Licote是Linux command template的缩写,顾名思义就是Linux命令模板。用于快速编写一个linux环境的命令程序,当然如果你愿意,你可以用于任何程序中;Licote的主要任务就是帮助你解析linux环境下的常用命令选项,让... -
Linux命令模板 licote 1.0.2
2013-06-18 21:56:13Licote是Linux command template的缩写,顾名思义就是Linux命令模板。用于快速编写一个linux环境的命令程序,当然如果你愿意,你可以用于任何程序中;Licote的主要任务就是帮助你解析linux环境下的常用命令选项,让... -
Linux命令模板 licote 1.2.0
2013-07-23 22:13:53Licote是Linux command template的缩写,顾名思义就是Linux命令模板。用于快速编写一个linux环境的命令程序,当然如果你愿意,你可以用于任何程序中;Licote的主要任务就是帮助你解析linux环境下的常用命令选项,让... -
Linux命令模板 licote
2013-06-18 09:36:43Licote是Linux command template的缩写,顾名思义就是Linux命令模板。用于快速编写一个linux环境的命令程序,当然如果你愿意,你可以用于任何程序中;Licote的主要任务就是帮助你解析linux环境下的常用命令选项,让... -
Linux命令模板 licote 1.3.0
2013-08-24 20:34:55Licote是Linux command template的缩写,顾名思义就是Linux命令模板。用于快速编写一个linux环境的命令程序,Licote的主要任务是帮助你解析linux环境下的常用命令选项,让你快速编写命令程序的同时,为用户提供灵活而... -
实用SQL命令模板
2011-12-31 09:48:54给出12个我常用的SQL命令模板,是份很好的SQL模板。 -
Laravel学习笔记之Artisan命令生成自定义模板的方法
2020-12-18 02:04:15说明:本文主要讲述Laravel的Artisan命令来实现自定义模板,就如经常输入的php artisan make:controller ShopController就会自动生成一个ShopController.php模板文件一样,通过命令生成模板也会提高开发效率。... -
【Spring boot配置模板】java远程执行shell命令(支持向多主机发起远程命令)
2020-12-22 13:51:11【Spring boot配置模板】java远程执行shell命令(支持向多主机发起远程命令)前言pom依赖支持配置yml建类调用后记 前言 受2020年初的新型肺炎病毒影响,多日宅在家中无聊至极,就在琢磨一套调度系统,想用来管理维护... -
模板:元素create命令使用的全局模板
2021-02-24 04:03:14元素create命令使用的全局模板。 模板使您可以从默认文件和文件夹结构创建项目和项目资源。 当您安装元素时,这些模板将与此包一起全局安装。 您可以在~/elements/node_modules/@elements/templates/src找到这些... -
制造命令单模板.doc
2022-01-30 21:38:01制造命令单模板.doc -
ntc-templates, 用于分析网络设备显示命令的TextFSM模板.zip
2019-10-11 06:30:24ntc-templates, 用于分析网络设备显示命令的TextFSM模板 用于网络设备的TEXTFSM模板存储库ntc模板包含一组基于TEXTFSM解析引擎的多供应商模板。这些模板从网络基础设施设备( 如 Cisco IOS 。Juniper JUNOS或者 HPE ... -
25-ONU配置模板命令.pdf
2020-09-05 00:39:16预配置模板命令 目录 目 录 第 章 预配置模板命令1 1 1.1 预配置模板配置命令1 1.1.1epononu-config-template1 1.1.2cmd-sequence2 1.1.3eponpre-config-template2 1.1.4showonu-config-template3 - I- Interface ... -
Excel模板个人指示_命令确认表.zip
2022-04-14 23:12:09Excel模板个人指示_命令确认表.zip -
生产命令单(表格模板、DOC格式).doc
2022-02-12 03:29:04生产命令单(表格模板、DOC格式).doc -
Domino系统Notes数据库模板替换命令详解.docx
2021-10-03 14:35:25Domino系统Notes数据库模板替换命令详解.docx -
制造命令单(表格模板、DOC格式).doc
2022-01-30 21:36:19制造命令单(表格模板、DOC格式).doc -
实验2模板-HDFS环境搭建及基本命令的使用
2022-05-04 13:38:59实验2模板-HDFS环境搭建及基本命令的使用,实验报告原始资料 -
DC_Design_Compiler_综合脚本命令及参考模板.doc
2021-12-23 00:08:07DC_Design_Compiler_综合脚本命令及参考模板.doc -
使用.Net Core CLI命令dotnet new创建自定义模板.pdf
2021-09-14 17:32:27使用.Net Core CLI命令dotnet new创建自定义模板.pdf -
Excel表格+Word文档各类各行业模板-制造命令单.zip
2022-05-01 08:16:45Excel表格+Word文档各类各行业模板-制造命令单.zip -
Discord.js-bot-template:具有命令处理程序的基本bot模板
2021-05-28 00:49:58具有命令处理程序的基本bot模板 更改token.json令牌 在commands文件夹中进行命令 在commands文件夹中有ping命令,该bot的默认前缀为! 您可以在config.json更改它 先决条件 您需要什么东西来安装软件以及如何安装它们... -
vue项目模板
2018-12-13 10:28:52vue项目的模板,已经配置好路由和热保存编译,可以直接使用run dev命令