1. 程式人生 > 實用技巧 >Docker學習記錄 - docker compose yaml檔案詳解

Docker學習記錄 - docker compose yaml檔案詳解

Docker學習記錄 - docker compose yaml檔案詳解

Compose和Docker相容性:
    Compose 檔案格式有3個版本,分別為1, 2.x 和 3.x
    目前主流的為 3.x 其支援 docker 1.13.0 及其以上的版本
 
常用引數:
    version           # 指定 compose 檔案的版本
    services          # 定義所有的 service 資訊, services 下面的第一級別的 key 既是一個 service 的名稱
 
        build                 # 指定包含構建上下文的路徑, 或作為一個物件,該物件具有 context 和指定的 dockerfile 檔案以及 args 引數值
context # context: 指定 Dockerfile 檔案所在的路徑 dockerfile # dockerfile: 指定 context 指定的目錄下面的 Dockerfile 的名稱(預設為 Dockerfile) args # args: Dockerfile 在 build 過程中需要的引數 (等同於 docker container build --build-arg 的作用) cache_from #
v3.2中新增的引數, 指定快取的映象列表 (等同於 docker container build --cache_from 的作用) labels # v3.3中新增的引數, 設定映象的元資料 (等同於 docker container build --labels 的作用) shm_size # v3.5中新增的引數, 設定容器 /dev/shm 分割槽的大小 (等同於 docker container build --shm-size 的作用) command
# 覆蓋容器啟動後預設執行的命令, 支援 shell 格式和 [] 格式 configs # 不知道怎麼用 cgroup_parent # 不知道怎麼用 container_name # 指定容器的名稱 (等同於 docker run --name 的作用) credential_spec # 不知道怎麼用 deploy # v3 版本以上, 指定與部署和執行服務相關的配置, deploy 部分是 docker stack 使用的, docker stack 依賴 docker swarm endpoint_mode # v3.3 版本中新增的功能, 指定服務暴露的方式 vip # Docker 為該服務分配了一個虛擬 IP(VIP), 作為客戶端的訪問服務的地址 dnsrr # DNS輪詢, Docker 為該服務設定 DNS 條目, 使得服務名稱的 DNS 查詢返回一個 IP 地址列表, 客戶端直接訪問其中的一個地址 labels # 指定服務的標籤,這些標籤僅在服務上設定 mode # 指定 deploy 的模式 global # 每個叢集節點都只有一個容器 replicated # 使用者可以指定叢集中容器的數量(預設) placement # 不知道怎麼用 replicas # deploy 的 mode 為 replicated 時, 指定容器副本的數量 resources # 資源限制 limits # 設定容器的資源限制 cpus: "0.5" # 設定該容器最多隻能使用 50% 的 CPU memory: 50M # 設定該容器最多隻能使用 50M 的記憶體空間 reservations # 設定為容器預留的系統資源(隨時可用) cpus: "0.2" # 為該容器保留 20% 的 CPU memory: 20M # 為該容器保留 20M 的記憶體空間 restart_policy # 定義容器重啟策略, 用於代替 restart 引數 condition # 定義容器重啟策略(接受三個引數) none # 不嘗試重啟 on-failure # 只有當容器內部應用程式出現問題才會重啟 any # 無論如何都會嘗試重啟(預設) delay # 嘗試重啟的間隔時間(預設為 0s) max_attempts # 嘗試重啟次數(預設一直嘗試重啟) window # 檢查重啟是否成功之前的等待時間(即如果容器啟動了, 隔多少秒之後去檢測容器是否正常, 預設 0s) update_config # 用於配置滾動更新配置 parallelism # 一次性更新的容器數量 delay # 更新一組容器之間的間隔時間 failure_action # 定義更新失敗的策略 continue # 繼續更新 rollback # 回滾更新 pause # 暫停更新(預設) monitor # 每次更新後的持續時間以監視更新是否失敗(單位: ns|us|ms|s|m|h) (預設為0) max_failure_ratio # 回滾期間容忍的失敗率(預設值為0) order # v3.4 版本中新增的引數, 回滾期間的操作順序 stop-first #舊任務在啟動新任務之前停止(預設) start-first #首先啟動新任務, 並且正在執行的任務暫時重疊 rollback_config # v3.7 版本中新增的引數, 用於定義在 update_config 更新失敗的回滾策略 parallelism # 一次回滾的容器數, 如果設定為0, 則所有容器同時回滾 delay # 每個組回滾之間的時間間隔(預設為0) failure_action # 定義回滾失敗的策略 continue # 繼續回滾 pause # 暫停回滾 monitor # 每次回滾任務後的持續時間以監視失敗(單位: ns|us|ms|s|m|h) (預設為0) max_failure_ratio # 回滾期間容忍的失敗率(預設值0) order # 回滾期間的操作順序 stop-first # 舊任務在啟動新任務之前停止(預設) start-first # 首先啟動新任務, 並且正在執行的任務暫時重疊 注意: 支援 docker-compose up 和 docker-compose run 但不支援 docker stack deploy 的子選項 security_opt container_name devices tmpfs stop_signal links cgroup_parent network_mode external_links restart build userns_mode sysctls devices # 指定裝置對映列表 (等同於 docker run --device 的作用) depends_on # 定義容器啟動順序 (此選項解決了容器之間的依賴關係, 此選項在 v3 版本中 使用 swarm 部署時將忽略該選項) 示例: docker-compose up 以依賴順序啟動服務,下面例子中 redis 和 db 服務在 web 啟動前啟動 預設情況下使用 docker-compose up web 這樣的方式啟動 web 服務時,也會啟動 redis 和 db 兩個服務,因為在配置檔案中定義了依賴關係 version: '3' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres dns # 設定 DNS 地址(等同於 docker run --dns 的作用) dns_search # 設定 DNS 搜尋域(等同於 docker run --dns-search 的作用) tmpfs # v2 版本以上, 掛載目錄到容器中, 作為容器的臨時檔案系統(等同於 docker run --tmpfs 的作用, 在使用 swarm 部署時將忽略該選項) entrypoint # 覆蓋容器的預設 entrypoint 指令 (等同於 docker run --entrypoint 的作用) env_file # 從指定檔案中讀取變數設定為容器中的環境變數, 可以是單個值或者一個檔案列表, 如果多個檔案中的變數重名則後面的變數覆蓋前面的變數, environment 的值覆蓋 env_file 的值 檔案格式: RACK_ENV=development environment # 設定環境變數, environment 的值可以覆蓋 env_file 的值 (等同於 docker run --env 的作用) expose # 暴露埠, 但是不能和宿主機建立對映關係, 類似於 Dockerfile 的 EXPOSE 指令 external_links # 連線不在 docker-compose.yml 中定義的容器或者不在 compose 管理的容器(docker run 啟動的容器, 在 v3 版本中使用 swarm 部署時將忽略該選項) extra_hosts # 新增 host 記錄到容器中的 /etc/hosts 中 (等同於 docker run --add-host 的作用) healthcheck # v2.1 以上版本, 定義容器健康狀態檢查, 類似於 Dockerfile 的 HEALTHCHECK 指令 test # 檢查容器檢查狀態的命令, 該選項必須是一個字串或者列表, 第一項必須是 NONE, CMD 或 CMD-SHELL, 如果其是一個字串則相當於 CMD-SHELL 加該字串 NONE # 禁用容器的健康狀態檢測 CMD # test: ["CMD", "curl", "-f", "http://localhost"] CMD-SHELL # test: ["CMD-SHELL", "curl -f http://localhost || exit 1"] 或者 test: curl -f https://localhost || exit 1 interval: 1m30s # 每次檢查之間的間隔時間 timeout: 10s # 執行命令的超時時間 retries: 3 # 重試次數 start_period: 40s # v3.4 以上新增的選項, 定義容器啟動時間間隔 disable: true # true 或 false, 表示是否禁用健康狀態檢測和 test: NONE 相同 image # 指定 docker 映象, 可以是遠端倉庫映象、本地映象 init # v3.7 中新增的引數, true 或 false 表示是否在容器中執行一個 init, 它接收訊號並傳遞給程序 isolation # 隔離容器技術, 在 Linux 中僅支援 default 值 labels # 使用 Docker 標籤將元資料新增到容器, 與 Dockerfile 中的 LABELS 類似 links # 連結到其它服務中的容器, 該選項是 docker 歷史遺留的選項, 目前已被使用者自定義網路名稱空間取代, 最終有可能被廢棄 (在使用 swarm 部署時將忽略該選項) logging # 設定容器日誌服務 driver # 指定日誌記錄驅動程式, 預設 json-file (等同於 docker run --log-driver 的作用) options # 指定日誌的相關引數 (等同於 docker run --log-opt 的作用) max-size # 設定單個日誌檔案的大小, 當到達這個值後會進行日誌滾動操作 max-file # 日誌檔案保留的數量 network_mode # 指定網路模式 (等同於 docker run --net 的作用, 在使用 swarm 部署時將忽略該選項) networks # 將容器加入指定網路 (等同於 docker network connect 的作用), networks 可以位於 compose 檔案頂級鍵和 services 鍵的二級鍵 aliases # 同一網路上的容器可以使用服務名稱或別名連線到其中一個服務的容器 ipv4_address # IP V4 格式 ipv6_address # IP V6 格式 示例: version: '3.7' services: test: image: nginx:1.14-alpine container_name: mynginx command: ifconfig networks: app_net: # 呼叫下面 networks 定義的 app_net 網路 ipv4_address: 172.16.238.10 networks: app_net: driver: bridge ipam: driver: default config: - subnet: 172.16.238.0/24 pid: 'host' # 共享宿主機的 程序空間(PID) ports # 建立宿主機和容器之間的埠對映關係, ports 支援兩種語法格式 SHORT 語法格式示例: - "3000" # 暴露容器的 3000 埠, 宿主機的埠由 docker 隨機對映一個沒有被佔用的埠 - "3000-3005" # 暴露容器的 3000 到 3005 埠, 宿主機的埠由 docker 隨機對映沒有被佔用的埠 - "8000:8000" # 容器的 8000 埠和宿主機的 8000 埠建立對映關係 - "9090-9091:8080-8081" - "127.0.0.1:8001:8001" # 指定對映宿主機的指定地址的 - "127.0.0.1:5000-5010:5000-5010" - "6060:6060/udp" # 指定協議 LONG 語法格式示例:(v3.2 新增的語法格式) ports: - target: 80 # 容器埠 published: 8080 # 宿主機埠 protocol: tcp # 協議型別 mode: host # host 在每個節點上釋出主機埠, ingress 對於群模式埠進行負載均衡 secrets # 不知道怎麼用 security_opt # 為每個容器覆蓋預設的標籤 (在使用 swarm 部署時將忽略該選項) stop_grace_period # 指定在傳送了 SIGTERM 訊號之後, 容器等待多少秒之後退出(預設 10s) stop_signal # 指定停止容器傳送的訊號 (預設為 SIGTERM 相當於 kill PID; SIGKILL 相當於 kill -9 PID; 在使用 swarm 部署時將忽略該選項) sysctls # 設定容器中的核心引數 (在使用 swarm 部署時將忽略該選項) ulimits # 設定容器的 limit userns_mode # 如果Docker守護程式配置了使用者名稱稱空間, 則禁用此服務的使用者名稱稱空間 (在使用 swarm 部署時將忽略該選項) volumes # 定義容器和宿主機的卷對映關係, 其和 networks 一樣可以位於 services 鍵的二級鍵和 compose 頂級鍵, 如果需要跨服務間使用則在頂級鍵定義, 在 services 中引用 SHORT 語法格式示例: volumes: - /var/lib/mysql # 對映容器內的 /var/lib/mysql 到宿主機的一個隨機目錄中 - /opt/data:/var/lib/mysql # 對映容器內的 /var/lib/mysql 到宿主機的 /opt/data - ./cache:/tmp/cache # 對映容器內的 /var/lib/mysql 到宿主機 compose 檔案所在的位置 - ~/configs:/etc/configs/:ro # 對映容器宿主機的目錄到容器中去, 許可權只讀 - datavolume:/var/lib/mysql # datavolume 為 volumes 頂級鍵定義的目錄, 在此處直接呼叫 LONG 語法格式示例:(v3.2 新增的語法格式) version: "3.2" services: web: image: nginx:alpine ports: - "80:80" volumes: - type: volume # mount 的型別, 必須是 bind、volume 或 tmpfs source: mydata # 宿主機目錄 target: /data # 容器目錄 volume: # 配置額外的選項, 其 key 必須和 type 的值相同 nocopy: true # volume 額外的選項, 在建立卷時禁用從容器複製資料 - type: bind # volume 模式只指定容器路徑即可, 宿主機路徑隨機生成; bind 需要指定容器和資料機的對映路徑 source: ./static target: /opt/app/static read_only: true # 設定檔案系統為只讀檔案系統 volumes: mydata: # 定義在 volume, 可在所有服務中呼叫 restart # 定義容器重啟策略(在使用 swarm 部署時將忽略該選項, 在 swarm 使用 restart_policy 代替 restart) no # 禁止自動重啟容器(預設) always # 無論如何容器都會重啟 on-failure # 當出現 on-failure 報錯時, 容器重新啟動 其他選項: domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir 上面這些選項都只接受單個值和 docker run 的對應引數類似 對於值為時間的可接受的值: 2.5s 10s 1m30s 2h32m 5h34m56s 時間單位: us, ms, s, m, h 對於值為大小的可接受的值: 2b 1024kb 2048k 300m 1gb 單位: b, k, m, g 或者 kb, mb, gb networks # 定義 networks 資訊 driver # 指定網路模式, 大多數情況下, 它 bridge 於單個主機和 overlay Swarm 上 bridge # Docker 預設使用 bridge 連線單個主機上的網路 overlay # overlay 驅動程式建立一個跨多個節點命名的網路 host # 共享主機網路名稱空間(等同於 docker run --net=host) none # 等同於 docker run --net=none driver_opts # v3.2以上版本, 傳遞給驅動程式的引數, 這些引數取決於驅動程式 attachable # driver 為 overlay 時使用, 如果設定為 true 則除了服務之外,獨立容器也可以附加到該網路; 如果獨立容器連線到該網路,則它可以與其他 Docker 守護程序連線到的該網路的服務和獨立容器進行通訊 ipam # 自定義 IPAM 配置. 這是一個具有多個屬性的物件, 每個屬性都是可選的 driver # IPAM 驅動程式, bridge 或者 default config # 配置項 subnet # CIDR格式的子網,表示該網路的網段 external # 外部網路, 如果設定為 true 則 docker-compose up 不會嘗試建立它, 如果它不存在則引發錯誤 name # v3.5 以上版本, 為此網路設定名稱 檔案格式示例: version: "3" services: redis: image: redis:alpine ports: - "6379" networks: - frontend deploy: replicas: 2 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data networks: - backend deploy: placement: constraints: [node.role == manager]

參考資料:

docker compose yaml檔案詳解