修改docker默認(rèn)網(wǎng)關(guān)

修改docker默認(rèn)網(wǎng)關(guān)

文章背景:

我們在局域網(wǎng)中使用docker,最常遇到的一個困惑,就是有時候跨網(wǎng)段結(jié)果出現(xiàn)網(wǎng)絡(luò)不通。原因是因?yàn)镈ocker默認(rèn)生成的網(wǎng)關(guān)和我們的局域網(wǎng)網(wǎng)段有時候是沖突的,比如在172.16網(wǎng)段的機(jī)器上部署Docker,結(jié)果生成的docker0網(wǎng)橋是172.17網(wǎng)段,那么就和真實(shí)環(huán)境中使用該網(wǎng)段的機(jī)器沖突了(即ping不通172.17網(wǎng)段的機(jī)器)。

(推薦教程:docker教程

為了避免沖突,首先想到的是改網(wǎng)關(guān),舉例如下(以Centos為例):

service?docker?stop #?刪除docker防火墻過濾規(guī)則 iptables?-t?nat?-F?POSTROUTING #?刪除docker默認(rèn)網(wǎng)關(guān)配置 ip?link?set?dev?docker0?down ip?addr?del?172.17.0.1/16?dev?docker0 #?增加新的docker網(wǎng)關(guān)配置 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 #?驗(yàn)證docker防火墻過濾規(guī)則

這么改完,是否就可靠了?答案是否定的,因?yàn)閐ocker重啟后,可能還是會重建docker0,覆蓋我們所做的修改。說明Docker的IP規(guī)則就是寫死的,不讓我們隨便更改。但我們就換個思路,直接干掉docker0,重建一個新的網(wǎng)橋:

首先需要安裝網(wǎng)橋創(chuàng)建工具brctl:

sudo?yum?install?-y?bridge-utils

開始創(chuàng)建操作:

#?1.停止?Docker?服務(wù) service?docker?stop ? #?2.創(chuàng)建新的網(wǎng)橋(新的網(wǎng)段) brctl?addbr?bridge0 ip?addr?add?192.168.2.1/24?dev?bridge0 ip?link?set?dev?bridge0?up ? #?3.確認(rèn)網(wǎng)橋信息 ip?addr?show?bridge0 #?4.修改配置文件 /etc/docker/daemon.json(如不存在則創(chuàng)建一個?touch?daemon.json),使Docker啟動時使用自定義網(wǎng)橋 ? { ??"bridge":?"bridge0" } #?5.重啟?Docker service?docker?start ???? #?確認(rèn)?NAT?網(wǎng)絡(luò)路由 iptables?-t?nat?-L?-n ? #?6.刪除不再使用的網(wǎng)橋 ip?link?set?dev?docker0?down ? brctl?delbr?docker0 ? iptables?-t?nat?-F?POSTROUTING

關(guān)于第4步所做的修改配置,就是引用新的網(wǎng)橋,其實(shí)還可以在docker配置文件中引用新的網(wǎng)橋:

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參數(shù) ? $?systemctl?daemon-reload?重載 $?sudo?service?docker?restart

完成了bridge0的創(chuàng)建和從docker0過度到bridge0,那么我們就可以route一下,以確認(rèn)是否有我們不想看到的172.17網(wǎng)段:

修改docker默認(rèn)網(wǎng)關(guān)

只要沒有,那么我們就不但心和172.17網(wǎng)段的機(jī)器連通了。如果還有,那么再用 ip addr del 172.17.0.1/16 dev docker0,直到清除完畢(因?yàn)橐呀?jīng)建立新的docker網(wǎng)橋,所以刪除舊的不會影響docker使用)。

如果重啟機(jī)器后brctl所創(chuàng)建的網(wǎng)橋可能丟失,那么我們可以將以下命令寫到linux自啟動腳本中,每次重啟的時候執(zhí)行一遍:

brctl?addbr?bridge0 ip?addr?add?192.168.2.1/24?dev?bridge0 ip?link?set?dev?bridge0?up

自啟動腳本可以通過在/etc/rc.local文件中添加可執(zhí)行語句(如 sh /opt/script.sh &)。這樣基本上每次重啟機(jī)器后,也能保證bridge0被創(chuàng)建,確保docker服務(wù)正常啟動。

另外:如果只是為了解決IP網(wǎng)段沖突,又不愿意操作以上復(fù)雜的過程,其實(shí)也可以只改/etc/docker/daemon.json,通過添加內(nèi)容 “bip”: “ip/netmask”,來實(shí)現(xiàn)docker0網(wǎng)橋的網(wǎng)段變更,如下:

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

以上就是修改

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊11 分享