一. docker compose服務編排簡介
1. 背景
微服務架構的應用系統中一般包含若干個微服務,每個微服務一般都會部署多個實例,如果每個微服務都要手動啟停,維護的工作量會很大:
A. 要創建鏡像 Dockerfile build image 或者去dockerhub拉取image
B. 要創建多個container
C. 要管理這些container(啟動停止刪除)
因此,“服務編排” 的概念應運而生。
2. docker compose介紹
docker compose是一個編排多容器分布式部署的工具,提供命令集管理容器化應用的完整開發周期,包括服務構建,啟動和停止。使用步驟:
(1). 利用 Dockerfile 定義運行環境鏡像
(2). 使用 docker-compose.yml 定義組成應用的各服務
注: 也可以自定義命名,但是需要通過 -f 指定路徑
(3). 運行指令 【docker-compose up】 啟動應用
如下圖:
3. docker compose的安裝和卸載
參照官網:https://docs.docker.com/compose/install/
(1). 安裝步驟
前提:docker compose在Linux上運行,首先要安裝docker (詳見第一節,這里不再介紹)。
A. 通過curl下載二進制文件進行安裝
(不建議使用官方地址下載,慢的要死!!!)
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
PS:1.27.3 是目前最穩定版本,版本去上面的官網地址查詢即可。
注. 上面是從github上下載,由於網速原因,很容易失敗,也可以嘗試下面的地址: (強烈推薦使用這個地址!!!)
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.3/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
如圖:
B. 通過chmod 命令將該目錄設置為可運行 (對於一個目錄,如果沒有可執行權限,則不能cd進入)
sudo chmod +x /usr/local/bin/docker-compose
C. 查看安裝成功后的版本號
docker-compose --version
(2). 卸載步驟
sudo rm /usr/local/bin/docker-compose
4. docker compose常用指令
前言:默認情況下命令讀取當前目錄下,名為 docker-compose.yml 或 docker-compose.yaml 的文件, 當然用戶也可以使用 -f 指定其他文件名。
某個docker-compose配置文件相關指令:
(1). 參數剖析
-f :指定配置文件路徑
-p:指定名稱,生成的鏡像和容器都會以該名稱開頭,但是在執行后續指令的時候也需要加上-p,否則無效。如下圖:
【docker-compose -f ./nginx_api_compose.yml -p yxy ps】
(2). 指令剖析
查看鏡像:【docker-compose images】
查看容器:【docker-compose ps】【docker-compose ps -a】
停止容器:【docker-compose stop】
重啟容器:【docker-compose restart】
開啟容器:【docker-compose start】
刪除已經停止的容器:【docker-compose rm】 加-f 強制刪除無效, 且不會刪除鏡像和數據卷。
停止並刪除運行中的 Compose 應用(包含鏡像、容器、數據卷、networks):【docker-compose down】
創建並啟動容器:【docker-compose up -d】 -d表示以后台的方式運行,不要省略,而且它屬於up的參數,必須加在up的后面,啟動的過程中,如果沒有images,會先構建鏡像。
PS:鏡像和容器的命名規則,默認是前置都會以目錄命名,且默認加上 _1 _2 _3 ,可以用-p來指定名稱,代替以目錄命名。
(3). 常用的命令組合
創建並啟動容器(指定yml的路徑):【docker-compose -f ./xxx/xx.yml up -d】
查看容器情況(指定yml的路徑):【docker-compose -f ./xxx/xx.yml ps】
創建並啟動容器(指定yml的路徑和容器命名):【docker-compose -f ./nginx_api_compose.yml -p yxy up -d】
查看容器情況(指定yml的路徑和容器命名):【docker-compose -f ./nginx_api_compose.yml -p yxy ps】
二. yaml及docker compose參數剖析
1. 版本對應關系
關於docker和docker-compose的版本對應關系,詳見:https://docs.docker.com/compose/compose-file/compose-versioning/
2. Yaml和Json轉換
yaml和json 校驗轉換地址為:http://www.bejson.com/validators/yaml_editor/
docker-compose.yml (或docker-compose.yaml)編寫格式支持yml或json,個人喜好json格式。
3. docker compose配置文件詳解
參考地址:
官方介紹:https://docs.docker.com/compose/compose-file/ (推薦)
中文翻譯:https://blog.csdn.net/qq_36148847/article/details/79427878 (僅供參考)
分享兩個docker-compose.yml文件
a. 基於發布包構建鏡像
{ "version": "3.8", "services": { "myapi1": { "build": "../ypfwebapi1/", "ports": [ "8100:9000" ] }, "myapi2": { "build": "../ypfwebapi2/", "ports": [ "8101:9001" ] } } }
b. stack中構建鏡像
{ "version": "3.8", "services": { "api1": { "image": "ypfwebapi1", "ports": [ "8301:9001" ], "deploy": { "mode": "replicated", "replicas": 2 } }, "api2": { "image": "ypfwebapi2", "ports": [ "8302:9002" ], "deploy": { "mode": "replicated", "replicas": 2 } } } }
(1). version:版本號,對應關系詳見 https://docs.docker.com/compose/compose-file/compose-versioning/
(2). build:發布包目錄
(3). images:鏡像名稱
(4). ports:端口映射,前面是容器暴露端口,后面是鏡像端口
(5). expose:對外暴露端口
(7). volumes:數據卷
(9). replicas : 代表在n個節點上進行任務
三. 基於發布包構建多個webapi容器
1. 准備項目發布包
將ypfwebapi1和ypfwebapi2兩個發布包復制到myprogram文件夾,兩個的Dockerfile文件中暴露的端口分別為 9000 和 9001。
兩個Dockerfile文件如下:

