預設情況下 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 終止進程,會自動將設定做垃圾回收
這部分我就沒有實驗過啦…
我想要問一下 , 非關 gitlab
假如 container 另外開 ip 且 ssh port 22 打開了,那可以用一般的 ssh login 進入 container 嗎 ? 該 container 是會吃甚麼帳號啊 ?
container 的環境是與 HOST 隔離的,要 SSH 進去當然 container 中得要有 SSH 服務 , 吃的帳號也是 container 自己本身的
你好
先感謝您 我也剛好在尋找這方面的作法
我想請問一下關於你一開始做的自訂bridge
是類似這篇的操作嗎?
https://philipzheng.gitbooks.io/docker_practice/content/advanced_network/bridge.html
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並沒有跟實體網卡有鏈結@@?
容器預設的 bridge 是透過 NAT 的方式走 HOST 本身的 route 規則出去, 就像是一般家裡的IP分享器那樣運作, 外部無法直接存取到容器網路, 必須倚靠 port forwarding
既然是自訂的 bridge 那當然可以讓內部網路依我們設定的方式運轉囉
其實最新版的 Docker 1.9.0 多了一個強大的網路設定功能, 你上面貼的 gitbook 還沒 update, 不妨到官方網站上看看…
原來如此
謝謝您
那我再去研究研究