主頁 > .NET開發 > .Net Core微服務入門全紀錄(八)——Docker Compose與容器網路

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

2020-09-10 21:29:33 .NET開發

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/3519.html

標籤:.NET Core

上一篇:一文說通Blazor for Server-Side的專案結構

下一篇:(一)學習了解OrchardCore筆記——開篇:基于asp.net core的OrchardCore

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more