附005.Docker Compose文件詳解

一 Docker Compose文件簡介

compose文件使用yml格式,主要分爲了四個區域:
  • version:用於指定當前docker-compose.yml語法遵循哪一個版本
  • services:服務,在它下面能夠定義應用須要的一些服務,每一個服務都有本身的名字、使用的鏡像、掛載的數據卷、所屬的網絡、依賴哪些其餘服務等等。
  • networks:應用的網絡,在它下面能夠定義應用的名字、使用的網絡類型等。
  • volumes:數據卷,在它下面能夠定義數據卷,而後掛載到不一樣的服務下去使用。

二 Docker Compose文件詳解

2.1 version字段

用於指定當前compose文件語法遵循哪一個版本,Compose文件版本支持特定的Docker版本列表以下:
Compose文件格式
Docker Engine版本
3.7
18.06.0+
3.6
18.02.0+
3.5
17.12.0+
3.4
17.09.0+
3.3
17.06.0+
3.2
17.04.0+
3.1
1.13.1+
3.0
1.13.0+
2.4
17.12.0+
2.3
17.06.0+
2.2
1.13.0+
2.1
1.12.0+
2.0
1.10.0+
1.0
1.9.1.+
示例:version: "3"

2.2 services區域

全部服務的定義都是定義在services區域中,services經常使用的配置項以下:
image:指定要啓動容器的映像。能夠是一個repository/tag或鏡像ID來代表。
示例:
image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd
提示:image能夠是本地也能夠是遠程的,若是本地不存在,compose會嘗試pull下來,肉使用了build手動構建鏡像,則使用指定的選項構建它,並使用指定的標籤標記它。
 
build:該參數指定Dockerfile文件的路徑,compose會經過Dockerfile構建並生成鏡像,而後使用該鏡像
示例:
  1 version: '3'
  2 services:
  3   webapp:
  4     build: ./dir
  5     image: webapp:tag
 
提示:若是在構建鏡像的時候你指定相關名字和tag,則生成指定的鏡像和tag。
 
command:重寫默認的命令,即指定啓動容器的命令。
示例:
command: bundle exec thin -p 3000 或
command: ["bundle", "exec", "thin", "-p", "3000"]
 
links:連接到其餘服務中的容器,能夠指定服務名稱和這個連接的別名,或者只指定服務名稱。
示例:
  1 web:
  2   links:
  3    - db
  4    - db:database
  5    - redis
此時,在容器內部,會在/etc/hosts文件中用別名建立幾個條目,以下:
  1 172.17.2.100 db
  2 172.17.2.100 database
  3 172.17.2.100 redis
 
external_links:連接到compose外部啓動的容器,特別是對於提供共享和公共服務的容器。在指定容器名稱和別名時,external_links遵循着和links相同的語義用法。
示例:
  1 external_links:
  2  - redis_1
  3  - project_db_1:mysql
  4  - project_db_1:postgresql
 
ports:暴露端口,指定宿主機到容器的端口映射,或者只指定容器的端口,則表示映射到主機上的隨機端口。
提示:注意:以HOST:CONTAINER格式映射端口時,使用低於60的容器端口時可能會遇到錯誤的結果,由於YAML會將格式xx:yy中的數字解析爲base-60值。所以,咱們建議始終將端口映射明確指定爲字符串。
示例:
  1 ports:
  2  - "3000"
  3  - "3000-3005"
  4  - "8000:8000"
  5  - "9090-9091:8080-8081"
  6  - "49100:22"
  7  - "127.0.0.1:8001:8001"
  8  - "127.0.0.1:5000-5010:5000-5010"
  9  - "6060:6060/udp"
示例2:
  1 ports:
  2   - target: 80
  3     published: 8080
  4     protocol: tcp
  5     mode: host
解釋:長格式語法容許配置沒法以簡短形式表示的其餘字段。
  • target:容器內的端口
  • published:公開暴露的港口
  • protocol:端口協議(tcp或udp)
  • mode:host用於在每一個節點上發佈主機端口,或者ingress用於負載平衡的羣集模式端口。
 
expose:暴露端口,但不須要創建與宿主機的映射,只是會向連接的服務提供,只能指定內部端口。
示例:
  1 expose:
  2  - "3000"
  3  - "8000"
 
