修改docker預設閘道器

2020-10-26 18:01:45

文章背景:

我們在區域網中使用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網段:

88f63acc160f141f9eae4d142140935.png

只要沒有,那麼我們就不但心和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服務正常啟動。

另外:如果只是為了解決IP網段衝突,又不願意操作以上覆雜的過程,其實也可以只改/etc/docker/daemon.json,通過新增內容 "bip": "ip/netmask",來實現docker0網橋的網段變更,如下:

[root@iZ2ze278r1bks3c1m6jdznZ ~]# cat /etc/docker/daemon.json
{
 "bip":"192.168.2.1/24"
}

以上就是修改docker預設閘道器的詳細內容,更多請關注TW511.COM其它相關文章!