1. 程式人生 > >Docker & ASP.NET Core (4):容器間的連接

Docker & ASP.NET Core (4):容器間的連接

nbsp ati driver 橋接網絡 pos 客戶 不同 sta 監聽

原文:Docker & ASP.NET Core (4):容器間的連接

第一篇:把代碼連接到容器

第二篇:定制Docker鏡像

第三篇:發布鏡像

Docker容器間的連接

Docker提供了兩種方式可以用來做容器間的連接/通信:

  • Legacy Linking:這種方式使用容器名進行連接,實際上它創建了一個橋接的網絡,在這個網絡裏,容器間可以進行通信。
  • 把容器添加到橋接網絡:這種方式是創建了一個自定義的橋接網絡,它的類型是isolated network(隔離網絡),只有在這個網絡裏的容器才能互相通信。

Legacy Linking

Legacy Linking,也就是按照容器名進行連接。

要想使用Legacy Linking,總共分這幾步:

  1. 運行一個容器,需要給容器起一個名字
  2. 通過容器名,連接到正在運行的容器
  3. 如果還有其它容器要通信,那麽重復上述步驟即可。

準備數據庫項目

我準備使用ASP.NET Core做一個Web應用,數據庫使用PostgreSQL,應用和數據庫分別放在兩個不同的容器裏。

先弄數據庫:

https://store.docker.com/images/postgres

docker pull postgres

然後運行容器,別忘了起名:

技術分享圖片

這裏設置了POSTGRES_PASSWORD這個環境變量,它在容器裏就是數據庫的密碼。

準備ASP.NET Core MVC項目

然後再建立一個ASP.NET Core 項目:

就選擇ASP.NET Core MVC模板,不帶身份驗證,建立一個項目即可。

然後需要添加Npgsql.EntityFrameworkCore.PostgreSQL這個庫。

建立DbContext:

技術分享圖片

在Startup裏配置:

技術分享圖片

配置連接字符串:

技術分享圖片

設置自動遷移,並添加種子數據:

技術分享圖片

去掉HTTPS相關設置,讓其監聽5000端口:

技術分享圖片

然後添加一個Migration:

技術分享圖片

創建ASP.NET Core Web應用的容器

建立Dockerfile:

技術分享圖片

創建鏡像:

技術分享圖片

運行容器:

技術分享圖片

在這裏, --link my-postgres:postgres-server 就是通過容器名連接到了my-postgres這個容器,連接之後把該my-postgres這個容器名映射為postgres-server這個名稱,這個名稱和連接字符串裏的HOST的名字一致:

技術分享圖片

看一下正在運行的容器:

技術分享圖片

可以看到數據庫和Web應用的容器都在運行。

連接到正在運行的數據庫容器

我想看一下在數據庫容器裏是否成功創建了Students表,以及裏面是否有種子數據了。可以使用:

docker exec 容器名/ID 命令,來對容器執行某個命令。

這裏我這樣寫:

技術分享圖片

進入交互模式,並打開bash。

技術分享圖片

可以看到種子數據已經添加成功了。

查看Web應用的Log

使用docker logs 容器名/ID來查看log:

技術分享圖片

應該沒問題。

最後訪問http://localhost:5000:

技術分享圖片

可以看到,web應用和數據庫兩個容器之間已經正常的連接並運行了。

容器網絡

技術分享圖片

容器的網路,或者叫橋接的網絡。

可以這樣想,在一個Docker Host裏,有許多容器,他們之間需要相互通信。我們可以使用容器名進行通信,尤其是開發的時候。

但是當容器比較多的時候,你可能就傾向於對一些容器進行隔離,或者叫做分組。

而我們通過Docker客戶端就可以創建這種隔離的網絡。每一個隔離網絡裏的容器可以相互通信,這時也使用容器名進行通信。

有了這種隔離的網絡,對容器間的通信管理就方便多了。

創建容器網絡的步驟

  • 首先,創建一個自定義的橋接網絡
  • 然後,讓容器運行於這個自定義的橋接網絡。也可以讓一個容器運行於多個網絡中。

使用這個命令創建網絡:

docker network create --driver bridge 網絡名

這句話就是使用橋接網絡來建立一個自定義網絡。

技術分享圖片

然後我讓容器加入到這個網絡裏。其命令大致如下:

docker run -d --network=網路名 --name 網絡內的容器名 鏡像名

首先為了演示方便,我把其余的容器都刪掉了:

技術分享圖片

然後,我把現有的網絡列舉一下。docker network ls:

技術分享圖片

可以看到之前建立的my-net也在裏面。

我們也可以inspect一下這個網絡:

技術分享圖片

可以看到裏面還沒有任何的容器。

然後,我運行postgres的容器,讓其加入該網絡:

技術分享圖片

這時再次inspect該網絡,可以看到這個容器已經進入網絡了:

技術分享圖片

然後再把ASP.NET Core應用的容器添加到該網絡:

技術分享圖片

註意這裏不需要使用--link了。

再次inspect該網絡:

技術分享圖片

可以看到裏面有兩個容器了。

然後訪問http://localhost:5000,網站仍然可以正常訪問:

技術分享圖片

今天先到這。。。

Docker & ASP.NET Core (4):容器間的連接