相关文章推荐
深情的煎鸡蛋  ·  the value of the ...·  2 月前    · 
爱热闹的小马驹  ·  IntelliJ ...·  1 年前    · 

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 如下

FROM java
MAINTAINER jack
RUN apt-get update
RUN apt-get install -y wget
RUN cd /
RUN wget http://apache.stu.edu.tw/tomcat/tomcat-7/v7.0.82/bin/apache-tomcat-7.0.82.tar.gz
RUN tar zxvf apache-tomcat-7.0.82.tar.gz
CMD ["/apache-tomcat-7.0.82/bin/catalina.sh", "run"]
EXPOSE 8080

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

2. Build Docker Image 指令如下

$ docker build -t tomcatporttest .

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

$ docker run -d -P tomcatporttest

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

$ docker ps -a
$ docker port 2fec91391edb

2fec91391edb 為 ContainerID

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

Example2:

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

$ docker run -d -p 8080:8080 tomcatporttest

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

Example3:

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

1. 啟動 container1 指令如下

$ docker run -it --name container1 centos /bin/bash

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

$ docker run -it --name container2 --link container1 centos /bin/bash

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

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

今天介紹了有關於 Docker 在執行 docker run 時要如何指定對應的 port 和如何在 Dockerfile 裡面寫 Expose 指令,以及也說明如何使用在同一台實體主機上的 Container 之間要如何的連結起來,明天還會繼續介紹到有關於 Docker 的網路這一部份。