NetCore微服務入門全紀錄(八)Docker與容器網絡

2020-09-10 日行四善

前言

上一篇【.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: &39; 服務 auth: 34;auth&構建 context: . Dockerfile文件目錄 ports: 39;9080:9080&容器外部9080 容器內部9080 environment: 程序在容器內部http://+:9080運行 也可以寫成http://0.0.0.0:9080 networks: 自定義網絡my-net web: 34;web&39;5000:5000&&34;服務依賴於&34;服務和&34;服務,此服務會在依賴服務之後執行 - auth - apigateway apigateway: 34;apigateway&39;9070:9070&定義&34;服務 對應的產品服務項目 image: productapi 39;9050:9050&程序參數 - ConsulSetting:ServicePort=9050 指定鏡像名稱為productapi,productapi1服務中已經構建了productapi鏡像,所以不用重複構建 ports: - &39; environment: - ASPNETCORE_URLS=http://+:9051 - ConsulSetting:ServiceIP=productapi2 - ConsulSetting:ServicePort=9051 networks: - my-net depends_on: - productapi1 productapi3: image: productapi ports: - &39; 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: - &39; environment: - ASPNETCORE_URLS=http://+:9060 - ConsulSetting:ServiceIP=orderapi1 - ConsulSetting:ServicePort=9060 networks: - my-net depends_on: - consul - postgres - rabbitmq orderapi2: image: orderapi ports: - &39; environment: - ASPNETCORE_URLS=http://+:9061 - ConsulSetting:ServiceIP=orderapi2 - ConsulSetting:ServicePort=9061 networks: - my-net depends_on: - orderapi1 orderapi3: image: orderapi ports: - &39; environment: - ASPNETCORE_URLS=http://+:9062 - ConsulSetting:ServiceIP=orderapi3 - ConsulSetting:ServicePort=9062 networks: - my-net depends_on: - orderapi1 consul: image: consul 39;8500:8500&定義容器網絡 my-net: 網絡模式為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中,那就不能寫localhost,host.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.cnblogs.com/xhznl/p/13268940.html

