­

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