Docker跨主机网络

Docker跨主机网络,第1张

Docker跨主机网络(overlay)的实现

本文主要介绍Dockeroverlay的实现,通过示例代码非常详细的介绍,对大家的学习或者工作有一定的参考价值。有需要的朋友下面和边肖一起学习。

一、Docker跨主机通信

Docker跨主机网络解决方案包括:

docker自带的Overlay和macvlan。
第三方方案:常用法兰绒、织法、印花布。
docker通过libnetwork和CNM将上述方案与docker进行整合。

Libnetwork是docker容器网络库,其核心内容是容器网络模型(CNM),它抽象了容器网络,由以下三类组件组成:

1.1沙箱
沙箱是容器的网络栈,包含容器的接口、路由表和DNS设置。Linux名称空间是沙盒的标准实现。沙箱可以包含来自不同网络端点。也就是说,沙盒通过名称空间将一个容器与另一个容器隔离开来。一个容器包含一个沙箱,每个沙箱可以有属于不同网络的多个端点。

1.2端点
端点的作用是将沙箱连接到网络。端点的典型实现是vethpair。一个端点只能属于一个网络和一个沙箱。

1.3网络
网络包含一组端点,同一网络的端点可以直接通信。网络的实现可以是LinuxBridge、VLAN等。


Docker网络架构

图片来自CLOUDMAN博客。

libnetwork包含上述本机驱动程序和其他第三方驱动程序。
无,前面已经介绍了桥接网络。Bridge是一个桥,一个虚拟的交换机,通过veth把它和沙箱连接起来。

二。Docker覆盖网络

2.1启动键值数据库咨询
br/]

Docerk覆盖网络需要一个键值数据库来存储网络状态信息,包括网络、端点、IP等。Consul、Etcd和ZooKeeper都是Docker支持的key-vlaue软件。

Consul是一个键值数据库,可以用来存储系统的状态信息等。当然这里不需要写代码,只需要安装consul,然后docker会自动存储状态等。安装consul数据库最简单的方法是直接用docker运行consul容器。

dockerrun-d-p8500:8500-hconsul-nameconsulprogrium/consul-server-bootstrap

启动后,可以通过主机ip的8500端口查看consul服务。

为了让consul发现每个docker主机节点,需要在每个节点上进行配置。修改每个节点docker守护进程的配置文件/etc/systemd/system/docker.service。在ExecStart的末尾添加

-cluster-store=consul://<;consul_ip>:8500-cluster-advertise=ens3:2376
其中

以上是单机版领事的安装方法。建议采用集群模式。有关集群模式安装方法,请参见https://www.consul.io/intro/getting-started/join.html。

2.2创建覆盖网络

创建叠加网络与之前创建桥接网络基本相同,只是-d参数设置为叠加。如下所示:

docker网络创建-覆盖ov_net2

dockernetworkcreate-dover_net3-子网172.19.0.0/24-网关172.19.0.1

上述创建过程只需要在一个节点进行,其他节点会自动识别网络,因为consul的服务发现功能。

之后,在创建容器时,只需要指定-the-network参数为ov_net2。

dockerrun-networkov_net2busybox

这样,即使是在使用相同覆盖网络的不同主机上创建的容器也可以彼此直接访问。

2.3覆盖网络原理

在创建了另一个覆盖网络后,我们可以通过dockernetworkls看到,网络中不仅多了一个ov_net2(类型overlay,作用域global),还多了一个名为docker_gwbridge(类型bridge,作用域local)的。事实上,这就是覆盖网络的工作原理。

从brctl展示中可以看出,每创建一个网络类型overlay的容器,docker_gwbridge下都会挂载一个vethxxx,说明overlay容器是通过这个桥对外连接的。

简单来说,覆盖网数据还是从docker_GW桥出去,一个桥网。但是由于consul的作用(记录了覆盖网的端点、沙箱、网络等信息),Docker知道这个网络是覆盖型的,这样这个覆盖网下的不同主机就可以互相访问。不过网点还是在docker_gwbridge。

无,前面已经介绍了桥接网络。Bridge是一个桥,一个虚拟的交换机,通过veth把它和沙箱连接起来。

三、外网能否访问容器的端口映射方法:

[root@localhost~]#ss-lnt
/检查套接字(IP地址和端口)

1)手动指定端口映射关系。

[root@localhost~]#dockerpullnginx

[root@localhost~]#dockerpullbusybox

[root@localhost~]#dockerrun-itdnginx:latest //不加任何参数开启一台nginx虚拟机 [root@localhost~]#dockerps //查看容器信息

[root@localhost~]#dockerinspectvigorous_shannon //查看容器详细信息(现在看IP)

[root@localhost~]#curl172.17.0.2

[root@localhost~]#dockerrun-itd--nameweb1-p90:80nginx:latest //开启一台虚拟机指定链接端口

第二次访问

[root@localhost~]#curl192.168.1.11:90

2)从主机将端口随机映射到容器。

[root@localhost~]#dockerrun-itd--nameweb2-p80nginx:latest //开启一台虚拟机随机链接端口 [root@localhost~]#dockerps


第二次访问

[root@localhost~]#curl192.168.1.11:32768

3)从主机随机映射端口到容器,容器中所有暴露的端口将被一一映射。

