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
測試在使用 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 畫面,畫面如下
使用 Example1 的 Docker Image,在執行 docker run
時,指定小寫的-p
參數,指令如下:
$ docker run -d -p 8080:8080 tomcatporttest
左邊的 8080 Port 代表指定實體主機的 Port,對應到右邊 Container 裡面的 8080 Port,畫面如下:
啟動 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 的網路這一部份。