热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Dockerbridge模式ping不通宿主机(2021.03.28)

Dockerbridge模式ping不通宿主机(2021.03.28)目录Dockerbridge模式ping不通宿主机(2021.03.28)1.产生环境2.问题描述3.问题分析

Docker bridge模式ping不通宿主机(2021.03.28)

目录



  • Docker bridge模式ping不通宿主机(2021.03.28)

    • 1. 产生环境

    • 2. 问题描述

    • 3. 问题分析

    • 4. 问题解决

    • 5. 问题补充




1. 产生环境



  • CentOS 7.9.2009;

  • Docker 19.03.13;


2. 问题描述

最近笔者在服务器上通过Docker运行某个项目,采用默认的bridge网络并将端口映射到宿主机,结果发现在宿主机上无法访问该端口,通过测试发现宿主机与容器的网络竟然互相ping不通。

Docker网络模式分为四种,一般我们不设置时默认为bridge桥接模式,容器使用独立的network Namespace,并连接到docker0虚拟网卡中。通过docker0网桥以及Iptables nat表配置与宿主机通信。

下面在宿主机上进行复现,利用busybox进行测试:

# 拉取镜像
$ docker pull busybox
# 运行容器
$ docker run -itd --rm --name busy_bridge busybox

通过docker network inspect bridge查看网络情况:

网路配置成功,进入容器内部,通过ifconfig命令查看ip,可以看到已经分配ip,但是ping宿主机ip时失败(此处192.168.0.104为笔者宿主机ip),无法连接外部网络:

但是在自己本地进行相同的测试却发现能够连通网络,这是什么问题导致的呢?


3. 问题分析

在网上找了很多资料都是重启docker,然后就能连上了,一般是因为修改了某个配置然后重启起作用,这里并没有什么作用。修改可总结为以下几种,下面一一展示:



  1. 修改daemon.json配置文件:

    容器内无法访问宿主机是因为网桥分配的网段和宿主机冲突了,需要修改daemon.json配置文件进行指定分配,使用自己熟悉的编辑器修改/etc/docker/daemon.json(没有该文件则手动创建),加入下面的配置;

    {
    "bip": "172.16.10.1/24"
    }

    虽然重启docker并创建容器即可访问,但是,原本宿主机和容器分配的ip一点冲突也没有,该方法不行。



  2. 关闭防火墙:

    容器无法通过网桥访问宿主机,也就无法访问外网,可能是防火墙阻止访问,可以关闭防火墙或者开启某个端口。在服务器上测试,开启防火墙,发现容器确实无法访问百度首页也确实无法访问宿主机,在关闭防火墙并重启docker后,容器就能正常访问了。

    但是,宿主机上的防火墙原本就是关闭的,该方法也没用。



  3. 修改sysctl.conf配置文件:

    docker主机内部网络正常,与其它主机的连接失效,其它主机不能连接docker主机上映射的端口,docker内部也无法连接外部主机,利用docker info指令查看信息发现报错如下:

    WARNING: IPv4 forwarding is disabled
    WARNING: bridge-nf-call-iptables is disabled
    WARNING: bridge-nf-call-ip6tables is disabled

    使用自己熟悉的编辑器编辑/etc/sysctl.conf配置文件,加入以下配置;

    net.bridge.bridge-nf-call-ip6tables=1
    net.bridge.bridge-nf-call-iptables=1
    net.bridge.bridge-nf-call-arptables=1
    net.ipv4.ip_forward=1

    然后使用指令systemctl restart network重启网络,再次查看docker info,警告消失,网络恢复正常。但是宿主机上的容器还是无法通过网桥访问宿主机,无法访问外网。



  4. 重设网桥

    在使用指令yum install bridge-utils安装工具后,利用brctl show查看网桥,可以发现:

    利用docker network create [网桥名]指令新建网桥发现其生成的bridge id还是8000.0000000000,在新网桥上创建容器,再次查看并没有什么变化,说明很可能是网桥的问题。

    再次测试,此时网桥ip172.17.0.1,容器ip172.17.0.2,发现宿主机能ping通网桥,但是无法连接容器,而容器无法连接网桥,无法连接宿主机,更别谈外网了,所以这里可以肯定是网桥出了问题。




4. 问题解决

这里docker network生成新的网桥不行,说明dockernetwork存在问题,我们利用刚才下载的bridge-utils来创建网桥。

首先暂停docker服务,利用指令:

$ service docker stop

添加网桥:

$ brctl addbr br0

添加ip字段:

$ ip addr add 172.16.0.1/24 dev br0

启用网桥:

$ip link set dev br0 up

查看网络br0

修改docker默认网桥,在/etc/docker/daemon.json添加以下字段:

"bridge": "br0"

重启docker

$ service docker start

此时查看网桥:

在没有挂载容器前,依旧是8000.000000000000,运行测试容器:

