Docker Compose 配置文件详解

项目用到了docker-compose,所以做下笔记

先放一个配置文件

version: '3'
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,servicesnetworks三个部分,version没啥好说的,就是版本号。

主要讲services,次要的是networks

三 service

services:
#服务名称,不可重复
  web:
#服务的镜像名称或镜像 ID,如果镜像在本地不存在,Compose 将会尝试拉取这个镜像
    image: dockercloud/hello-world
#基于一份 Dockerfile构建镜像,指定 Dockerfile 所在文件夹的路径 
#如果你同时指定了 image 和 build 两个标签,那么 Compose 会构建镜像并且把镜像命名为 image 后面的那个名字
    #build: /path/to/build/dir
#也可以是相对路径,建议使用
    #build: ./dir
#设定上下文根目录,然后以该目录为准指定 Dockerfile,不建议用
    build:
      context: ../
      dockerfile: path/of/Dockerfile
#Dockerfile 中的 ARG 指令,和ENV不同,ARG允许空值
      args:
      - buildno=
      - password=secret
#不建议这种写法
      #args:
      #   buildno: 1
      #   password: secret
#command 可以覆盖容器启动后默认执行的命令
       command: bundle exec thin -p 3000
#也可以写成类似 Dockerfile 中的格式:
#     command: [bundle, exec, thin, -p, 3000]
#容器名称,不写则默认为 项目名称_服务名称_序号
    container_name: app
#控制容器启动的顺序,先启动 redis 和 db 两个服务,最后才启动 web 服务:
    depends_on:
      - db
      - redis
#和docker的启动参数 --dns 一样用途
    dns: 8.8.8.8
#多个配置
    #dns:
    # - 8.8.8.8
    # - 9.9.9.9
#同理搜索域 dns_search
#挂载临时目录到容器内部的tmpfs
#env_file可以定义一个专门存放变量的文件
#expose与Dockerfile中的EXPOSE指令一样,用于指定暴露的端口,没啥用
#都是类似的语法
    dns_search: example.com
    tmpfs: /run
    env_file: .env
    expose: 3000
#ENTRYPOINT 指令,用于指定接入点
    entrypoint: /code/entrypoint.sh
#同样可以写成这样,注意参数 -d 是另起一行
    #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可以定义一个专门存放变量的文件
#arg 标签的变量仅用在构建过程中。而 environment 和 Dockerfile 中的 ENV 指令一样会把变量一直保存在镜像、容器中    
#    environment:
#      RACK_ENV: development
#      SHOW: 'true'
#      SESSION_SECRET:
#建议写法
    environment:
      - RACK_ENV=development
      - SHOW=true
      - SESSION_SECRET
#external_links,它可以让Compose项目里面的容器连接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络里面)
    external_links:
     - redis_1
#冒号后面是别名
     - project_db_1:mysql
     - project_db_1:postgresql
#extra_hosts就是往容器/etc/hosts文件中添加一些记录,与Docker client的--add-host类似:
    extra_hosts:
     - "somehost:162.242.195.82"
     - "otherhost:50.31.209.229"
#labels向容器添加元数据,和Dockerfile的LABEL指令一个意思
    #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"
#links标签解决的是容器连接问题,与Docker client的--link一样效果,会连接到其它服务中的容器。使用的别名将会自动在容器中的/etc/hosts里创建
    links:
     - db
     - db:database
     - redis
#logging这个标签用于配置日志服务
    logging:
      driver: syslog
      options:
        syslog-address: "tcp://192.168.0.42:123"
#pid 容器使用这个标签将能够访问和操纵其他容器和宿主机的名称空间。不建议使用
    pid: "host"
#ports映射端口的标签
    ports:
     - "3000"
     - "8000:8000"
     - "49100:22"
     - "127.0.0.1:8001:8001"
#security_opt为每个容器覆盖默认的标签
    security_opt:
      - label:user:USER
      - label:role:ROLE
#stop_signal设置另一个信号来停止容器。在默认情况下使用的是SIGTERM停止容器。设置另一个信号可以使用stop_signal标签。
    stop_signal: SIGUSR1
#volumes挂载一个目录或者一个已存在的数据卷容器
    volumes:
#只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
      - /var/lib/mysql
#使用绝对路径挂载数据卷
      - /opt/data:/var/lib/mysql
#以docker-compose.yml配置文件为中心的相对路径作为数据卷挂载到容器。
      - ./cache:/tmp/cache
#使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。不建议使用,大坑。:ro代表只读,默认为读写:rw
      - ~/configs:/etc/configs/:ro
# 已经存在的命名的数据卷。
      - datavolume:/var/lib/mysql
# volumes_from从其它容器或者服务挂载数据卷,可选的参数是 :ro或者 :rw,
    volumes_from:
      - service_name
      - service_name:ro
      - container:container_name
      - container:container_name:rw
#devices设备映射列表。与Docker client的--device参数类似。
    devices:
      - "/dev/ttyUSB0:/dev/ttyUSB0"

注意:

YAML 的布尔值(true, false, yes, no, on, off)必须要使用引号引起来(单引号、双引号均可),否则会当成字符串解析。建议所有值都用双引号引起来

四 networks

#加入指定网络,格式如下:
services:
  some-service:
    networks:
     - some-network
     - other-network

#关于这个标签还有一个特别的子标签aliases,这是一个用来设置服务别名的标签,例如:
services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

不写就是default

五 其他

#extends这个标签可以扩展另一个服务,扩展内容可以是来自在当前文件,也可以是来自其他文件,相同服务的情况下,后来者会有选择地覆盖原有配置。
extends:
  file: common.yml
  service: webapp