文章背景:
我們在區域網路中使用Docker,最常遇到的一個困惑,就是有時候跨網段結果出現網路不通。原因是因為Docker預設產生的網關和我們的區域網路區域有時候是衝突的,例如在172.16網段的機器上部署Docker,結果產生的docker0網橋是172.17網段,那麼就和真實環境中使用該網段的機器衝突了(即ping不通172.17網段的機器)。
(推薦教學:docker教學)
為了避免衝突,首先想到的是改網關,舉例如下(以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服務正常啟動。
另外:如果只是為了解決IP網段衝突,又不願意操作以上複雜的過程,其實也可以只改/etc/docker/daemon.json,透過加入內容"bip": "ip/ netmask",來實現docker0網橋的網段變更,如下:
[root@iZ2ze278r1bks3c1m6jdznZ ~]# cat /etc/docker/daemon.json { "bip":"192.168.2.1/24" }
以上是修改docker預設網關的詳細內容。更多資訊請關注PHP中文網其他相關文章!