Docker 的 Network(一)

Docker 的 Network(一)

Docker的網絡設定這一部份,在我們使用Docker 時也常會被用到,因為我們啟動了一個long time service 的Docker container之後,如果希望能被其它的Host 連到這個service 就要設定網路這一個部份,如下圖:

Docker 的 Network(一)

例如Host1 的實體主機需要連線到Host2 的實體主機裡面的Container1,如果在沒有設定網路情況下Host1 連不到Host2,因為Container1 是被保護在Host2 實體機器裡,如果要讓Host1 連到Host2 上,最簡單的方法是先讓Host2 的Port 對應到Container1 的Port,然後Host1 會先連到Host2 實體主機的Port,然後就會對應到Container1 的Port,這樣Host1 就可以連到Host2 上的Container1,這是最常使用的方法。

還有一種做法是直接讓Container 橋接到實體主機網卡的方式,讓Container 能得到一組能讓其它Host 連到的IP,這樣就可以直接被其它的Host 連接到,但這種做法會讓Container 暴露在外,這時侯有必要考慮到安全性上的問題。

另外還有一種需求是 Container1 需要直接連到 Container2,如下圖

Docker 的 Network(一)

就是在相同的 Host 的情況下,如果要讓 Container1 的 Web Server,能連到 Container2 的 db server,可以使用 docker run 的 --link 參數。

今天要實作的部份如下:

在啟動 Container 的時侯設定實體主機 Host 的 Port 對應到 Container 裡面的 Port

實作讓 Container2 可以直接的連到 Container1

Example1:

測試在使用 docker run 指令時參數指定為大寫的 -P,這樣實體主機會隨機的產生一個 Port 對應到 Container 裡面的 Port,但在這之前需要修改一下 Dockerfile,實作的步驟如下:

1. Dockerfile 如下

Docker 的 Network(一)

EXPOSE 就是宣告有 8080 Port,在執行 Docker Container時需要把它開放出去

2. Build Docker Image 指令如下

Docker 的 Network(一)

3. Build 完 Image 之後,使用以下的指令啟動 Docker Container 指令如下

Docker 的 Network(一)

4. 我們可以使用 docker ps 指令或是 docker port 指令得到對應實體主機隨機產生出來的 Port,指令和畫面如下

Docker 的 Network(一)

2fec91391edb 為 ContainerID。

5. 上個步驟可以得出實體主機對應的 Port 為 32770,因此我們可以用實體主機的IP 和 32770 Port,連到 Tomcat 的 Web 畫面,畫面如下

Docker 的 Network(一)

Example2:

使用 Example1 的 Docker Image,在執行 docker run 時,指定小寫的-p參數,指令如下:

Docker 的 Network(一)

左邊的 8080 Port 代表指定實體主機的 Port,對應到右邊 Container 裡面的 8080 Port,畫面如下:

Docker 的 Network(一)

Example3:

啟動 container1 的 Docker Container,然後再啟動 container2 並且 link 到 container1,最後測試看看直接在 container2 上是否 ping 得到 container1,步驟如下:

1. 啟動 container1 指令如下

Docker 的 Network(一)

2. 開啟另外一個視窗,啟動 container2 指令如下

Docker 的 Network(一)

3. 測試 container2 是否 ping 得到 container1,畫面如下

Docker 的 Network(一)

上面的畫面可以看到 container2 可以 ping 到 container1,並且也會把 container1 的 IP 和 container name 加入到 container2 的 /etc/hosts 檔案裡。

本文介紹了有關於Docker 在執行docker run 時要如何指定對應的port 和如何在Dockerfile 裡面寫Expose 指令,以及也說明如何使用在同一臺實體主機上的Container 之間要如何的連結起來。希望各位看官能有所收穫。


分享到:


相關文章: