首頁 >運維 >Docker >修改docker預設網關

修改docker預設網關

王林
王林轉載
2020-10-26 17:00:167190瀏覽

修改docker預設網關

文章背景:

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

修改docker預設網關

只要沒有,那麼我們就不但心和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中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除