Docker Compose 配置檔案詳解

lgp20151222發表於2021-01-01

專案用到了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

 

相關文章