這篇文章主要介紹了如何綁定Dokcer容器到主機指定網卡,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
如果你的主機有多塊網卡,你可能會需要把 Docker 容器綁定到指定網卡,以使容器內的所有網絡請求都經過該指定網卡發送至外網。
不幸的是,Docker 并沒有直接提供實現該需求的方法。不過,通過 iptables 可以輕松搞定。
一刀切
假設你的主機上有兩塊網卡:一塊網卡的 IP 地址是 192.168.0.100 ;另一塊網卡的 IP 地址是 10.0.0.100 。你想讓這臺主機上的 Docker 容器內的所有服務都走第二塊網卡進出外網。
先給出答案再解釋:
iptables -t nat -I POSTROUTING -p all -s 172.17.0.0/16 -j SNAT --to-source 10.0.0.100
上面的 iptables 命令創建了一條源地址轉換( SNAT )規則,把所有來自 172.17.0.0/16 網段且即將流出本主機的數據包的源 IP 地址都修改為 10.0.0.100 。
對于 10.0.0.100 我們知道它是主機第二塊網卡的 IP 地址。而 172.17.0.0/16 是從哪來的呢?
簡單來說,在主機上運行 Docker 時,它會在主機上創建一個名為 docker0 的網橋,其 IP 地址為 172.17.0.1 ,網段為 172.17.0.0/16 。默認情況下,Docker 會為所有容器從該網段分配一個 IP 地址。
更詳細的說明,可以參考這篇《單 Host 下 Docker 的默認網絡配置》 。
所有 Docker 容器的 IP 地址都是在 172.17.0.0/16 網段,那么,上邊的 iptables 命令創建的規則就是把所有來自 Docker 容器的且即將流出本主機的數據包的源 IP 地址都修改為本主機的第二塊網卡的 IP 地址,即 10.0.0.100 。
這樣,就實現了我們需求的『出』這半部分。
而『進』那半部分需求的實現也很簡單,只需在 docker run 的時候通過 -p 參數指定主機 IP 即可,如:
docker run -p 10.0.0.100:80:80 ...
分而治
需求變化很快,或許我們又多了一塊網卡,其 IP 地址為 10.0.0.101 。而由于某種原因,我們想讓一部分容器的流量走第二塊網卡,同時讓另一部分容器的流量走新加的這第三塊網卡。
由于在使用默認網橋時,Docker 不允許為容器指定 IP 地址(如果你指定 IP 地址,Docker 會給出如下錯誤提示),所以我們無法提前預知某個容器最終被分配給的 IP 地址是什么,也就無法提前通過 iptables 規則為其指定出口網卡。
docker: Error response from daemon: user specified IP address is supported on user defined networks only.
其實,上面的錯誤提示已經給出了解決的辦法,那就是用戶自定義網絡。
用以下命令創建自定義網絡:
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" docker1
其中,172.18.0.0/16 為新建網橋所在網段。因為 Dokcer 默認網橋已經占用了 172.17.0.0/16 ,所以新建網橋只能使用未被占用的其他網段。
第一個 docker1 為執行 ifconfig -a 命令時,顯示的網橋名,如果不使用 --opt 參數指定此名稱,那你在使用 ifconfig -a 命令查看網絡信息時,看到的是類似 br-110eb56a0b22 這樣的名字。這顯然不怎么好看/記;
第二個 docker1 為執行 docker network list 命令時,顯示的網橋名。
有了自定義網絡,我們就可以為容器指定一個固定 IP 地址了。
docker run --network=docker1 --ip=172.18.0.100 ...... docker run --network=docker1 --ip=172.18.0.101 ......
知道了容器的固定 IP 地址,那我們就可以如法炮制,把該容器綁定到指定主機網卡了:
iptables -t nat -I POSTROUTING -p all -s 172.18.0.100 -j SNAT --to-source 10.0.0.100 iptables -t nat -I POSTROUTING -p all -s 172.18.0.101 -j SNAT --to-source 10.0.0.101
需要注意的是,這里的 -s 選項后面跟的參數是 IP 地址,而不是網段了。
其他相關命令
查看 iptables 規則
iptables -t nat -L -n --line-number
刪除 iptables 規則
iptables -t nat -D POSTROUTING 11
其中,最后的 11 是要刪除的規則序號(num)。
刪除 Docker 自定義網絡
docker network rm docker1
感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何綁定Dokcer容器到主機指定網卡”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。