.Net Core微服務入門全紀錄(八)——Docker Compose與容器網路

来源:https://www.cnblogs.com/xhznl/archive/2020/07/09/13268940.html
-Advertisement-
Play Games

Tips:本篇已加入系列文章閱讀目錄,可點擊查看更多相關文章。 前言 上一篇【.Net Core微服務入門全紀錄(七)——IdentityServer4-授權認證】中使用IdentityServer4完成了鑒權中心的搭建,配合網關實現了統一的授權認證。進行到這裡,系統環境已經比較複雜了,想把整個系統 ...


Tips:本篇已加入系列文章閱讀目錄,可點擊查看更多相關文章。

前言

上一篇【.Net Core微服務入門全紀錄(七)——IdentityServer4-授權認證】中使用IdentityServer4完成了鑒權中心的搭建,配合網關實現了統一的授權認證。進行到這裡,系統環境已經比較複雜了,想把整個系統運行起來會非常繁瑣:要運行Consul、業務服務、網關、鑒權中心、web客戶端,還要安裝資料庫、MQ等等。。。那麼本篇將使用Docker Compose來解決以上問題,僅需一個簡單的命令,即可啟動整個環境。

Docker Compose

什麼是Docker Compose?

Compose 是用於定義和運行多容器 Docker 應用程式的工具。通過 Compose,您可以使用 YML 文件來配置應用程式需要的所有服務。然後,使用一個命令,就可以從 YML 文件配置中創建並啟動所有服務。

簡單來理解,Compose類似一個批量工具,可以執行一組命令,支持批量構建鏡像,批量啟動容器,批量刪除容器等等功能。

Windows的Docker Desktop中已經包括了Compose,Linux下Compose則需要單獨安裝一下。

yml file

yml文件是使用Compose必不可少的,在編寫yml文件之前還需要準備Dockerfile。

之前的章節中,有些服務不是在Docker中運行的,現在全部放到Docker中。確保解決方案中每個項目都添加Docker支持。

在根目錄新建docker-compose.yml文件:

以下是docker-compose.yml文件內容:

