前言
前面《Docker學習—DockerFile》文中介紹了dockerfile相關的語法,及使用方式;接下來了解docker三劍客之一的 Compose;接下來詳細學習。
一、docker-compose介紹
Docker-Compose項目是Docker官方的開源項目,主要使用Python編寫;用於定義和運行多容器Docker應用程序的工具。使用Compose,可以使用YAML文件來配置應用程序的服務。然后使用一個命令,從配置創建並啟動所有服務。
Compose是一個定位“定義和運行多個Docker容器應用的工具”,其前身是Fig,目前使用的Compose仍然兼容Fig格式的模板文件。
Compose中包含兩個重要概念:
- 服務(Service):一個應用的容器,實際可以包含若干個運行相同鏡像的容器實例
- 項目(Project):一組相關聯的應用容器組成的完整業務單元,在docker-compose.yml文件中定義
Compose的默認管理對象是項目,通過子命令對項目中的一組容器進行便捷地生命周期管理。
二、docker-compose安裝
Compose目前已經完全支持Linux、Mac OS和Windows,在安裝Compose之前,需要先安裝Docker;(本篇主要在window中使用)
- Mac安裝:Install Docker for Mac
- Windows安裝:Install Docker for Windows
- Linux安裝:Install Docker for Centos
安裝成功后命令行中輸入:docker compose -h

三、docker-compose 命令
安裝成功后來看下compose主要包含的命令:
build #生成或重建服務
bundle #從Compose文件生成Docker bundle
config #驗證並查看撰寫文件
create #創建服務
down #停止並刪除容器、網絡、鏡像和卷
events #從容器接收實時事件
exec #在正在運行的容器中執行命令
help #獲取命令幫助
images #顯示鏡像列表
kill #殺死容器
logs #查看容器的輸出
pause #暫停服務
port #打印端口綁定的公共端口
ps #顯示容器列表
pull #拉取服務鏡像
push #推送服務鏡像
restart #重新啟動服務
rm #移除停止的容器
run #運行一次性命令
scale #設置服務的容器數
start #啟動服務
stop #暫停服務
top #顯示正在運行的進程
unpause #取消暫停服務
up #創建並啟動容器
version #顯示Docker-Compose版本信息
對命令有大概印象后,接下來就需要對重點內容(docker-compose.yml)了解;每個命令具體的使用參數在使用是具體介紹
三、docker-compose.yml編寫
docker-compose.yml已有多個版本:如下

