1. 程式人生 > >Docker如何修改預設網段

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服務正常啟動。