environment:加入環境變量,可使用數組或者字典,只有一個key的環境變量能夠在運行compose的機器上找到對應的值。
提示:任何布爾值; true,false,yes no,須要用引號括起來,以確保YML解析器不會將它們轉換爲True或False。
示例:
  1 environment:
  2   RACK_ENV: development
  3   SHOW: 'true'
  4   SESSION_SECRET:
  5 environment:
  6   - RACK_ENV=development
  7   - SHOW=true
  8   - SESSION_SECRET
 
env_file:從一個文件中引入環境變量,該文件能夠是一個單獨的值或者一個列表,若是同時定義了environment,則environment中的環境變量會重寫這些值。
示例:
  1 env_file: .env
  2 
  3 env_file:
  4   - ./common.env
  5   - ./apps/web.env
  6   - /opt/secrets.env
提示:列表中文件的順序對於肯定分配給屢次顯示的變量的值很是重要。列表中的文件從上到下進行處理。對於在文件中指定的相同變量a.env並在文件中 分配不一樣的值b.env,若是b.env列在下面(後),則來自b.envstand 的值。
如:給出如下聲明docker_compose.yml:
  1 services:
  2   some-service:
  3     env_file:
  4       - a.env
  5       - b.env
如下文件:
# a.env VAR=1
# b.env VAR=hello
則$VAR是hello。
 
depends_on:指定與部署和運行服務相關的配置。
示例:
  1 version: '3'
  2 services:
  3   web:
  4     build: .
  5     depends_on:
  6       - db
  7       - redis
  8   redis:
  9     image: redis
 10   db:
 11     image: postgres
服務依賴關係之間的Express依賴關係會致使如下行爲:
  • docker-compose up:以依賴順序啓動服務,在以上示例中,db和redis之在web以前啓動。
  • docker-compose up SERVICE:自動包含SERVICE依賴項。在以上示例中,docker-compose up web還建立並啓動db和redis。
 
deploy:指定與部署和運行服務相關的配置。
示例:
  1 version: '3'
  2 services:
  3   redis:
  4     image: redis:alpine
  5     deploy:
  6       labels:
  7  com.example.description: "This label will appear on all containers for the web service"
  8       resources:
  9         limits:
 10           cpus: '0.50'
 11           memory: 50M
 12         reservations:
 13           cpus: '0.25'
 14           memory: 20M
 15       replicas: 6
 16       update_config:
 17         parallelism: 2
 18         delay: 10s
 19       update_config:
 20         parallelism: 2
 21         delay: 10s
 22         order: stop-first
 23       restart_policy:
 24         condition: on-failure
 25         delay: 5s
 26         max_attempts: 3
 27         window: 120s
 
子選項說明:
labels:指定服務的標籤。這些標籤僅在服務上設置,而不是在服務的任何容器上設置。
mode:global:每一個集羣節點只有一個容器,默認爲replicated。
resources:資源限制,如上所示:redis服務被限制爲使用不超過50M的內存和0.50(50%)的CPU時間,而且保留20M了內存和0.25CPU時間(始終可用)。
replicas:指定replicated後,或默認狀況下課使用replicas指定副本數,
restart_policy:配置是否以及如何在容器退出時從新啓動容器,包括:
  • condition:其中之一none,on-failure或any(默認:) any。
  • delay:從新啓動嘗試之間等待的時間,指定爲持續時間(默認值:0)。
  • max_attempts:在放棄以前嘗試從新啓動容器的次數(默認值:永不放棄)。若是在配置中未成功從新啓動 window,則此嘗試不會計入配置的max_attempts值。例如,若是max_attempts設置爲「2」,而且第一次嘗試時從新啓動失敗,則可能會嘗試從新啓動兩次以上。
  • window:在決定重啓是否成功以前等待多長時間,指定爲持續時間(默認值:當即決定)。
