Docker如何修改默认网段
我们在局域网中使用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服务正常启动。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Docker容器加载宿主机的hosts解析
前言 公司一直在用传统的tomcat下丢war包的架构体系,随着项目的增多、服务器数量的增多、需要为此花费很多时间在不同服务器的系统环境问题上。为了技术的与时俱进和工作的运维效率等方面,笔者引入docker容器部署方式,通过Gitlab+Jenkins+Harbor体系,通过Dockerfile生成自定义镜像并放置Harbor仓库,Jenkins加上自定义Shell脚本(实现拉镜像,启动容器,容器映射端口固定,自定义日志路径)等,基本实现了持续集成的自动化部署。在测试环境试用了一段时间,发现效果还不错,但近来却发现容器中应用有报错,根据报错信息定位到容器中hosts文件解析问题。 解决 于是乎,通过各种试验,找到了解决方案,即在docker容器启动时通过---add-host方式加载宿主机的解析到容器中,如下: /usr/bin/docker run -d \ -p 8888:7001 \ -p 9999:37001 \ -v /webapps/health_record\.war:/usr/local/tomcat-7001/webapps/health_record\.war \ ...
- 下一篇
OSCAR开源先锋日 | 双 11 背后的技术支撑:百万级规模下的阿里开源容器技术
容器技术已然成为企业数据中心的标配技术,企业通过容器技术尝试快速交付业务,然而事实上目前仍未达到容器技术在企业中迅速铺开的阶段。如何通过高效可靠的容器技术,帮助企业迅速实现内部存量应用的容器化,以及提供安全隔离性强的环境,依然是容器技术急需解决的难题。 PouchContainer 是阿里巴巴集团开源的高效、轻量级企业级富容器引擎技术,拥有隔离性强、可移植性高、资源占用少等特性。可以帮助企业快速实现存量业务容器化,同时提高超大规模下数据中心的物理资源利用率。 PouchContainer 源自阿里巴巴内部场景,诞生初期,在如何为互联网应用保驾护航方面,倾尽了阿里巴巴工程师们的设计心血。PouchContainer 的强隔离、富容器等技术特性是最好的证明。在阿里巴巴的体量规模下,PouchContainer 对业务的支撑得到双 11 史
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- 2048小游戏-低调大师作品