第一篇:把程式碼連線到容器
第二篇:定製Docker映象
第三篇:釋出映象
Docker容器間的連線
Docker提供了兩種方式可以用來做容器間的連線/通訊:
- Legacy Linking:這種方式使用容器名進行連線,實際上它建立了一個橋接的網路,在這個網路裡,容器間可以進行通訊。
- 把容器新增到橋接網路:這種方式是建立了一個自定義的橋接網路,它的型別是isolated network(隔離網路),只有在這個網路裡的容器才能互相通訊。
Legacy Linking
Legacy Linking,也就是按照容器名進行連線。
要想使用Legacy Linking,總共分這幾步:
- 執行一個容器,需要給容器起一個名字
- 通過容器名,連線到正在執行的容器
- 如果還有其它容器要通訊,那麼重複上述步驟即可。
準備資料庫專案
我準備使用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,網站仍然可以正常訪問:
今天先到這。。。