相关阅读:

Docker容器时间与宿主机同步

使用Docker搭建WordPress博客

Docker私有仓库搭建及镜像删除

Docker镜像的导入和导出

在Docker上部署Ambari


博主最近在解决docker与宿主机同网段通信的问题,写此文章记录一下整个过程。

遇到的问题

博主用两台docker容器做datanode,当时配置Docker网络时,使用了Bridge模式,docker0网段(172.0.1.x),宿主机网段(192.1.1.x),使用外部客户端请求下载HDFS文件,去指定的datanode上拉去数据时,外部客户端无法连接到内部的docker容器,抛出的等待超时异常,并重试下载,更换请求的下载地址为可连接的宿主机datanode后, 才成功下载数据。

于是,想要对docker的网络配置进行修改,将docker容器的IP地址设置成与宿主机同网段,并且相互连通。


这里先要来说一下docker网络的四种方式:

1.Host模式:

Host 模式并没有为容器创建一个隔离的网络环境。

该模式下的Docker 容器会和Host宿主机共享同一个网络namespace, Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。

Host模式特点包括:

  • 容器没有隔离的 network namespace
  • 容器的 IP 地址同 Docker host 的 IP 地址
  • 注意:容器中服务端口号不能与Host宿主机上已经使用的端口号相冲突
  • host 模式能够和其它模式共存

2.Container模式

Container网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。

3.None模式

None 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他任何网卡。需要我们自行去配置。

4.Bridge模式

Docker 容器默认使用Bridge模式的网络。

Docker的Bridge模式和VM虚拟机的Bridge模式不同,虽然也叫Bridge,但实质上类似于VM的NAT模式。

原理是在宿主机上虚出一块网卡bridge0,然后所有容器会桥接在这块网卡的网段上。默认情况下容器能访问外部网络,但外部网络无法访问容器,需要通过暴露容器端口的方式(docker run -p)让外部网络访问容器内的服务。


看完了上面的介绍,当前使用的Bridge模式不适合场景,修改网络配置。

写一下曾经试过的几种方法:

注意:

如果你需要宿主机与Docker容器互通,前面两种办法不要试!!!不好使!!!

如果你仅需要Docker容器与宿主机网段相同,容器与其他同网段节点相互通信,不与宿主机进行通信,可以使用第一种方法!!

第一种办法:

创建docker  macvlan

Docker官方在1.12版本之后引入了macvlan网络驱动,可以更简单的为容器配置桥接网络

介绍一下macvlan:

macvlan的原理是在宿主机物理网卡上虚拟出多个子网卡,通过不同的MAC地址在数据链路层进行网络数据转发的,它是比较新的网络虚拟化技术,需要较新的内核支持(Linux kernel v3.9–3.19 and 4.0+)

参数说明:

-d macvlan  创建macvlan网络,使用macvlan网络驱动

–subnet 指定宿主机所在网段

–gateway 指定宿主机所在网段网关

-o parent 继承指定网段的网卡

测试一下:运行容器

使用宿主机去ping 192.168.1.100,这时,问题出现了

目的地址不可达,使用别的机器去ping 192.168.1.100,ping通了,进入容器内,也ping不同宿主机。

使用macVLAN模式的容器,无法ping通宿主机,宿主机也无法ping通该容器,对其他同网段的服务器和容器都可以联通。

第二种办法:

在网上找到的另一种办法,编辑网卡配置文件

重启网络的时候,整个网络都down了,需要去机房弄服务器接显示器修改,查找相关资料的时候,帖子大多是复制粘贴的,不知道该他们真正的试过了没有,此方法并不靠谱。

第三种办法

使用pipework为docker容器配置独立IP

安装pipework

创建两个容器实例,并不需要默认docker0网桥分配的172.17.0.1网段,设置为–net=none

docker run -itd –name test1 –net=none  -h test1 centos /bin/bash

docker run -itd –name test1 –net=none  -h test2 centos /bin/bash

接下来,使用pipework命令为容器设置固定IP

pipework包含了200多行的shell脚本

通过network namespace,veth pair以及linux bridge完成容器网络的设置,执行过程大概包括:

查看主机是否包含br0网桥,如果不存在就创建,向容器实例test1添加一块网卡,并配置固定IP:192.168.1.53,若test1已经有默认的路由,则删除掉,将@后面的192.168.1.1设置为默认路由的网关,将test1容器实例连接到创建的br0上。

进入test1容器中,测试与test2容器和网关的连通性

说明上面的配置没有问题

但是这时,还没有完,宿主机是ping不同容器的

宿主机有两个网卡,em1和em2,em1作为管理口192.168.1.50,em2没有使用,现在,我们只需要将宿主机的em2网卡添加到br0网桥即可