#1.依賴兩個基礎鏡像 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster #2.制作人 MAINTAINER ypf <ypf@qq.com> #3.指定程序運行的端口(也可以在項目中通過UseUrls指定, 或者發布容器的時候通過--env ASPNETCORE_URLS=xxx動態指定) ENV ASPNETCORE_URLS=http://*:9000 #4.容器對外暴露的端口 EXPOSE 9000 #5.指定默認工作目錄 WORKDIR /userapi COPY . /userapi/ #6.啟動容器的時候執行shell命令:dotnet webapi1.dll,即運行該項目 ENTRYPOINT ["dotnet", "webapi1.dll"]

#1.依賴兩個基礎鏡像 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster #2.制作人 MAINTAINER ypf <ypf@qq.com> #3.指定程序運行的端口(也可以在項目中通過UseUrls指定, 或者發布容器的時候通過--env ASPNETCORE_URLS=xxx動態指定) ENV ASPNETCORE_URLS=http://*:9001 #4.容器對外暴露的端口 EXPOSE 9001 #5.指定默認工作目錄 WORKDIR /userapi COPY . /userapi/ #6.啟動容器的時候執行shell命令:dotnet webapi1.dll,即運行該項目 ENTRYPOINT ["dotnet", "webapi1.dll"]
發布包截圖:
2. 編輯配置文件
在myprogram文件夾下創建mycompose文件夾,用於存放各種docker compose配置文件的。
docker-compose.yml 內容如下:
{ "version": "3.8", "services": { "myapi1": { "build": "../ypfwebapi1/", "ports": [ "8100:9000" ] }, "myapi2": { "build": "../ypfwebapi2/", "ports": [ "8101:9001" ] } } }
3. 創建並啟動容器
以后台的運行的方式構建容器,運行指令:【docker-compose up -d】,不要省略-d
查看鏡像:
查看容器:
4. 測試端口,成功。
http://119.45.174.249:8100/weatherforecast
http://119.45.174.249:8101/weatherforecast
四. 基於鏡像實現Nginx反向代理webapi
1. 准備鏡像
(1). 構建一個ypfwebapi1鏡像,Dockerfile中暴露的端口為 9000 (詳見前面章節)
(2). 然后要下載一個nginx最新版本的鏡像 【docker pull nginx】
2. 准備配置文件
在mycompose文件夾里,新建一個 nginx_api_compose.yml 文件.
配置文件內容如下:
{ "version": "3.8", "services": { "cnginxcontainer1": { "image": "nginx", "ports": [ "8080:8080" ], "links": [ "cypfwebapicontainer1" ], "volumes": [ "./nginx/conf.d:/etc/nginx/conf.d" ] }, "cypfwebapicontainer1": { "image": "ypfwebapi1", "expose": [ "9000" ] } } }
3. 創建配置文件
在當前目錄下運行創建對應的文件夾
mkdir -p ./nginx/conf.d
並在該目錄新建一個配置文件 ypfnginx.conf,會自動同步到容器中(數據卷掛載),內容如下:
server { listen 8080; access_log off; location / { proxy_pass http://cypfwebapicontainer1:9000; } }
4. 創建容器並啟動
回到mycompose文件夾,運行指令 【 docker-compose -f ./nginx_api_compose.yml up -d 】 ./是當前目錄,可以省略
查看鏡像和容器:
5. 測試
因為監聽的是8080端口,所有直接訪問 http://119.45.174.249:8080/weatherforecast, 測試成功。
!
- 作 者 : Yaopengfei(姚鵬飛)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 聲 明1 : 如有錯誤,歡迎討論,請勿謾罵^_^。
- 聲 明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。