首先我們先來看一個官方示例docker-compose.yml內容:
version: "3.8" 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: max_replicas_per_node: 1 constraints: - "node.role==manager" vote: image: dockersamples/examplevotingapp_vote:before ports: - "5000:80" networks: - frontend depends_on: - redis deploy: replicas: 2 update_config: parallelism: 2 restart_policy: condition: on-failure result: image: dockersamples/examplevotingapp_result:before ports: - "5001:80" networks: - backend depends_on: - db deploy: replicas: 1 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure worker: image: dockersamples/examplevotingapp_worker networks: - frontend - backend deploy: mode: replicated replicas: 1 labels: [APP=VOTING] restart_policy: condition: on-failure delay: 10s max_attempts: 3 window: 120s placement: constraints: - "node.role==manager" networks: frontend: backend: volumes: db-data:
根據以上示例格式可以看出docker-compose.yml中主要包含以下內容:
- version: 指定當前docker-compose.yml的版本,版本與Docker Engine版本存在對應關系,如:v3.8對應 Docker Engine 19.03.0+
- services:服務,可以定義業務需要的一些服務,每個服務可包含服務名稱、使用鏡像、掛載數據卷、使用的網絡、依賴服務等信息
- networks:應用的網絡,可以定義網絡名稱、使用的網絡類型等
- volumes:數據卷,可以定義數據卷,然后掛載到不同的服務下使用
接着就來看下相關命令的語法及具體含義
| 序號 | 所屬 | 命令 | 說明 |
| 1 | services | build | 基於Dockerfile,指定Dockerfile所在路徑,Compose會利用它自動構建鏡像,然后啟動服務容器 |
| 2 | cap_add,cap_drop | 添加或刪除容器功能 | |
| 3 | command | 覆蓋容器啟動后默認執行的命令 | |
| 4 | config | 使用“每服務配置”配置在每個服務的基礎上授予對配置的訪問權限。存在兩種語法方式:短語法、長語法 | |
| 5 | cgroup_parent | 為容器指定一個可選的父cgroup | |
| 6 | container_name | 容器名稱 | |
| 7 | depends_on | 容器依賴,用於指定服務依賴的其他服務 | |
| 8 | depoly | 指定與服務的部署和運行相關的配置。這只在使用docker stack deploy部署到一個群時生效,docker compose up和docker compose run將忽略此項。 |
|
| 9 | devices | 設備映射列表。 | |
| 10 | dns | 自定義DNS服務器。可以是單個值或列表。 | |
| 11 | dns_search | 自定義DNS搜索域。可以是單個值或列表。 | |
| 12 | entrypoint | 覆蓋默認入口點 | |
| 13 | env_file | 從文件添加環境變量。可以是單個值或列表 | |
| 14 | environment | 添加環境變量。可以使用數組或字典。任何布爾值(true、false、yes、no)都需要用引號括起來,以確保它們不會被YML解析器轉換為true或false。 | |
| 15 | expose | 暴露端口而不將它們發布到主機-它們只能被鏈接的服務訪問。只能指定內部端口。 | |
| 16 | external_links | 鏈接到在此范圍之外docker-compose.yml甚至在Compose之外開始的容器,尤其是對於提供共享或公共服務的容器。 同時指定容器名稱和鏈接別名()時,請external_links遵循與legacy選項相似的語義。 | |
| 17 | extra_hosts | 添加主機名映射。使用與docker客戶端相同的值 | |
| 18 | healthcheck | 配置運行的檢查以確定該服務的容器是否“健康” | |
| 19 | image | 指定要從中啟動容器的鏡像。可以是存儲庫/標簽或鏡像ID | |
| 20 | init | 在容器內運行一個初始化程序,以轉發信號並獲取進程。設置此選項可以true為服務啟用此功能。 | |
| 21 | isolation | 指定容器的隔離技術。在Linux上,唯一支持的值是default。在Windows中,可接受的值是default,process和 hyperv。 | |
| 22 | labels | 使用Docker標簽將元數據添加到容器中。您可以使用數組或字典。 | |
| 23 | links | 鏈接到另一個服務中的容器。指定服務名稱和鏈接別名("SERVICE:ALIAS"),或者僅指定服務名稱。 | |
| 24 | logging | 服務的日志記錄配置 | |
| 25 | network_mode | 網絡模式。使用與客戶端服務相同的網絡名稱和服務-參數docker相同。 | |
| 26 | networks | 要加入的網絡,引用頂級網絡鍵下的條目。 | |
| 27 | pid | 將PID模式設置為主機PID模式。這將打開容器和主機操作系統之間的PID地址空間共享。 | |
| 28 | ports | 暴露端口 | |
| 29 | restart | no是默認的重啟策略,在任何情況下都不會重啟容器。當always指定時,容器總是重新啟動。該 on-failure如果退出代碼指示的故障錯誤政策重啟的容器。unless-stopped總是重新啟動容器,除非容器停止(手動或其他方式)。 | |
| 30 | secrets | 使用按服務secrets 配置,按服務授予對機密的訪問權限。 | |
| 31 | security_opt | 覆蓋每個容器的默認標簽方案。 | |
| 32 | stop_grace_period | 指定在發送SIGKILL之前,如果容器不處理SIGTERM(或用stop_nusignal指定的任何停止信號),嘗試停止該容器時要等待多長時間。默認10s | |
| 33 | stop_signal | 設置停止容器的替代信號。默認情況下,stop使用SIGTERM。使用stop_signal設置替代信號會導致stop發送該信號。 | |
| 34 | sysctls | 要在容器中設置的內核參數。可以使用數組或字典。 | |
| 35 | tmpfs | 在容器內安裝一個臨時文件系統。可以是單個值或列表。 | |
| 36 | ulimits | 覆蓋容器的默認ulimit。您可以將單個限制指定為整數,也可以將軟/硬限制指定為映射。 | |
| 37 | userns_mode | 如果Docker守護程序配置了用戶名稱空間,則禁用此服務的用戶名稱空間。 | |
| 38 | volumes | 掛載主機路徑或命名卷,指定為服務的子選項。可以將主機路徑安裝為單個服務的定義的一部分,而無需在頂級volumes中進行定義。 但是,如果要在多個服務之間重用卷,請在頂級volumes密鑰中定義一個命名卷。 將命名卷與服務,群集和堆棧文件一起使用。 |
|
| 39 | domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir |
其中每個都是一個值,類似於其 docker run對應項。 | |
| 40 | Volumes | dirver | 指定該卷應使用哪個卷驅動程序。默認為Docker Engine配置為使用的任何驅動程序,大多數情況下為 local。 |
| 41 | dirver_opts | 指定選項列表作為鍵值對,以傳遞給該卷的驅動程序。 | |
| 42 | external | 如果設置為true,則指定此卷是在Compose之外創建的。docker-compose up不會嘗試創建它,如果不存在則引發錯誤。 | |
| 43 | labels | 使用Docker標簽向容器添加元數據。可以使用數組或字典。 | |
| 44 | name | 為此卷設置一個自定義名稱。名稱字段可用於引用包含特殊字符的卷。 | |
| 45 | Networks | dirver | 指定該網絡應使用哪個驅動程序。 |
| 46 | dirver_opts | 指定選項列表作為要傳遞給此網絡的驅動程序的鍵值對 | |
| 47 | attachable | 僅當驅動程序設置為覆蓋時使用。 | |
| 48 | enable_ipv6 | 在此網絡上啟用IPv6網絡。 | |
| 49 | ipam | 指定自定義IPAM配置 | |
| 50 | internal | 默認情況下,Docker還會連接一個網橋網絡來提供外部連接。如果要創建外部隔離的覆蓋網絡,可以將此選項設置為true。 | |
| 51 | labels | 使用Docker標簽將元數據添加到容器中 。您可以使用數組或字典。 | |
| 52 | external | 如果設置為true,則指定此網絡是在Compose之外創建的。docker-compose up不會嘗試創建它,如果不存在則引發錯誤。 | |
| 53 | name | 為此網絡設置一個自定義名稱。名稱字段可用於引用包含特殊字符的網絡。 |
通過以上內容發現,services中相關命令是docker相關配置項關聯;接下來就來驗證通過docker-compose.yml運行應用
四、應用案例
實現效果:基於身份認證時,相關示例代碼實現,通過docker-compose啟動相關所有服務容器,運行程序。
A、在解決方案目錄下添加docker-compose.yml文件:
添加方式:
1、手動添加文件
2、通過vs自動添加:選中需要添加項目右鍵,如圖

添加后如下:

B、修改內容如下:(該docker-compose.yml比較簡單)
version: '3.4' services: cz.identityserver: image: ${DOCKER_REGISTRY-}czidentityserver build: context: . dockerfile: cz.IdentityServer/Dockerfile cz.api.order: image: ${DOCKER_REGISTRY-}czapiorder build: context: . dockerfile: cz.Api.Order/Dockerfile cz.api.goods: image: ${DOCKER_REGISTRY-}czapigoods build: context: . dockerfile: cz.Api.Goods/Dockerfile cz.mvcclient: image: ${DOCKER_REGISTRY-}czmvcclient build: context: . dockerfile: cz.MVCClient/Dockerfile
C、執行命令docker-compose up命令:執行完成看到以下輸出,則編譯啟動完成。

D、在docker管理頁面中查看如下:

后續:
本篇內容先對docker-compose內容進行了相關介紹,下面將對Swarm、Machine、K8S 進行應用學習。
參考:
https://docs.docker.com/compose/
https://docs.docker.com/compose/compose-file/