[root@localhost~]#dockerrun-itd-nameweb3-pnginx:latest
/从主机到容器的端口随机映射,容器中所有暴露的端口都会被一一映射
[root@localhost~]#

第二次访问

[root@localhost~]#curl192.168.1.11:32769

四。加入容器:容器(共享网络协议栈)

还有集装箱。

[root@localhost~]#dockerrun-itd--nameweb5busybox:latest //基于busybox开启一台虚拟机 [root@localhost~]#dockerinspectweb5

[root@localhost~]#dockerrun-itd--nameweb6--networkcontainer:web5busybox:latest //开启另一台虚拟机 [root@localhost~]#dockerexec-itweb6/bin/sh //进入web6 /#ipa

/#echo123456>/tmp/index.html /#httpd-h/tmp/ //模拟开启httpd服务 [root@localhost~]#dockerexec-itweb5/bin/sh //进入web5 /#ipa

#wget-O--q127.0.0.1 //这时会发现,两个容器的IP地址一样。

这种方法的使用场景:
由于这个网络的特殊性,一般都是同一个服务在运行,当需要监控符合条件的服务,已经收集到日志,或者监控到网络时,可以选择这个网络。

五、docker跨主机网络解决方案

叠加的解决方案

实验环境:

01号码头 02号码头 03号码头 1.11 1.12 1.20

暂时不考虑防火墙和selinux安全问题。
关闭所有三个dockerhost防火墙和selinux,并分别更改主机名。

[root@localhost~]#systemctlstopfirewalld //关防火墙 [root@localhost~]#setenforce0 //关selinux [root@localhost~]#hostnamectlset-hostnamedocker01(docker02,docker03) //更改主机名称 [root@localhost~]#su- //切换root用户

码头01上的 *** 作

[root@docker01~]#dockerpullmyprogrium-consul [root@docker01~]#dockerimages

经营咨询服务

[root@docker01~]#dockerrun-d-p8500:8500-hconsul--nameconsul--restartalwaysprogrium/consul-server-bootstrap -h:主机名 -server-bootstrap:指明自己是server //基于progrium/consul运行一台虚拟机(如果报错重启一下docker)

容器生产出来后,我们可以通过浏览器访问consul服务,验证consul服务是否正常。访问dockerHostplus映射端口。

[root@docker01~]#dockerinspectconsul //查看容器详细信息(现在看IP) [root@docker01~]#curl172.17.0.7


浏览器视图

修改docker02和docker03的docker配置文件

[root@docker02~]#vim/usr/lib/systemd/system/docker.service#13行添加 ExecStart=/usr/bin/dockerd-Hunix:///var/run/docker.sock-Htcp://0.0.0.0:2376--cluster-store=consul://192.168.1.11:8500--cluster-advertise=ens33:2376 //把本机的/var/run/docker.sock通过ens33:2376,存到192.168.1.11:8500的consul服务上 [root@docker02~]#systemctldaemon-reload [root@docker02~]#systemctlrestartdocker

回到浏览器咨询服务界面,找到key/nalue->:DOCKER->;节点



您可以看到节点docker02和docker03

在docker02上定制网络

[root@docker02~]#dockernetworkcreate-doverlayov_net1 //创建一个overlay网络 [root@docker02~]#dockernetworkls //查看网络


查看docker03上的网络,可以看到ov_net1网络也已经生成。

[root@docker03~]#dockernetworkls

检查浏览器

修改docker01的docker配置文件,检查docker01上的网络,可以看到也生成了ov_net1网络。

[root@docker01~]#vim/usr/lib/systemd/system/docker.service#13行添加 ExecStart=/usr/bin/dockerd-Hunix:///var/run/docker.sock-Htcp://0.0.0.0:2376--cluster-store=consul://192.168.1.11:8500--cluster-advertise=ens33:2376 //把本机的/var/run/docker.sock通过ens33:2376,存到192.168.1.11:8500的consul服务上 [root@docker02~]#systemctldaemon-reload [root@docker02~]#systemctlrestartdocker //重启docker [root@docker03~]#dockernetworkls //查看网络

Docker三个单元各自运行一个基于网络ov_net1的虚拟机,测试这三个单元是否可以互相ping通。

[root@docker01~]#dockerrun-itd--namet1--networkov_net1busybox [root@docker02~]#dockerrun-itd--namet2--networkov_net1busybox [root@docker03~]#dockerrun-itd--namet3--networkov_net1busybox [root@docker01~]#dockerexec-itt1/bin/sh [root@docker02~]#dockerexec-itt2/bin/sh [root@docker03~]#dockerexec-itt3/bin/sh

/#ping10.0.0.2

/#ping10.0.0.3

/#ping10.0.0.4

**在docker02上创建的网络,我们可以看到它的作用域定义了global(全局),这意味着所有加入consul服务的docker服务都可以看到我们的自定义网络。
同样,如果是用这个网络创建的容器,也会有两个网卡。
默认情况下,该网卡的网段是10.0.0网段。如果您想让docker01也看到这个网络,您只需要在docker01的docker配置文件中添加相应的内容。
同样,因为是自定义网络,符合自定义网络的特性,所以可以通过docker容器的名称直接相互通信。当然,也可以在定制网络时指定其网段,这样使用该网络的容器也可以指定IP地址。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/774688.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-03
下一篇 2022-05-03

发表评论

登录后才能评论

评论列表(0条)

保存