Docker如何修改默认网段

简介: 我们在局域网中使用Docker,最常遇到的一个困惑,就是有时候跨网段结果出现网络不通。原因是因为Docker默认生成的网关和我们的局域网网段有时候是冲突的,比如在172.16网段的机器上部署Docker,结果生成的docker0网桥是172.17网段,那么就和真实环境中使用该网段的机器冲突了(即ping不通172.17网段的机器)。
版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎访问我的博客 https://blog.csdn.net/smooth00/article/details/83023499

       我们在局域网中使用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服务正常启动。

目录
相关文章
|
Docker 容器
docker 修改默认网段
docker 网段冲突,docker 修改默认网段
487 0
|
网络安全 Docker 容器
修改Docker默认的网段
修改Docker默认的网段 背景 一同事在研究他的安全大业,需要在AWS服务器上部署他的秘密武器,秘密武器通过Docker来部署;在部署前可以通过跳板机的内外网ssh登录上这台服务器;部署后只能通过外网ssh登录这台服务器.
1956 0
|
13天前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
11天前
|
Linux iOS开发 Docker
Docker:容器化技术的领航者 —— 从基础到实践的全面解析
在云计算与微服务架构日益盛行的今天,Docker作为容器化技术的佼佼者,正引领着一场软件开发与部署的革命。它不仅极大地提升了应用部署的灵活性与效率,还为持续集成/持续部署(CI/CD)提供了强有力的支撑。
191 69
|
11天前
|
运维 Cloud Native Docker
云原生技术入门:Docker容器化实战
【9月更文挑战第20天】本文将引导你走进云原生技术的世界,通过Docker容器化技术的实战演练,深入理解其背后的原理和应用。我们将一起探索如何在云平台上利用Docker简化部署、扩展和管理应用程序的过程,并揭示这一技术如何改变现代软件的开发和运维模式。
|
6天前
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
25 4
|
4天前
|
Kubernetes Linux 开发者
深入探索Docker容器化技术的奥秘
深入探索Docker容器化技术的奥秘
15 1
|
7天前
|
存储 Docker 容器
Docker中容器间的通信方式有哪些13
Docker中容器间的通信方式有哪些13
14 4