Docker-----网络自定义网络容器通信跨主机容器通信

Posted S4061222

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker-----网络自定义网络容器通信跨主机容器通信相关的知识,希望对你有一定的参考价值。

一.Docker网络

实验环境:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
docker安装后会自动创建3种网络:bridge、host、none
在这里插入图片描述
iptables -nL ##
在这里插入图片描述

1.桥接网络

在这里插入图片描述

安装桥接网络
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运行一个容器查看桥接

在这里插入图片描述

删除掉容器后,桥接消失

在这里插入图片描述

2.host网络模式

在这里插入图片描述

需要指定network host
在这里插入图片描述
curl 172.25.28.1

查看端口,可以发现docker运行的镜像nginx占用的是80端口
在这里插入图片描述
再运行一个容器demo2,ps 查看正在运行的容器只有demo,原因是:–network host会占用虚拟机的80端口,但是demo的80端口挤掉了demo2
在这里插入图片描述
在这里插入图片描述

查看日志:docker logs demo2,可以发现原因
在这里插入图片描述

3.none模式

none模式是指禁用网络功能,只有lo接口,在容器创建时使用
–network=none指定
在这里插入图片描述

二.自定义网络

自定义网络模式,docker提供了三种自定义网络驱动
bridge
overlay
macvlan

bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,overlay和macvlan是用于创建跨主机网络。

docker的ip不固定,哪个容器先起来,哪个先用前面的ip 默认情况不是用容器名称,ping ip
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
ping ip 可以
在这里插入图片描述

ping 名称不通
在这里插入图片描述

1.创建自定义网络

在这里插入图片描述
自定义mynet1网桥
在这里插入图片描述
在这里插入图片描述

运行容器,使其都连接在mynet1的自定义网桥上
在这里插入图片描述
在这里插入图片描述

测试:
ping demo可以直接成功,说明可以提供解析

在这里插入图片描述
在这里插入图片描述

2.自定义网络

在创建时指定参数:--subnet 、--gateway

之前已经创建了mynet1网桥,subnet 为172.20.0.0/24,gateway为172.20.0.1,此处新建mynet2网桥时,subnet 和 gateway不能与mynet1重复!!
在这里插入图片描述

3.手动指定ip

4.双网卡实现不同网段间的容器通信

桥接到不同网桥上的容器,彼此是不通信的。
docker在设计上就是要隔离不同network的。
那么如何使两个不同网桥的容器通信呢:
使用 docker network connect命令为vm1添加一块my_net2 的网卡。
在这里插入图片描述
运行第一个容器搭mynet1网络,运行第二个容器搭mynet2网络
发现这两个容器ping不通!!

在这里插入图片描述
第二个容器的id为2c****,使mynet1 连接第二个容器,attach 第二个容器的id,再次ping 第一个容器,发现可以ping通
在这里插入图片描述
可以看到mynet1,mynet2的ip都出现在了里面!说明通信成功!
在这里插入图片描述

三.Docker容器通信

1.使用容器名称通信

容器之间除了使用ip通信外,还可以使用容器名称通信。
dns解析功能必须在自定义网络中使用。
启动容器时使用 --name 参数指定容器名称。
在容器创建时使用–network=container:vm1指定。(vm1指定的是运行的容器名)
docker demo 必须是运行的!!!

Joined容器一种较为特别的网络模式。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。

2.–link可以用来链接2个容器

–link 可以用来链接2个容器。
–link的格式: –link **:alias

需要删除之前的demo

ping名字demo成功!
在这里插入图片描述
Demo和web的ip:172.17.0.2, web是容器内新开启的,和demo共用同一个ip
Busybox的ip:172.17.0.3

在这里插入图片描述
域名是动态变化的:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以发现:demo由原来的172.17.0.3 变为 172.17.0.4

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.容器如何访问外网

容器如何访问外网是通过iptables的SNAT实现的
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
直接可以访问外网(真实主机开启了地址伪装功能)
在这里插入图片描述

4.外网访问容器

外网访问容器用到了docker-proxy和iptables DNAT

宿主机访问本机容器使用的是iptables DNAT;外部主机访问容器或容器之间的访问是docker-proxy实现
在这里插入图片描述
端口映射:-p 选项指定映射端口
在这里插入图片描述

查看目的地转换规则,第六条链

在这里插入图片描述查看端口
在这里插入图片描述

删除第6条连: iptables -t nat -D DOCKER 6 , 查看没有

在这里插入图片描述

在这里插入图片描述

查看端口有docker-proxy,此时只有 docker-proxy

在这里插入图片描述

重新加入后查看
在这里插入图片描述
在这里插入图片描述

四.跨主机Docker容器通信

跨主机容器网络

  • 跨主机网络解决方案:
    docker原生的overlay和macvlan
    第三方的flannel、weave、calico
  • 众多网络方案是如何与docker集成在一起的
    libnetwork docker容器网络库
    CNM (Container Network Model)这个模型对容器网络进行了抽象
  • CNM分三类组件
    Sandbox:容器网络栈,包含容器接口、dns、路由表。(namespace)
    Endpoint:作用是将sandbox接入network (veth pair)
    Network:包含一组endpoint,同一network的endpoint可以通信。

在这里插入图片描述

1.跨主机同网段容器通信

server1 打开混杂模式
在这里插入图片描述
server2 打开混杂模式
在这里插入图片描述
在这里插入图片描述
在两台docker主机上各创建macvlan1网络:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
不同主机的容器可以ping 通
容器的接口直接与主机网卡连接,无需NAT或端口映射。
在这里插入图片描述

2.跨主机的不同网段的容器通信

macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094。

server1和server2新加一块网卡eth1
在这里插入图片描述

在这里插入图片描述
编写eth1的网卡文件(server1和server2)
在这里插入图片描述
重新激活网卡:ifup eth1
ip link set up eth1启用网卡
eth1网卡的混杂模式打开(server1和server2)
在这里插入图片描述
在这里插入图片描述
删除之前的macvlan1和macvlan2
在这里插入图片描述
server1和server2创建macvlan2,注意网段需要改变一下和前面eth0不一样172.21.0.*
在这里插入图片描述

在这里插入图片描述

创建容器并运行,注意网段需要改变一下和前面eth0不一样172.21.0.*
在这里插入图片描述
在server2也需要创建容器并运行:
在这里插入图片描述
在这里插入图片描述

demo的信息中会自动生成和 macvlan1同网段172.20.*.*的ip:172.20.0.2
在这里插入图片描述
不同网段 172.21.0.10不能通信,但是生成的Ip172.20.0.2可以访问
在这里插入图片描述

3.docker network子命令

connect		连接容器到指定网络
create			创建网络
disconnect	断开容器与指定网络的连接
inspect		显示指定网络的详细信息
ls			显示所有网络
rm			删除网络

以上是关于Docker-----网络自定义网络容器通信跨主机容器通信的主要内容,如果未能解决你的问题,请参考以下文章

运维实战 容器部分 Docker网络

Docker 跨主机网络(十六)

【swarm】Docker跨主机网络:overlay

Docker网络管理之docker跨主机通信

Docker容器跨主机通信之:OVS+GRE

Docker 容器跨主机多网段通信解决方案