一 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,則:
- 創建了一個名為myapp_default的網絡。
- 使用web配置創建容器,在web下加入myapp_default網絡。
- 使用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