version: '3.4' #Compose文件版本
services: #服務
    auth: #定義"auth"服務 對應的是鑒權中心項目
        build: #構建
            context: . #構建上下文(目錄)
            dockerfile: ./IDS4.AuthCenter/Dockerfile #Dockerfile文件目錄
        ports: #埠
            - '9080:9080' #容器外部9080 容器內部9080
        environment: #環境變數
            - ASPNETCORE_URLS=http://+:9080 #程式在容器內部http://+:9080運行 也可以寫成http://0.0.0.0:9080
        networks: #容器網路
            - my-net #自定義網路my-net

    web: #定義"web"服務 對應的web客戶端項目
        build: 
            context: .
            dockerfile: ./Web.MVC/Dockerfile
        ports: 
            - '5000:5000'
        environment: 
            - ASPNETCORE_URLS=http://+:5000
        networks: 
            - my-net
        depends_on: #"web"服務依賴於"auth"服務和"apigateway"服務,此服務會在依賴服務之後執行
            - auth
            - apigateway

    apigateway: #定義"apigateway"服務 對應的網關項目
        build: 
            context: .
            dockerfile: ./Ocelot.APIGateway/Dockerfile
        ports: 
            - '9070:9070'
        environment: 
            - ASPNETCORE_URLS=http://+:9070
        networks:
            - my-net
        depends_on: 
            - orderapi1
            - orderapi2
            - orderapi3
            - productapi1
            - productapi2
            - productapi3

    productapi1: #定義"productapi1"服務 對應的產品服務項目
        image: productapi #指定鏡像名稱,如果不指定 預設是:netcoremicroservicedemo_productapi1,因為下麵要用到所以指定一下
        build: 
            context: .
            dockerfile: ./Product.API/Dockerfile
        ports: 
            - '9050:9050'
        environment: 
            - ASPNETCORE_URLS=http://+:9050
            - ConsulSetting:ServiceIP=productapi1 #程式參數
            - ConsulSetting:ServicePort=9050 #程式參數
        networks: 
            - my-net
        depends_on: 
            - consul
            - postgres
            - rabbitmq
    productapi2:
        image: productapi #指定鏡像名稱為productapi,productapi1服務中已經構建了productapi鏡像,所以不用重覆構建
        ports: 
            - '9051:9051'
        environment: 
            - ASPNETCORE_URLS=http://+:9051
            - ConsulSetting:ServiceIP=productapi2
            - ConsulSetting:ServicePort=9051
        networks: 
            - my-net
        depends_on: 
            - productapi1
    productapi3:
        image: productapi
        ports: 
            - '9052:9052'
        environment: 
            - ASPNETCORE_URLS=http://+:9052
            - ConsulSetting:ServiceIP=productapi3 
            - ConsulSetting:ServicePort=9052
        networks: 
            - my-net
        depends_on: 
            - productapi1

    orderapi1:
        image: orderapi
        build: 
            context: .
            dockerfile: ./Order.API/Dockerfile
        ports: 
            - '9060:9060'
        environment: 
            - ASPNETCORE_URLS=http://+:9060
            - ConsulSetting:ServiceIP=orderapi1
            - ConsulSetting:ServicePort=9060
        networks: 
            - my-net
        depends_on: 
            - consul
            - postgres
            - rabbitmq
    orderapi2:
        image: orderapi
        ports: 
            - '9061:9061'
        environment: 
            - ASPNETCORE_URLS=http://+:9061
            - ConsulSetting:ServiceIP=orderapi2
            - ConsulSetting:ServicePort=9061
        networks: 
            - my-net
        depends_on: 
            - orderapi1
    orderapi3:
        image: orderapi
        ports: 
            - '9062:9062'
        environment: 
            - ASPNETCORE_URLS=http://+:9062
            - ConsulSetting:ServiceIP=orderapi3
            - ConsulSetting:ServicePort=9062
        networks: 
            - my-net
        depends_on: 
            - orderapi1

    consul:
        image: consul #指定鏡像名稱為consul,本地如果沒有consul鏡像,會從docker遠程倉庫拉取
        ports: 
            - '8500:8500'
        networks: 
            - my-net

    postgres:
        image: postgres
        environment: 
            POSTGRES_PASSWORD: pg123456
        networks: 
            - my-net

    rabbitmq:
        image: rabbitmq
        networks: 
            - my-net

networks: #定義容器網路
    my-net: #my-net網路
        driver: bridge #網路模式為bridge

以上yml文件定義了auth,web,apigateway,productapi1,productapi2,productapi3,orderapi1,orderapi2,orderapi3,consul,postgres,rabbitmq 12個服務(容器),和一個容器網路 my-net。這裡的productapi和orderapi相當於是基於同樣的鏡像各運行了3個容器,這其實不太合理,正常他們應該分佈在多個docker中。。。

文件的內容雖然有點多,但是應該不難理解,上面的關鍵字我都有註釋。下麵再簡單介紹一下文件中的networks容器網路。

容器網路

前面的章節中有提到過,預設情況下容器之間的通訊是比較麻煩的,之前是通過host.docker.internal或者容器的IP去訪問,雖然是可以訪問但有些不友好。更好的方式是,我們可以自定義一個bridge網路,將所有服務(容器)加入這個網路中,那麼容器之間就可以直接通過服務名稱通信了。bridge模式只是docker網路模式中的一種,有興趣的話可以自行搜索一下。

代碼修改

既然程式都運行在docker中,那就不能寫localhosthost.docker.internal之類的主機名了,統一改為docker-compose.yml文件中定義的服務名。如下:

還有多處修改就不全貼出來了,都是些類似的改動。這些配置還是不要寫在代碼里,改動起來比較亂。

這裡有一個特殊的就是identityserver4鑒權服務,這個服務是容器內外部都需要訪問的(容器內部ids4發現文檔等介面的調用,外部瀏覽器訪問),所以不能直接寫服務名auth,寫auth的話外部無法訪問,寫localhost的話內部又無法訪問。最後是參考eShopOnContainers項目,使用docker.for.win.localhost來滿足內外部的訪問需求:

理論上用host.docker.internal或許也可以,沒去測試。。。這個配置放到Compose的環境變數里會比較好,這裡只是為了方便。

eShopOnContainers項目是微軟官方出品的開源項目,對於學習微服務,docker等技術非常有幫助。