rollback_config:配置在更新失敗的狀況下應如何回滾服務。
  • parallelism:一次回滾的容器數。若是設置爲0,則全部容器同時回滾。
  • delay:每一個容器組的回滾之間等待的時間(默認爲0)。
  • failure_action:若是回滾失敗該怎麼辦。一個continue或pause(默認pause)
  • monitor:每次更新任務後的持續時間以監視失敗(ns|us|ms|s|m|h)(默認爲0)。
  • max_failure_ratio:回滾期間容忍的失敗率(默認值爲0)。
  • order:回滾期間的操做順序。其中之一stop-first(舊任務在啓動新任務以前中止),或者start-first(首先啓動新任務,而且正在運行的任務暫時重疊)(默認stop-first)。
update_config:配置服務應如何更新,用於配置滾動更新。
  • parallelism:一次更新的容器數。
  • delay:更新一組容器之間的等待時間。
  • failure_action:更新失敗時的行爲。其中一個continue,rollback或者pause (默認:pause)。
  • monitor:每次更新任務後的持續時間以監視失敗(ns|us|ms|s|m|h)(默認爲0)。
  • max_failure_ratio:更新期間容忍的故障率。
  • order:更新期間的操做順序。其中一個stop-first(舊任務在啓動新任務以前中止),或者start-first(首先啓動新任務,而且正在運行的任務暫時重疊)(默認stop-first)注意:僅支持v3.4及更高版本。
注意:order僅支持v3.4及更高版本的撰寫文件格式。
 
healthcheck:配置運行的檢查以肯定此服務的容器是否「健康」。
示例:
  1 healthcheck:
  2   test: ["CMD", "curl", "-f", "http://localhost"]
  3   interval: 1m30s
  4   timeout: 10s
  5   retries: 3
  6   start_period: 40s
提示:healthcheck可參考:https://docs.docker.com/engine/reference/builder/#healthcheck
 
network_mode:網絡類型,可指定容器運行的網絡類型
示例:
  1 network_mode: "bridge"
  2 network_mode: "host"
  3 network_mode: "none"
  4 network_mode: "service:[service name]"
  5 network_mode: "container:[container name/id]"
 
dns:自定義dns服務
  1 dns: 8.8.8.8
  2 dns:
  3   - 8.8.8.8
  4   - 9.9.9.9

2.3 networks區域

網絡決定了服務之間以及服務和外界之間如何去通訊,在執行docker-compose up的時候,docker會默認建立一個默認網絡,建立的服務也會默認的使用這個默認網絡。服務和服務之間,可使用服務的名字進行通訊,也能夠本身建立網絡,並將服務加入到這個網絡之中,這樣服務之間能夠相互通訊,而外界不可以與這個網絡中的服務通訊,能夠保持隔離性。
提示:注意:您的應用程序網絡的名稱基於「項目名稱」,該名稱基於其所在目錄的名稱。您可使用--project-name參數或COMPOSE_PROJECT_NAME環境變量覆蓋項目名稱,如當前的目錄爲myapp,期docker-compose.yml以下:
  1 version: "3"
  2 services:
  3   web:
  4     build: .
  5     ports:
  6       - "8000:8000"
  7   db:
  8     image: postgres
  9     ports:
 10       - "8001:5432"
運行時docker-compose up,則:
  1. 建立了一個名爲myapp_default的網絡。
  2. 使用web配置建立容器,在web下加入myapp_default網絡。
  3. 使用db配置建立容器,在db下加入myapp_default網絡。
示例:
  1 version: '2'
  2 
  3 services:
  4   app:
  5     image: busybox
  6     command: ifconfig
  7     networks:
  8       app_net:
  9         ipv4_address: 172.16.238.10
 10 
 11 networks:
 12   app_net:
 13     driver: bridge
 14     enable_ipv6: true
 15     ipam:
 16       driver: default
 17       config:
 18       - subnet: 172.16.238.0/24
 19         gateway: 172.168.238.254

2.4 volumes區域

能夠在Compose file文件上聲明卷,同時也能夠在本區域建立volumes_from,以便在多個服務中重用卷。
示例:
  1 version: "3"
  2 services:
  3   db:
  4     image: db
  5     volumes:
  6       - data-volume:/var/lib/db
  7   backup:
  8     image: backup-service
  9     volumes:
 10       - data-volume:/var/lib/backup/data
 11 volumes:
 12   data-volume:
提示:volumes可參考:https://docs.docker.com/compose/compose-file/#specifying-byte-values
相關文章
相關標籤/搜索