修改docker默认网关


本文摘自PHP中文网,作者V,侵删。

文章背景:

我们在局域网中使用Docker,最常遇到的一个困惑,就是有时候跨网段结果出现网络不通。原因是因为Docker默认生成的网关和我们的局域网网段有时候是冲突的,比如在172.16网段的机器上部署Docker,结果生成的docker0网桥是172.17网段,那么就和真实环境中使用该网段的机器冲突了(即ping不通172.17网段的机器)。

(推荐教程:docker教程)

为了避免冲突,首先想到的是改网关,举例如下(以Centos为例):

1

2

3

4

5

6

7

8

9

10

11

12

13

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:

1

sudo yum install -y bridge-utils

开始创建操作:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

# 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配置文件中引用新的网桥:

1

2

echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/sysconfig/docker

sudo service docker start

但是不代表我们一定能看到docker自定义配置文件,如果没有default/docker或sysconfig/docker,比较麻烦,解决方法如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

$ 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自启动脚本中,每次重启的时候执行一遍:

1

2

3

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网桥的网段变更,如下:

1

2

3

4

[root@iZ2ze278r1bks3c1m6jdznZ ~]# cat /etc/docker/daemon.json

{

 "bip":"192.168.2.1/24"

}

以上就是修改docker默认网关的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

Docker容器如何升级

无法重启Docker服务怎么办

如何解决Docker端口映射时ipv4无法使用

如何在ubuntu环境下安装Docker

如何解决在Docker中pull拉取镜像失败

怎么重启Docker的普通用户?

Docker如何设置http代理

教你怎么在项目中使用powershell,bash和Docker

如何把jar包做成Docker镜像

Docker安装及配置oracle

更多相关阅读请进入《Docker》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...