Docker如何修改預設網段
我們在區域網中使用Docker,最常遇到的一個困惑,就是有時候跨網段結果出現網路不通。原因是因為Docker預設生成的閘道器和我們的區域網網段有時候是衝突的,比如在172.16網段的機器上部署Docker,結果生成的docker0網橋是172.17網段,那麼就和真實環境中使用該網段的機器衝突了(即ping不通172.17網段的機器)。為了避免衝突,首先想到的是改閘道器,舉例如下(以Centos為例):
service docker stop # 刪除docker防火牆過濾規則 iptables -t nat -F POSTROUTING # 刪除docker預設閘道器配置 ip link set dev docker0 down ip addr del 172.17.0.1/16 dev docker0 # 增加新的docker閘道器配置 ip addr add 192.168.2.1/24 dev docker0 ip link set dev docker0 up # 檢測是否配置成功,如果輸出資訊中有 192.168.5.1,則表明成功 ip addr show docker0 service docker start # 驗證docker防火牆過濾規則
這麼改完,是否就可靠了?答案是否定的,因為docker重啟後,可能還是會重建docker0,覆蓋我們所做的修改。說明Docker的IP規則就是寫死的,不讓我們隨便更改。但我們就換個思路,直接幹掉docker0,重建一個新的網橋:
首先需要安裝網橋建立工具brctl:
sudo yum install -y bridge-utils
開始建立操作:
# 1.停止 Docker 服務 service docker stop # 2.建立新的網橋(新的網段) brctl addbr bridge0 ip addr add 192.168.2.1/24 dev bridge0 ip link set dev bridge0 up # 3.確認網橋資訊 ip addr show bridge0 # 4.修改配置檔案 /etc/docker/daemon.json(如不存在則建立一個 touch daemon.json),使Docker啟動時使用自定義網橋 { "bridge": "bridge0" } # 5.重啟 Docker service docker start # 確認 NAT 網路路由 iptables -t nat -L -n # 6.刪除不再使用的網橋 ip link set dev docker0 down brctl delbr docker0 iptables -t nat -F POSTROUTING
關於第4步所做的修改配置,就是引用新的網橋,其實還可以在docker配置檔案中引用新的網橋:
echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/sysconfig/docker
sudo service docker start
但是不代表我們一定能看到docker自定義配置檔案,如果沒有default/docker或sysconfig/docker,比較麻煩,解決方法如下:
$ vi /lib/systemd/system/docker.service #新增一行 $ EnvironmentFile=-/etc/default/docker 或者 $ EnvironmentFile=-/etc/sysconfig/docker #-代表ignore error #並修改 $ ExecStart=/usr/bin/docker daemon -H fd:// #改成 $ ExecStart=/usr/bin/docker daemon -H fd:// $DOCKER_OPTS #這樣才能使用/etc/default/docker裡定義的DOCKER_OPTS引數 $ systemctl daemon-reload 過載 $ sudo service docker restart
完成了bridge0的建立和從docker0過度到bridge0,那麼我們就可以route一下,以確認是否有我們不想看到的172.17網段:
只要沒有,那麼我們就不但心和172.17網段的機器連通了。如果還有,那麼再用 ip addr del 172.17.0.1/16 dev docker0,直到清除完畢(因為已經建立新的docker網橋,所以刪除舊的不會影響docker使用)。
如果重啟機器後brctl所建立的網橋可能丟失,那麼我們可以將以下命令寫到linux自啟動指令碼中,每次重啟的時候執行一遍:
brctl addbr bridge0
ip addr add 192.168.2.1/24 dev bridge0
ip link set dev bridge0 up
自啟動指令碼可以通過在/etc/rc.local檔案中新增可執行語句(如 sh /opt/script.sh &)。這樣基本上每次重啟機器後,也能保證bridge0被建立,確保docker服務正常啟動。