Docker的網絡設定這一部份,在我們使用Docker 時也常會被用到,因為我們啟動了一個long time service 的Docker container之後,如果希望能被其它的Host 連到這個service 就要設定網路這一個部份,如下圖:
例如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,如下圖
就是在相同的 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 如下
EXPOSE 就是宣告有 8080 Port,在執行 Docker Container時需要把它開放出去
2. Build Docker Image 指令如下
3. Build 完 Image 之後,使用以下的指令啟動 Docker Container 指令如下
4. 我們可以使用 docker ps 指令或是 docker port 指令得到對應實體主機隨機產生出來的 Port,指令和畫面如下
2fec91391edb 為 ContainerID。
5. 上個步驟可以得出實體主機對應的 Port 為 32770,因此我們可以用實體主機的IP 和 32770 Port,連到 Tomcat 的 Web 畫面,畫面如下
Example2:
使用 Example1 的 Docker Image,在執行 docker run 時,指定小寫的-p參數,指令如下:
左邊的 8080 Port 代表指定實體主機的 Port,對應到右邊 Container 裡面的 8080 Port,畫面如下:
Example3:
啟動 container1 的 Docker Container,然後再啟動 container2 並且 link 到 container1,最後測試看看直接在 container2 上是否 ping 得到 container1,步驟如下:
1. 啟動 container1 指令如下
2. 開啟另外一個視窗,啟動 container2 指令如下
3. 測試 container2 是否 ping 得到 container1,畫面如下
上面的畫面可以看到 container2 可以 ping 到 container1,並且也會把 container1 的 IP 和 container name 加入到 container2 的 /etc/hosts 檔案裡。
本文介紹了有關於Docker 在執行docker run 時要如何指定對應的port 和如何在Dockerfile 裡面寫Expose 指令,以及也說明如何使用在同一臺實體主機上的Container 之間要如何的連結起來。希望各位看官能有所收穫。
閱讀更多 Java高級開發工程師 的文章