項目地址:https://github.com/dotnet-architecture/eShopOnContainers

構建與啟動

完成以上操作後,進入項目根目錄執行docker-compose build

build完成後,執行docker-compose up -d,-d代表在後臺運行

(第一次up,orderapi2,orderapi3,productapi2,productapi3這4個服務會起不來,是因為他們啟動時有創建資料庫的操作,同時啟動會導致後起來的4個重覆的服務創建資料庫時報錯,因為orderapi1和productapi1在創建同樣的資料庫。。。這個前面說過的。這裡等up完再執行一次up就好了)

瀏覽器訪問:http://localhost:5000/

登錄後:

這樣運行系統是不是非常簡單呢?想要摧毀這個環境也很簡單,只需要一句docker-compose down

如果不習慣docker命令,推薦使用vscode,裝一下docker插件,很方便。

總結

上文用到了Docker-Compose的3個命令:

構建:docker-compose build

啟動:docker-compose up

銷毀:docker-compose down

其實build命令也可以省略,執行up時如果沒有build的話會自動build,無論多複雜的系統環境,只需要一個docker-compose up命令即可啟動。不過鏡像需要重新bulid的時候,還是要用到build命令。Compose還有一些其他命令,需要的話可以自行搜索。

主要的工作量在於docker-compose.yml文件的編寫。

需要代碼的點這裡:https://github.com/xiajingren/NetCoreMicroserviceDemo


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、單節點實例 單節點實例還是比較簡單的,平時做個測試,寫個小程式如果需要用到緩存的話,啟動一個 Redis 還是很輕鬆的,做為一個 key/value 資料庫也是可以勝任的 二、主從模式(master/slaver) redis 主從模式配置 主從模式: redis 的主從模式,使用非同步複製,sl ...
  • 一、前言 回顧:基於.NetCore3.1系列 —— 認證授權方案之授權揭秘 (上篇) 在上一篇中,主要講解了授權在配置方面的源碼,從添加授權配置開始,我們引入了需要的授權配置選項,而不同的授權要求構建不同的策略方式,從而實現一種自己滿意的授權需求配置要求。 在這一節中,繼續上一篇的內容往下深入瞭解 ...
  • 一、原因 用戶希望後臺維護每日預約送貨/提貨時間配置一鍵生成,不需要過多操作。 二、整理實現思路 1.靈活維護/配置送貨、提貨時間段及允許預約數量的模板,如圖所示: 2.預約日期處理: ① 查找提貨/送貨時間配置的預約日期中最新一條數據大於等於當天日期,則預約日期自增一天; ② 查找提貨/送貨時間配 ...
  • 在與同事討論async/await內部實現的時候,突然想到Task.Yeild()這個函數,為什麼呢,瞭解一點C#async/await內部機制的都知道,在await一個非同步任務(函數)的時候,它會先判斷該Task是否已經完成,如果已經完成,則繼續執行下去,不會返回到調用方,原因是儘量避免線程切換, ...
  • 在WinForm程式中,要移動沒有標題欄的視窗,基本的實現思路是監聽需要拖動視窗內的控制項的滑鼠事件,然後將滑鼠位置發送給視窗進行相應的位移就可以了。通過借用Windows API也可以很容易實現這一點,比如像下麵這樣。 public class Win32Api { public const int ...
  • 想深入瞭解OrchadCore源碼許久了,但是讀源碼的時候遇到很多問題而網上的參考資料太少了(幾乎都是OrchadCms不帶OrchardCore的),現在解決得差不多了,做下筆記方便自己查看,有錯誤之處也請大家幫忙指出,謝謝。 OrchardCore是一個基於asp.net core的cms(廢話 ...
  • 場景 ASP.NET中新建Web網站並部署到IIS上(詳細圖文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/107199747 在上面博客中已經將網站部署到了IIS上。 怎樣對前端的請求進行響應普通文本和JSON數據以及 ...
  • 0. 前言 在之前的文章中簡單介紹了一下asp.net core中的Identity,這篇文章將繼續針對Identity進行進一步的展開。 1. 給Identity添加額外的信息 在《【asp.net core 系列】13 Identity 身份驗證入門》一文中,我們大概瞭解瞭如何使用Identit ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...