相關焦點

  • 容器微服務和持續集成,(三)微服務docker容器部署
    繼前面兩篇,對Spring Cloud和容器的介紹後,大家應該了解了微服務的基礎。今天整理和介紹Spring Cloud的容器化部署。後面幾篇將介紹持續集成Gitlab和Jenkins,歡迎朋友們關注。
  • NetCore微服務入門全紀錄(六)EventBus事件總線
    前言上一篇【.Net Core微服務入門全紀錄(五)——Ocelot-API網關(下)】中已經完成了Ocelot + Consul的搭建,這一篇簡單說一下EventBus。分布式事務並不是微服務獨有的問題,而是所有的分布式系統都會存在的問題。關於分布式事務,可以查一下「CAP原則」和「BASE理論」了解更多。當今的分布式系統更多的會追求事務的最終一致性。下面使用國人開發的優秀項目「CAP」,來演示一下EventBus的基本使用。
  • NetCore微服務入門全紀錄(七)Identity授權認證
    前言上一篇【.Net Core微服務入門全紀錄(六)——EventBus-事件總線】中使用CAP完成了一個簡單的Eventbus,實現了服務之間的解耦和異步調用,並且做到數據的最終一致性。這個項目也不放docker了,直接用vs來啟動,讓他運行在9080埠。
  • 容器微服務和持續集成,(二)docker容器介紹和安裝部署
    繼上一篇,介紹Spring Cloud的搭建部署後,今天講一下Docker容器。既然是容器微服務,那麼容器就是整個微服務架構的基礎,容器的學習就顯得尤為重要。(3)Docker 容器Docker 容器和文件夾很類似,一個Docker容器包含了所有的某個應用運行所需要的環境。每一個 Docker 容器都是從 Docker 鏡像創建的。Docker 容器可以運行、開始、停止、移動和刪除。每一個 Docker 容器都是獨立和安全的應用平臺,Docker 容器是 Docker 的運行部分。
  • Docker(一):Docker入門教程
    在雲服務概念興起之後,Docker的使用場景和範圍進一步發展,如今在微服務架構越來越流行的情況下,微服務+Docker的完美組合,更加方便微服務架構運維部署落地。本文詳細解釋介紹Docker入門相關內容,後期重點關注Docker在微服務體系中的使用。在了解Docker之前我們先考慮幾個問題:1、Docker是什麼?2、為什麼要使用Docker,它有什麼優勢?
  • Docker入門知識|Docker資源容器 與 VM虛擬機的區別與聯繫
    在雲服務理念興起之後,Docker的使用場景和範圍進一步得到發展,如今微服務架構又流行起來,微服務+Docker再次成為完美組合,快速交付、快速布署、簡捷運維部署一股腦兒就落地了。另外的優勢就是,Docker 的接口相當簡單,用戶可以方便地創建和使用容器,把自己的應用放入容器。利用容器接口還可以進行版本管理、複製、分享、修改,就像管理普通的代碼一樣方便快捷,當然前提是你必須學好docker的所有知識。為什麼要優先使用Docker,而不是虛擬機呢?在性能上講,容器除了運行其中應用外,基本不消耗額外的系統資源。
  • docker系列之容器網絡
    眾所周知,當你在創建docker時,會創建默認的三個網絡,可使用docker network ls查看網絡。bridge:默認的docker連接網絡,如果不適用--network=<NETWORK> 則默認會連接到此網絡。可使用ip add show (簡寫 ip a)顯示網橋信息。none:是將容器添加到容器特定的網絡,該容器缺少網卡。進入到一個網絡為none的容器將會有如下的信息。
  • 如何快速打通 Docker 鏡像發布流程?
    docker鏡像由多層組成,不同的鏡像都能使用相同的父鏡像作為他們的基礎鏡像,這些相同的基礎鏡像在docker的角度來看就是完全相同的層。在docker鏡像的傳輸過程中,當某些相同的層已經存在的時候,就完全不需要重新傳輸了,這大大提高了鏡像在網絡上的傳輸效率。分層的設計不僅使鏡像分發更高效,也有利於減少鏡像的存儲空間。
  • 打好實戰基本功,大佬推薦的11本docker編程入門書目
    一分鐘了解本書精華內容 容器技術與Docker概念 認識容器技術 Docker基本概念 安裝和測試Docker Docker基礎知識 Docker操作命令 鏡像的結構 鏡像的拉取、修改與刪除 鏡像的體積控制 鏡像的推送 容器的遷移與提交 鏡像倉庫 數據卷操作 容器網絡操作 Docker進階實戰 作業系統鏡像構建 Web服務鏡像構建 資料庫鏡像構建 Compose與Machine 程式語言 Docker
  • 「艾編程教程」微服務為什要用docke?什麼是docker?
    微服務為什麼一定要用docker?今天通過一篇文章為大家分享docker入門詳解,歡迎大家一起閱讀!一、微服務架構介紹1. 通過將功能分解到各個離散的服務中以實現對解決方案的解耦。2.微服務(Microservice)這個概念是2012年出現的,作為加快Web和行動應用程式開發進程的一種方法,2014年開始受到各方的關注,而2015年,可以說是微服務的元年;二. 傳統開發模式和微服務的區別:1.
  • Docker 網絡模式詳解及容器間網絡通信
    通過 docker network connect 網絡名稱 容器名稱 為容器連接新的網絡模式。  通過 docker inspect 容器名稱|ID 再次查看容器的網絡信息,多增加了默認的 bridge。
  • 微服務部署到docker中
    一、Visual Studio 2019創建微服務1.可以看到項目根目錄下新增一個名為Dockerfile的文件6.通過Xftp將項目從Windows下的磁碟位置拷貝到Linux的root目錄下二、Linux下通過Docker構建應用1.通過Xshell連接上Linux虛擬機,進入到項目目錄下,然後通過docker
  • Docker網絡
    docker 網絡docker網絡>場景假如目前我們有很多的容器實例,微服務群,各個服務之間都有相互調用、訪問,實現容器互聯。新建docker網絡我們需要創建一個網絡環境,讓需要相互訪問的服務容器實例都加入到這個網絡環境中,這樣就可以實現,相互訪問調用。
  • IT工程師都需要掌握的容器技術之Docker容器網絡下
    《 》這篇文章我們主要講解了Docker容器網絡基礎,其中網絡的解決方案主要用於解決HOST內的容器通信。本篇文章我們將講解跨主機網絡的容器通信實現,涉及到Docker overlay網絡與MacVlan網絡的解決方案,下面我們就一起來學習吧!
  • 基於Docker Compose的.NET Core微服務持續發布
    那麼,今天就跟大家介紹一下如何使用Docker Compose這個輕量級的編排工具實現.NET Core微服務的持續發布。,可以將多個微服務的定義及部署都規範在一個yml文件中,然後一鍵部署、啟動或銷毀整個微服務應用。
  • 操作 Docker 容器 | Docker 系列
    還有一種方式,使用 docker create 命令創建容器,然後使用 docker start 來啟動容器,兩條命令相當於 docker run 一條,這種方式不常用,就不做更多介紹了。下面聊聊 docker run 背後的故事,到底這一條命令背後,Docker 都為我們做了哪些操作呢?
  • Docker 添加容器到一個網絡
    要創建一個安全並且能夠協同運行的 Web 應用程式,你需要創建一個網絡。通過網絡,在默認情況下為容器提供了完全獨立的環境。在你第一次運行一個容器的時候,你可以將容器添加到一個網絡中。例如,我們希望運行一個容器來運行 PostgreSQL 資料庫,並且傳遞 --net=my_bridge 標記來到你新網絡的連接中,可以運行下面的命令:$ docker run -d --net=my_bridge --name db training/postgres如果你檢查你的
  • IT工程師都需要掌握的容器技術之Docker容器網絡上
    給容器配置none網絡類型後如果有再接入網絡需求可以使用如下命令將容器加入到其它網絡中1. # 將test1容器從網絡none中斷開  2. docker network disconnect none test1  3.   4.
  • Docker 入門教程
    容器還可以進行版本管理、複製、分享、修改,就像管理普通的代碼一樣。五、Docker 的用途Docker 的主要用途,目前有三大類。(1)提供一次性的環境。比如,本地測試他人的軟體、持續集成的時候提供單元測試和構建的環境。(2)提供彈性的雲服務。因為 Docker 容器可以隨開隨關,很適合動態擴容和縮容。(3)組建微服務架構。
  • Docker新手入門之三:Docker容器的基本使用
    我們可以使用如下命令查看當前系統中存在的容器:docker ps -a其中,默認docker ps命令會查詢到所有正在運行的容器,添加參數-a後,則無論是否在運行中,都會被查找到。容器名稱是一個可以替代容器id的有利工具,合理利用容器名稱可以大幅提高工作效率。啟動已停止的容器當一個容器已經停止後,我們可以使用docker start命令來重新啟動該容器。