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

浙公网安备 33010602011771号