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

solenovex發表於2018-11-27

第一篇:把程式碼連線到容器 

第二篇:定製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,網站仍然可以正常訪問:

 

今天先到這。。。

 

相關文章