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

 

 

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

 

 

	
# 类似于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"

 

 

	
# 设置容器日志驱动
# 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

posted @ 2018-02-02 13:40  _Goku  阅读(810)  评论(0编辑  收藏  举报