热门标签 | 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不通宿主机



推荐阅读
  • Ralph的Kubernetes进阶之旅:集群架构与对象解析
    本文深入探讨了Kubernetes集群的架构和核心对象,详细介绍了Pod、Service、Volume等基本组件,以及更高层次的抽象如Deployment、StatefulSet等,帮助读者全面理解Kubernetes的工作原理。 ... [详细]
  • 本文探讨了在Linux系统上使用Docker时,通过volume将主机上的HTML5文件挂载到容器内部指定目录时遇到的403错误,并提供了解决方案和详细的操作步骤。 ... [详细]
  • 本文探讨如何配置 Nginx 以将传入请求反向代理到运行在本地绑定端口上的 Docker 容器,并解决常见的路径重定向问题。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • 本文详细介绍了如何使用Docker运行最简单的镜像,并创建第一个容器。通过具体的操作步骤和命令解释,帮助初学者快速上手Docker。完整课程请点击:Docker入门教程。 ... [详细]
  • 探讨在开发、学习和实验过程中,使用 VMware 和 Docker 的优劣,帮助用户根据具体需求做出最佳选择。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • 深入解析Docker镜像的工作机制
    本文旨在深入探讨Docker镜像的内部结构及其工作机制,包括镜像的分层体系、联合文件系统(UnionFS)的应用,以及各层如bootfs和rootfs的具体作用。 ... [详细]
  • 本文档详细介绍了如何构建和配置 EFKLK(Elasticsearch, Fluentd, Kibana, Kafka)日志采集工具链,包括命名空间创建、Elasticsearch 镜像拉取与容器运行、证书生成及配置、Helm 安装等步骤。 ... [详细]
  • NFS(Network File System)即网络文件系统,是一种分布式文件系统协议,主要用于Unix和类Unix系统之间的文件共享。本文详细介绍NFS的配置文件/etc/exports和相关服务配置,帮助读者理解如何在Linux环境中配置NFS客户端。 ... [详细]
  • 本文提供了在 Kali Linux 2020.01 x64 版本上安装 Docker 的详细步骤,包括环境准备、使用清华大学镜像源、配置 APT 仓库以及安装过程中的常见问题处理。 ... [详细]
  • 本文详细介绍了 Kubernetes 集群管理工具 kubectl 的基本使用方法,涵盖了一系列常用的命令及其应用场景,旨在帮助初学者快速掌握 kubectl 的基本操作。 ... [详细]
  • 本文将指导您如何在Docker环境中高效地搜索、下载Redis镜像,并通过指定或不指定配置文件的方式启动Redis容器。同时,还将介绍如何使用redis-cli工具连接到您的Redis实例。 ... [详细]
  • 本文介绍了如何在Mac操作系统中实现对NTFS文件系统的完整读写功能,包括必要的软件安装步骤和配置方法。 ... [详细]
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社区 版权所有