iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 20
1
DevOps

用30天來介紹和使用 Docker系列 第 20

Day20:介紹 Docker 的 Network (一)

  • 分享至 

  • xImage
  •  

Docker的網路設定這一部份,在我們使用 Docker 時也常會被用到,因為我們啟動了一個 long time service 的 Docker container之後,如果希望能被其它的 Host 連到這個 service 就要設定網路這一個部份,如下圖:
https://ithelp.ithome.com.tw/upload/images/20171223/20103456bATaXz4Pcl.png

例如 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,如下圖
https://ithelp.ithome.com.tw/upload/images/20171223/20103456Ji40SGJs1M.png

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

今天要實作的部份如下:

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

  2. 實作讓 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

https://ithelp.ithome.com.tw/upload/images/20171223/201034566TXTdGNmfx.png

$ docker port 2fec91391edb

https://ithelp.ithome.com.tw/upload/images/20171223/20103456HL5tqCdPoi.png

2fec91391edb 為 ContainerID

5. 上個步驟可以得出實體主機對應的 Port 為 32770,因此我們可以用實體主機的IP 和 32770 Port,連到 Tomcat 的 Web 畫面,畫面如下
https://ithelp.ithome.com.tw/upload/images/20171223/201034564ZVM9dz9ow.png

Example2:

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

$ docker run -d -p 8080:8080 tomcatporttest

左邊的 8080 Port 代表指定實體主機的 Port,對應到右邊 Container 裡面的 8080 Port,畫面如下:
https://ithelp.ithome.com.tw/upload/images/20171223/20103456xfGmHWcAqs.png

https://ithelp.ithome.com.tw/upload/images/20171223/20103456LpjjO8iT3T.png

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,畫面如下
https://ithelp.ithome.com.tw/upload/images/20171223/201034563uTD9jXVYe.png

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

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


上一篇
Day19:使用 Docker 的 Volume 來部署 war 檔
下一篇
Day 21:介紹 Docker 的 Network (二)
系列文
用30天來介紹和使用 Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言