然后再进行相关的测试

使用宿主机去ping 52/53

进入容器去ping宿主机

再使用window主机去测试

到这里,问题总算解决了,在ambari上添加两台新配置的容器节点,并分配datanode角色,将原有的bridge网络节点删除即可,外部客户端请求下载HDFS文件不再抛出异常

注意:pipework目前还有缺陷,容器重启后IP设置会自动消失,需要重新设置。

DOCKER容器与宿主机同网段互相通信相关推荐

  1. Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案

    Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案 参考文章: (1)Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案 (2)https://www.cnbl ...

  2. Doker : Docker 容器与宿主机共享文件

    1.美图 2.概述 docker run-it -v /宿主机绝对路径目录:/容器内目录 镜像名 这样的话,你无论在哪个地方创建文件,都能在对方目录下看到数据 绑定成功的标志

  3. docker 容器访问宿主机的解决方式

    需求 基于本地docker的自研及使用需要,希望docker容器的服务能连接到宿主机提供的服务. 背景 网络上查阅了大量的资料,基本的解决办法是通过手动查阅IP的方式进行, 但docker宿主机的ip ...

  4. docker容器和宿主机的主机名映射失败

    一.为什么将 Oracle 部署在 docker容器中 我们首先通过 docker 安装了 oracle11g 版本的 Oracle 数据库--不要问我为什么通过 docker 安装数据库,正确做法或 ...

  5. Docker1.12让容器使用和宿主机同一个网段

    2019独角兽企业重金招聘Python工程师标准>>> Docker1.12让容器使用和宿主机同一个网段 博客分类: docker 由于开发的一些特殊需求,需要将容器部署在与宿主机同 ...

  6. Docker多台宿主机间的容器互联-centos7

    如果要在生产和测试环境大规模采用docker技术,首先就需要解决不同物理机建的docker容器互联问题.本文介绍在centos7环境下采用open vswitch实现不同物理服务器上的docker容器 ...

  7. docker实现跨宿主机的容器之间网络互联

    背景:最近闲来无事,想到之前开发提出的问题不用k8s那套网络插件如何实现跨宿主机的容器之间网络互联,顺便复习下iptables知识点. docker实现跨宿主机的容器之间网络互联 一. 环境介绍 二. ...

  8. docker容器的网络配置,允许docker可以被宿主机以外的其它主机访问以及局域网内可以直接访问docker容器ip

    自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信. 一.端口映射(局域网,外网 ...

  9. CentOS7使用docker 启动容器后 , 宿主机连接访问不到容器的端口

    CentOS7使用docker 启动容器后 , 宿主机连接访问不到容器的端口 注意第一种方法是在网上找的 , 我并没有执行成功 , 但是他分析的很不错, 可以参考第二种方法 首先需要明确docker的 ...

最新文章

  1. R语言使用randomForest包构建随机森林模型(Random forests)、使用importance函数查看特征重要度、使用table函数计算混淆矩阵评估分类模型性能、包外错误估计OOB
  2. 2014迅雷校园招聘笔试题答案
  3. 还原数据库:The backup set holds a backup of a database other than the existing database……
  4. Android驱动开发之Hello实例
  5. 查找前端依赖 jquery css js 时间控件 不要用远程依赖 会变化的 card
  6. 企业者的福音之8266接入阿里智能,点亮一盏灯
  7. C#求两个日期之间相差的天数和当前日期+30天插入数据库
  8. JSK-27 三值排序【贪心】
  9. Percona5.6.15线程池压力测试
  10. Softwaredistribution与系统瘦身
  11. 粒子特效 代码(龙卷风)
  12. Python学习笔记-北京图灵学院-Python概述-20200525
  13. 人工智能一大技术:强化学习(RL)
  14. 计算机期刊杂志投稿指南
  15. 【QT-3】tableWidget控件
  16. easyUI tree 自定义图标
  17. FPGA的复位设计要醒目点啦
  18. 百度快速收录技巧总结
  19. 解决git报错fatal: Authentication failed for ‘http://10.10.208.29/root/xmh.git/‘
  20. 如何写出三体的MATLAB程序-代码篇

热门文章

  1. JavaScript数据结构和算法简述——数组
  2. 征服 Ajax 应用程序的安全威胁
  3. Oracle及Oracle客户端、PLSQL安装的一些问题
  4. nginx重启、关闭
  5. 【今日CS 视觉论文速览】10 Jan 2019
  6. 2020-python小工能
  7. django-路由传参-视图捕获URL的参数-位置传参-关键词传参
  8. mysql -连表查询
  9. kubernetes之node 宕机,pod驱离问题解决
  10. 悉尼一船只引擎爆炸男子被迫跳水:严重烧伤被送医