博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker网络模式
阅读量:2068 次
发布时间:2019-04-29

本文共 3037 字,大约阅读时间需要 10 分钟。

序言

       我们在创建了Docker镜像后,容器的启动需要设置--net 的值,默认是bridge(可设置成host,这种最省事).

       其实这里面有坑,我遇到的问题就是,实例化容器在启动的时候要访问mysql,redis等其它镜像的时候,会显示连接不上的情况.那这种情况就需要了解下Docker的4中网络模式以及相应的系统对应调整.

 

参考资料:

 

Docker的四种模式

  • none模式: 使用--net=none指定,该模式关闭了容器的网络功能
  • host模式:   使用--net=host指定,容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
  • bridge模式:   使用--net=bridge指定,默认设置 ,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信(注意这的需要配置iptabes nat 才能与宿主通信!!!!cuiyaonan2000@163.com)。
  • container模式:  使用--net=container:NAME_or_ID指定,创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围(这个的应用场景比较少)

Docker 安装时会自动在 host 上创建三个网络,使用 docker network ls 命令查看:

Host模式

Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择 host 网络。(最大的好处就是遇到问网络问题的时候就加上 --net host)

Docker host 的另一个用途是让容器可以直接配置 host 网路。比如某些跨 host 的网络解决方案,其本身也是以容器方式运行的,这些方案需要对网络进行配置,比如管理 iptables。(少见的功能特性,很大概率用不到)

不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。(这种不变我觉得可以忽略不计,同一台物理机上的多个服务用不同端口也没什么坏处)

 

Bridge模式(默认)

Docker 安装时会创建一个 命名为 docker0 的 linux bridge,默认的地址为172.17.0.1/16

Bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的,但容器通过宿主机的NAT规则后可以访问外网(cuiyaonan2000:这里需要设置规则,否则不能通信)

 

Bridge的实现(其实虚拟机也是这样的的模式~~只不过是VN1和VN8)

  • Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0 和 veth1。而veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。

  • Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0网桥上。保证宿主机的网络报文可以发往 veth0;(veth0就是给host收发信息的网卡)

  • Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到Docker Container网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性(veth1也叫eth0 是容器收发信息的网卡,下图 veth少加了1)

 

Bridge桥接模式的缺陷

  • .该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。
  • 虽然 NAT 模式经过中间处理实现了这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。(host模式不也要竞争端口么,那host更好)
  • 另外 NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。(host速度更好)

 

示例

首先创建一个容器并运行

#启动一个容器docker run --name cuiyaonan2000 -d cuiyaonan2000:1.0#进入容器sh环境 查看网络环境#进入后可以使用 java --version命令 或者ping 命令172.17.0.1 看是否能连接宿主机器docker exec -it cuiyaonan2000 sh

然后查看网桥(这个网桥很重要 是连接容器与宿主机器的桥梁,如果有问题则会造成,容器不能访问局域网其它的服务或者外部网络环境cuiyaonan2000@163.com,这里很重要)

#查看bridge网络命令  #没有该命令则需要安装 yum install bridge-utilsbrctl show #查看bridge 网络的详细信息docker network inspect bridge

重建Docker网络

pkill docker iptables -t nat -F ifconfig docker0 down brctl delbr docker0 docker -d service docker restart

 

重设网桥(很重要,一般bridge模式出现的网络异常跟这个有关)

这个网桥很重要 是连接容器与宿主机器的桥梁,如果有问题则会造成,容器不能访问局域网其它的服务或者外部网络环境

#首先暂停docker服务,利用指令systemctl stop docker#安装brctlyum install -y bridge-utils#添加网桥brctl addbr br0#添加ip字段,因为这是第二个网桥所以网段要跟第一区分开ip addr add 172.16.0.1/24 dev br0#启用网桥br0ip link set dev br0 up#查看网络br0ifconfig br0

修改docker默认网桥

#没有该文件就创建vim /etc/docker/daemon.json#添加如下的key:value值"bridge":"br0"# 重启dockersystemclt start docker#查看网桥brctl show#查看网桥详情#注意因为修改了默认网桥,就可以不用 我们创建的网桥名称来查看了直接走向默认#bridge可以理解为是个命令,指向当前docker使用的网桥docker network inspect bridge

 

 

解决docker info下部的异常信息

当遇到如下的错误的时候

使用指令vim /etc/sysctl.conf编辑配置文件,在文件中增加以下代码:

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

转载地址:http://obcmf.baihongyu.com/

你可能感兴趣的文章
win10将IE11兼容ie10
查看>>
checkbox设置字体颜色
查看>>
第一篇 HelloWorld.java重新学起
查看>>
ORACLE表空间扩张
查看>>
orcal 循环执行sql
查看>>
web.xml配置监听器,加载数据库信息配置文件ServletContextListener
查看>>
结构型模式之桥接模式(Bridge)
查看>>
行为型模式之状态模式(State)
查看>>
行为型模式之策略模式(Strategy)
查看>>
行为型模式之模板方法模式(TemplateMethod)
查看>>
行为型模式之访问者模式(Visitor)
查看>>
大小端详解
查看>>
source insight使用方法简介
查看>>
<stdarg.h>头文件的使用
查看>>
C++/C 宏定义(define)中# ## 的含义 宏拼接
查看>>
Git安装配置
查看>>
linux中fork()函数详解
查看>>
C语言字符、字符串操作偏僻函数总结
查看>>
Git的Patch功能
查看>>
分析C语言的声明
查看>>