您当前的位置: 首页 >  网络

cuiyaonan2000

暂无认证

  • 0浏览

    0关注

    248博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Docker网络模式

cuiyaonan2000 发布时间:2020-09-16 17:06:45 ,浏览量:0

序言

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

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

 

参考资料:

  • https://www.cnblogs.com/zhuochong/p/10069293.html
  • https://blog.csdn.net/hetoto/article/details/99892743
  • https://blog.csdn.net/ystyaoshengting/article/details/102651969
  • https://blog.csdn.net/qq_36059826/article/details/106550332    (重要)

 

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-utils
brctl 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

#安装brctl
yum install -y bridge-utils

#添加网桥
brctl addbr br0

#添加ip字段,因为这是第二个网桥所以网段要跟第一区分开
ip addr add 172.16.0.1/24 dev br0

#启用网桥br0
ip link set dev br0 up


#查看网络br0
ifconfig br0

修改docker默认网桥

#没有该文件就创建
vim /etc/docker/daemon.json

#添加如下的key:value值
"bridge":"br0"

# 重启docker
systemclt start docker

#查看网桥
brctl show

#查看网桥详情
#注意因为修改了默认网桥,就可以不用 我们创建的网桥名称来查看了直接走向默认
#bridge可以理解为是个命令,指向当前docker使用的网桥
docker network inspect bridge

 

 

解决docker info下部的异常信息

当遇到如下的错误的时候

使用指令vim /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
关注
打赏
1638267374
查看更多评论
立即登录/注册

微信扫码登录

0.0386s