Docker Compose 模板文件 V2
模板文件是使用Compose的核心,默认模板文件名称为docker-compose.yml ,格式为YAML格式。
目录结构
[root@localhost ~]# tree /opt/compose-conf/jenkins/ /opt/compose-conf/jenkins/ ├── conf │ ├── ansible.cfg │ ├── ansible.cfg.bak │ └── hosts ├── core │ └── Dockerfile └── jenkins.yml
/opt/compose-conf/jenkins/core/Dockerfile 文件配置
[root@localhost ~]# cat /opt/compose-conf/jenkins/core/Dockerfile FROM jenkins/jenkins MAINTAINER simon USER root RUN apt-get update \ && apt-get -y install vim rsync procps cronolog python-pip \ && pip install ansible \ && mkdir /etc/ansible EXPOSE 8080
[root@localhost ~]# cat /opt/compose-conf/jenkins/jenkins.yml version: '2' services: jenkins: build: core container_name: jenkins-core cap_add: - LINUX_IMMUTABLE ports: - "8080:8080" volumes: - /etc/localtime:/etc/localtime:ro - /opt/container-logs/jenkins:/var/log - /etc/hosts:/etc/hosts:ro - /opt/compose-conf/jenkins/conf:/etc/ansible hostname: jenkins restart: always #command: /bin/bash command: "/bin/tini -- /usr/local/bin/jenkins.sh" mem_limit: 8g memswap_limit: 8g stdin_open: true tty: true dns: - 10.168.11.100 - 10.167.11.100 ulimits: core: soft: 0 hard: 0
指令:
build 指定Dockerfile所在目录(可以是绝对路径,或者docker-compose.yml 文件的相对路径)。 Compose将会利用它自动构建这个镜像,然后使用这个镜像 build: core
cap_add,cap_drop 指定容器的内核能力(capacity)分配。 # 让容器拥有所有能力 cap_add: - ALL # 去掉NET_ADMIN能力 cap_drop: - NET_ADMIN
command 覆盖容器启动后默认执行的命令 command: "/bin/tini -- /usr/local/bin/jenkins.sh"
container_name 指定容器名称,默认将会使用"项目名称_服务名称_序号" 这样的格式 # 需要注意,指定容器名称后,改服务奖无法进行扩展,因为Docker不允许多个容器具有相同的名称。 container_name: jenkins-core
depends_on 表示服务之前的依赖关系 # docker-compose up ,启动web服务器之前,启动redis、db。 # docker-compose up web ,启动web容器时,检查依赖depends_on的配置内容,先启动db和redis 例如: services: web: build: web depends_on: - db - redis redis: image: redis db: image: postages
dns 自定义DNS,可以是单个的,也可以是列表 # 单个 dns:8.8.8.8 # 多个 dns: - 8.8.8.8 - 4.4.4.4
dns_search 配置DNS搜索区域。可以是单个的,也可以是列表。 # 单个 dns_search: example.com # 多个 dns_search: - dom1.example.com - dom2.example.com
tmpfs 在容器中挂载一个tmpfs # tmpfs 可以理解成虚拟机磁盘,是创建在内存上,不是硬盘上,读取速度快,重启后数据消失 tmpfs: /run tpmfs: - /run - /tmp
env_file 指定变量文件,可以为党文件路径或列表 # 如果通过docker-compose -f File 方式来指定Compose模板文件,则nev_file中变量路径会基于模板文件路径。 # 如果变量名称与environment 指令冲突,则按照惯例以后者为准 # 环境变量文件中每一行必须符合格式,支持#开通的注释行 # 单个 env_file: .env # 多个 env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
environment 设置环境变量,可以使用数组或字典两种格式 # 给定名称的变量会自动获取运行Compose 主机上对应变量的值,可以用来防止泄露不必要的数据 # 如果在变量名或者值中用到true|false, yes|no 等,最后放在引号里,避免YAML自动解析某些内容对应的布尔语义 # 字典格式 environment: RACK_ENV: development SHOW: 'true' # 数组格式 environment: - RACK_ENV=development - SHOW='true'
expose 暴露端口,但不映射到宿主机,只允许能被连接的服务访问,仅可以指定内部端口为参数 expose: - "3000" - "8000"
extends 基于其他模板文件进行扩展。 # 要避免出现循环依赖,例如 A依赖B,B依赖C,C反过来依赖A的情况 # extends 不会继承links 和volumes_from 中定义的容器和数据卷资源 # 推荐在基础模板中定义一些可以共享的镜像和环境变量,在扩展模板中具体制定应用变量、链接、数据卷等信息。 例如已经有一个webapp服务,定义的基础模板 common.yml webapp: build: ./webapp environment: - DEBUG='false' - RACK_ENV=development 在编写一个新的development.yml 文件,使用common.yml 文件中的webapp服务进行扩展 web: extends: file: common.yml service: webapp ports: - "3000:3000" links: - db environment: - DEBUG='true' db: imgae: postgres
# external_links 链接到docker-compose.yml 外部容器,甚至可以是非Compose管理的外部容器。 external_links: - redis_1 - project_db_1:mysql
# 类似于Docker 中的--add-host 参数,制定额外的host名称映射信息。 extra_hosts: - "googledns:8.8.8.8" 启动后容器中的/etc/hosts 文件中将添加: 8.8.8.8 googledns
# 指定镜像名称或镜像ID。 如果本地不存在,Compose将会尝试来去这个镜像。 images: ubuntu
# 指定容器的标签. # 字典类型定义 labels: com.example.description: "Accounting webapp" com.example.department: "Finance" com.example.label-with-empty-value: "" # 元祖类型定义 labels: - "com.example.description=Accounting webapp" - "com.example.department=Finance" - "com.example.label-with-empty-value"
# 链接到其他服务中的容器。使用服务名称(同时作为别名),或者"服务名称: 服务别名 (如: SERVICE:ALIAS)" links: - db - db:database - redis
# 设置容器日志驱动 # v2 中使用logging,在v1 中使用log_driver和log_opt logging: driver: syslog options: syslog-address: "tcp://10.168.11.101:571"
# 指定容器的网络类型,v1 使用 net ;v2 使用network_mode network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
# 通过设置,容器可通过ps查询宿主机的进程. pid: "host"
# 暴露端口信息 # 使用"宿主: 容器" # 或者仅仅指定容器的端口(宿主将会随机端口) ports: - "3000" - "8000:8000"
# 指定容器的ulimits限制值。 ulimits: nproc: 65535 #最大进程数 nofile: soft: 20000 #软连接 hard: 20000 #系统应限制
# 数据卷所挂载路径设置。 # 可以设置宿主路径(HOST:CONTAINER) # 加上访问模式(HOST:CONTAINER:ro) volumes: - /etc/localtime:/etc/localtime:ro - /opt/container-logs/jenkins:/var/log - /etc/hosts:/etc/hosts:ro - /opt/compose-conf/jenkins/conf:/etc/ansible
# 数据卷的插件驱动,可以使用第三方驱动创建一个数据卷,然后使用名称来访问 volumes_driver: mydriver
# 从另外一个服务或者容器挂载他的数据卷 volumes_from: - service_name - service_name:ro - container:container_name - container:container_name:rw
# 使用CPU 0核 和1核,只用50%的CPU资源 cpu_shares: 73 cpuset: 0,1 # 指定服务容器启动后执行的命令 entrypoint: /code/entrypoint.sh # 指定容器中运行应用的用户名 user: nginx # 指定容器中的工作目录 working_dir: /code # 指定容器中搜索域名、主机名、mac地址等 domainname: website.com hostname: jenkins mac_address: 08-00-28-00-0C-0A # 指定容器 ipc: hostname # 指定容器中内存和交换分区的大小 mem_limit: 8g memswap_limit: 8g # 运行容器中运行一些特权命令 privileged: true # 指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,生产环境推荐配置 # 配置项: always 或 unless-stopped restart: always # 以只读模式挂载容器的root文件系统,意味着不能对容器内容进行修改 read_only: true # 打开标准输入,可以接受外部输入 stdin_open: true # 模拟一个假的远程控制台 tty: true