第六節:docker compose服務編排簡介、基於發布包構建多個webapi容器 和 基於鏡像實現Nginx反向代理webapi


一. 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"]
View Code
#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"]
View Code

發布包截圖:

 

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 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM