Docker 中為 Container 指定真實IP地址 – 使用 pipework

設情況下 Container 的網路是 NAT 環境,外部網路要連線到 Container 中的某個 port 得在啟動 Container 時加入 -p 指令轉發 port 到我們的 HOST 上,

如果有複數的容器同時使用 80 port 就必須將 port 號分別轉發在 HOST 的不同 port 號上,實際上線時我們不希望使用者拜訪的時候還得在網址最後加上如 :8080 這些 port 號。

這時候,就會希望 Container 有一個像 VirtualBox 的 Ghost OS 一樣可以訪問的 IP 地址。

 

一開始我按照 Docker 的文檔,在 HOST 建立了一個 bridge 介面和實體網卡做鏈結,然後再將 Docker 預設的 bridge 換成這個新設定的 bridge,雖然可以讓 Container 實際可以拿到一個對外 IP 位址,但是設定上實在有點囉嗦,在 Container 很多的情況下其實不好處理…

Google 一下,發現 GitHub 上有一個叫 pipework 的 shell script 可以幫我快速設置這些繁瑣的步驟…而且只需一行指令

 

準備工作

先到 pipework 整包專案下載回來,並解壓縮

wget https://github.com/jpetazzo/pipework/archive/master.zip
unzip master.zip -d ./

然後會在你當前目錄下產生 /pipework-master 資料夾,pipework 的 script 已經設定成可執行屬性了。

 

啟動容器

這邊我使用 mysql:latest wordpress:latest 這兩個 image 組合做為範例

首先啟動容器的方式和原本都沒有任何差異,不需做任何修改

sudo docker run --name myDB -e MYSQL_ROOT_PASSWORD=1234 -d mysql
sudo docker run --name myWP --link myDB:mysql -d wordpress

 

 Pipework

容器啟動好之後,我們只須用一行指令便可為容器指定 IP 地址

這邊我們只需要 WordPress 是可以被訪問的,所以只需為 myWP 設定一個 IP 地址

sudo ./pipwork eth0 myWP 192.168.1.123/24

#請將 eth0 換成你的實體網卡介面名稱

#IP 地址請依照網路環境自行更改,可以是 private ip 或者 public ip

最後從私有網路內任一台電腦直接瀏覽 192.168.1.123 就可看到 wordpress 初次安裝的設定介面了!

 

設定清理

開發者可能會問,如果我的 Container 關掉了,經由 pipwork 的設定還會存在我的 HOST 當中嗎?

在作者的網站中提到,當 Container 終止進程,會自動將設定做垃圾回收

這部分我就沒有實驗過啦…

Likol

哈囉!

You may also like...

7 Responses

  1. Pigo Chu表示:

    我想要問一下 , 非關 gitlab
    假如 container 另外開 ip 且 ssh port 22 打開了,那可以用一般的 ssh login 進入 container 嗎 ? 該 container 是會吃甚麼帳號啊 ?

    • likol1227表示:

      container 的環境是與 HOST 隔離的,要 SSH 進去當然 container 中得要有 SSH 服務 , 吃的帳號也是 container 自己本身的

  2. 鴻毅 鄭表示:

    你好
    先感謝您 我也剛好在尋找這方面的作法
    我想請問一下關於你一開始做的自訂bridge
    是類似這篇的操作嗎?
    https://philipzheng.gitbooks.io/docker_practice/content/advanced_network/bridge.html

  3. Likol表示:

    Hello, 文章中沒有提到自訂 bridge 的作法 (實際上也沒有用上)
    不過如果按照我的方式讓容器依靠Host去取得IP會產生一個問題, 就是Host 沒辦法直接由容器取得的同網段IP 存取到容器
    如果你的問題是這個的話可以參考 https://github.com/jpetazzo/pipework#let-the-docker-host-communicate-over-macvlan-interfaces
    自訂一個 bridge 解決這個問題

    • 鴻毅 鄭表示:

      我指的是你最前面提到的
      “一開始我按照 Docker 的文檔,在 HOST 建立了一個 bridge 介面和實體網卡做鏈結,然後再將 Docker 預設的 bridge 換成這個新設定的 bridge,雖然可以讓 Container 實際可以拿到一個對外 IP 位址,但是設定上實在有點囉嗦,在 Container 很多的情況下其實不好處理…”
      我不太了解說
      docker本身預設的bridge沒辦法取得IP
      怎麼新增的就可以
      這部份可以請您解釋這兩個bridge的差異嗎?
      還是就單純docker預設的bridge並沒有跟實體網卡有鏈結@@?

      • Likol表示:

        容器預設的 bridge 是透過 NAT 的方式走 HOST 本身的 route 規則出去, 就像是一般家裡的IP分享器那樣運作, 外部無法直接存取到容器網路, 必須倚靠 port forwarding
        既然是自訂的 bridge 那當然可以讓內部網路依我們設定的方式運轉囉
        其實最新版的 Docker 1.9.0 多了一個強大的網路設定功能, 你上面貼的 gitbook 還沒 update, 不妨到官方網站上看看…

發佈留言