$ docker run -itd --name busy_test busybox

查看网桥详情:

此时容器挂载在网桥上了,再次查看网桥id

说明已经起作用,进入容器内部测试外网:

成功!


补充:这里使用docker network新建网桥,没有用,发现新建网桥挂载容器后,其bridge id依旧不变,没有起作用,说明宿主机上的docker network可能存在问题。



5. 问题补充

上面的问题是创建自定义网桥,然后在自定义网桥上连接容器ab,结果宿主机无法pingab,且进入容器内部后,两个容器无法ping通自定义网络,但能彼此相通。

查了很多资料,发现了这篇文章。博主说问题原因是系统内核的网桥模块bridge.ko加载失败导致,解决问题的方案是升级内核或升级系统。

升级centos内核参考这篇。

升级完成后,重装Docker,自定义网桥和容器,不再有网络问题。



版权声明:本文为CSDN博主「vilce」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:Docker网桥模式ping不通宿主机



推荐阅读
  • Docker 中创建 CentOS 容器并安装 MySQL 进行本地连接
    本文详细介绍了如何在 Docker 中创建 CentOS 容器,并在容器中安装 MySQL 以实现本地连接。文章内容包括镜像拉取、容器创建、MySQL 安装与配置等步骤。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 本文介绍了如何在 Windows 系统上利用 Docker 构建一个包含 NGINX、PHP、MySQL、Redis 和 Elasticsearch 的集成开发环境。通过详细的步骤说明,帮助开发者快速搭建和配置这一复杂的技术栈,提升开发效率和环境一致性。 ... [详细]
  • 当 EXCLUDE_DEAD 设置为 1 时,为何没有容器被移除? ... [详细]
  • 本文探讨了使用Python进行微服务架构设计的合理性和适用性。首先,介绍了微服务的基本概念及其在现代软件开发中的重要性。接着,通过具体的业务场景,详细分析了Python在微服务架构设计中的优势和挑战。文章还讨论了在实际应用中可能遇到的问题,并提出了相应的解决方案。希望本文能够为从事Python微服务开发的技术人员提供有价值的参考和指导。 ... [详细]
  • 七款高效编辑器与笔记工具推荐:KindEditor自动换行功能解析
    本文推荐了七款高效的编辑器与笔记工具,并详细解析了KindEditor的自动换行功能。其中,轻笔记QingBiJi是一款完全免费的记事本软件,用户可以通过其简洁的界面和强大的功能轻松记录和管理日常事务。此外,该软件还支持多平台同步,确保用户在不同设备间无缝切换。 ... [详细]
  • Docker入门指南:初探容器化技术
    Docker入门指南:初探容器化技术摘要:Docker 是一个使用 Go 语言开发的开源容器平台,旨在实现应用程序的构建、分发和运行的标准化。通过将应用及其依赖打包成轻量级的容器,Docker 能够确保应用在任何环境中都能一致地运行,从而提高开发和部署的效率。本文将详细介绍 Docker 的基本概念、核心功能以及如何快速上手使用这一强大的容器化工具。 ... [详细]
  • Docker镜像加载优化:开发者的高效实践指南
    Docker镜像加载优化:开发者的高效实践指南 ... [详细]
  • 在Docker中,默认情况下,镜像和容器数据存储在`/var/lib/docker`目录下,使用loop设备进行管理。然而,当根分区空间不足时(例如CentOS 7默认安装仅有50GB),可能会导致Docker守护进程启动失败,因为UUID与存储的UUID不匹配。为解决这一问题,可以考虑扩展根分区或更改Docker的数据存储路径,以确保有足够的空间来支持Docker的正常运行。 ... [详细]
  • 大家好,全新的技术专栏《从零开始掌握容器云网络实战》正式上线。该专栏将系统地介绍容器云网络的基础知识、核心技术和实际应用案例,帮助读者全面理解和掌握容器云网络的关键技术与实践方法。 ... [详细]
  • 在Docker容器中,尽管crontab服务已启动且定时任务能够成功添加,但任务却未能如期执行。本文探讨了这一问题的原因,并提出了有效的解决方案与优化策略,确保定时任务在容器环境中稳定运行。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 解读中台架构:微服务与分布式技术的区别及应用
    中心化与去中心化是长期讨论的话题。中心化架构的优势在于部署和维护相对简单,尤其在服务负载较为稳定的情况下,能够提供高效稳定的性能。然而,随着业务规模的扩大和技术需求的多样化,中心化架构的局限性逐渐显现,如扩展性和故障恢复能力较差。相比之下,微服务和分布式技术通过解耦系统组件,提高了系统的灵活性和可扩展性,更适合处理复杂多变的业务场景。本文将深入探讨中台架构中微服务与分布式技术的区别及其应用场景,帮助读者更好地理解和选择适合自身业务的技术方案。 ... [详细]
author-avatar
ThanksGiven
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有