linux怎么查看本机内存大小
279
2022-10-28
Docker网络管理之docker跨主机通信
前言
由于docker技术的火爆,导致现在越来越多的企业都在使用docker这种虚拟化技术。企业中使用docker这种虚拟化技术,其目的就是为了让docker中的容器对外提供服务。因此,我们必须深入了解一下docker的网络知识,以满足更高的网络需求。
我们安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host。 * host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。 * None:该模式关闭了容器的网络功能,相当于一个回环网络。 * Bridge:此模式会为每一个容器分配、设置IP等,并将容器连接到一个叫docker0的虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。
[root@docker ~]# docker network ls //执行该命令查看docker创建的网络 NETWORK ID NAME DRIVER SCOPE 2edf7ef4f9fa bridge bridge local 217d2e9a4785 host host local c0bea73a8e1a none null local
关于上述提到的三个网络解释如下:
Host:相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立的IP地址。众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。基于Host模式启动的容器,在容器内执行ifconfig时,看到的都是宿主机上的信息。该模式不够灵活,容易出现端口冲突问题。 None:该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上,该模式关闭了容器的网络功能,类似于会换地址,在以下两种情况下是有用的:容器并不需要网络(例如只需要写磁盘卷的批处理任务)。 overlay:顾名思义:覆盖,但它又不是覆盖,它的作用就是在容器原有的网络基础之上,再添加一块网卡,并为其分配一个IP地址,可以将所有的docker容器关联到同一个局域网中,适用于容器与容器是跨主机进行通信的场景。 Bridge:相当于Vmware中的NAT模式,容器使用独立的network Namespace,并且连接到docker0虚拟网卡(默认模式)。通过docker网桥以及IPtables nat表配置与宿主机通信;Bridge模式是Docker默认的网络设置,此模式会为每一个容器分配一个Network nameSpace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥docker0上
虽然docker模式提供三种网络模式,但其实是有四种网络模式的!注:今天只介绍Overlay网络,Macvlan网络,想了解其余三种网络模式请参考:TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。
通过一个实验案例来验证consul服务的特性!1.案例环境
系统版本: Centos 7.3 Docker版本: 18.09.0 主机名IP地址: docekr01:192.16.45.129 docekr02:192.16.45.141 docekr03:192.16.45.142
2、准备工作:
* 必须安装key-value存储服务,如consul; * 宿主机已经安装docker engine; * 宿主机的hostname必须不同 ,避免发生冲突 ; * 关闭防火墙与SELinux(实验环境;
3、案例实施1)docker01
[root@docker01 ~]# docker pull progrium/consul //下载consul镜像 [root@docker01 ~]# docker run -d -p 8500:8500 -h consul --name consul --restart=always progrium/consul -server -bootstrap //-d:后台运行; //-p:将容器中的8500端口映射到宿主机的8500端口; //-h:表示consul容器的主机名; //--name:表示运行的容器名; //--restart=always:随docker服务的启动而启动; //-server -bootstrap:添加这两个选项,则表示在群集环境中可以使其以master的身份出现; [root@docker01 ~]# netstat -anpt | grep 8500 tcp6 0 0 :::8500 :::* LISTEN 3725/docker-proxy //确定其8500端口正在监听 [root@docker01 ~]# vim /usr/lib/systemd/system/docker.service //更改一下docker的主配置文件 ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.45.129:8500 --cluster-advertise=ens33:2376 //在第13行上原本的基础添加以上内容,各个配置项含义如下: # /var/run/docker.sock:Docker的一个套接字; # “ -H tcp://0.0.0.0:2376 ” :使用本机的tcp2376端口; # “ --cluster-store=consul://192.168.45.129:8500”:指定运行着consul服务的docker服务器IP及端口; # “ --cluster-advertise=ens33:2376”:从本机的ens33网卡通过2376端口搜集网络信息,存储在consul上 [root@docker01 ~]# systemctl daemon-reload [root@docker01 ~]# systemctl restart docker.servic //重新启动docker服务
[root@docker02 ~]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.45.129:8500 --cluster-advertise=ens33:2376 //在第13行上原本的基础添加以上内容,各个配置项含义如下: # /var/run/docker.sock:Docker的一个套接字; # “ -H tcp://0.0.0.0:2376 ” :使用本机的tcp2376端口; # “ --cluster-store=consul://192.168.45.129:8500”:指定运行着consul服务的docker服务器IP及端口; # “ --cluster-advertise=ens33:2376”:从本机的ens33网卡通过2376端口搜集网络信息,存储在consul上 [root@docker02 ~]# systemctl daemon-reload [root@docker02 ~]# systemctl restart docker.service //重新启动docker服务
Docker3与Docker2的操作就是一模一样的,所以这里就不多做解释了!
[root@docker03 ~]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.45.129:8500 --cluster-advertise=ens33:2376 //在第13行上原本的基础添加以上内容,各个配置项含义如下: # /var/run/docker.sock:Docker的一个套接字; # “ -H tcp://0.0.0.0:2376 ” :使用本机的tcp2376端口; # “ --cluster-store=consul://192.168.45.129:8500”:指定运行着consul服务的docker服务器IP及端口; # “ --cluster-advertise=ens33:2376”:从本机的ens33网卡通过2376端口搜集网络信息,存储在consul上 [root@docker03 ~]# systemctl daemon-reload [root@docker03 ~]# systemctl restart docker.service //重新启动docker服务
[root@docker01 ~]# docker network create -d overlay my_olay //创建一个名为my_olay的voerlay网络 //以上操作不管在那台docker主机上操作都可以 [root@docker01 ~]# docker network create -d overlay --subnet 200.0.0.0/24 --gateway 200.0.0.1 lv_olay //也可以在创建overlay网卡时,指定其IP网段及网关 [root@docker01 ~]# docker network ls //查看docker所支持的网络
而且在另外两台docker服务器上也可看到,自行验证! 在docker 1上创建的网络,可以看到其SPOCE(范围)定义的是global(全局),那么这就意味着加入consul这个服务群集的其他docker服务器也可以看到这张网卡! 如果在创建网卡时,没有指定其网段,则默认是10.0.0.0网段,由于是自定义网络,所以满足自定义网络的特征(比如支持容器之间的通信)!5)在不同的docker服务器各自创建一个容器,验证是否可以通信! [root@docker01 ~]# docker run -itd --name t1 --network lv_olay --ip 200.0.0.10 busybox:latest //在docker1服务器上创建一个名为t1的容器并指定其IP地址 [root@docker02 ~]# docker run -itd --name t2 --network lv_olay --ip 200.0.0.20 busybox:latest //在docker2上创建一个容器并指定IP地址 [root@docker03 ~]# docker run -itd --name t3 --network lv_olay --ip 200.0.0.30 busybox:latest //在docker3上创建一个容器并指定IP地址 [root@docker01 ~]# docker exec -it t1 /bin/sh //随便在一台docker服务器上进入其创建的容器中,进行测试 / # ping -c 2 t2 PING t2 (200.0.0.20): 56 data bytes 64 bytes from 200.0.0.20: seq=0 ttl=64 time=1.053 ms 64 bytes from 200.0.0.20: seq=1 ttl=64 time=1.052 ms / # ping -c 2 t3 PING t3 (200.0.0.30): 56 data bytes 64 bytes from 200.0.0.20: seq=0 ttl=64 time=1.053 ms 64 bytes from 200.0.0.20: seq=1 ttl=64 time=1.052 ms 注:可以看出IP地址,不同docker host上容器通信是没有问题的; 二、Macvlan网络 Macvlan是linux kernel比较新的特性,可以通过以下方法判断当前系统是否支持: [root@localhost ~]# modprobe macvlan [root@localhost ~]# lsmod | grep macvlan macvlan 19239 0 如果是第一个命令报错,或者第二个命令没有返回信息,则说明当前系统不支持macvlan,需要升级内核。 [root@docker01 ~]# modprobe 8021q //加载内核模块 [root@docker01 ~]# modinfo 8021q //如果有信息返回则表示开启8021q模块,如果没有使用上条命令 这两组命令所支持的效果一样! 以上命令主要验证Linux内核是否支持macvlan功能! macvlan允许在主机的一个网络接口上配置多个虚拟的网络接口,这些网络接口有自己独立的mac地址,也可以配置IP地址进行通信。macvlan下的虚拟机或者容器网络和主机在同一网段中,共享一个广播域。macvlan和bridge比较相似,但因为它省去了bridge的存在,所以在配置和调试时比较简单,而且效率较高。除此之外,macvlan自身也完美支持VLAN。 如果希望容器或者虚拟机放在主机相同的网络中,享受已经存在网络栈的各种优势,可以考虑macvlan。 macvlan和overlay网络不同,overlay的作用范围是global;而macvlan的作用范围是local。global类型的网络其作用于一组docker daemon集群,local类型的网络只作用于单一主机。 每台主机创建的macvlan网络是独立的,A机器行创建的macvlan网络并不影响B机器上的网络。 两台主机在网卡配置混杂模式、两台主机上macvlan存在overlap、两个macvlan网络没有分配过同样的IP,以上三个条件满足后,同样可以实现跨主机通信!1、实验环境要求: docker版本:18.09.0 docker01:192.168.45.129/24 docker02:192.168.45.143/24 (1)关闭Linux防火墙和SELinux; (2)修改主机名; 2、案例实施 一)、macvlan的单网络通信 1)打开网卡的混杂模式
//需要在docker01和docker02上都进行操作。 [root@docker01 ~]# ip link set ens33 promisc on [root@docker01 ~]# ip link show ens33 [root@docker01 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1 //在docker01上创建macvlan网络 //PS: -o parent=绑定在哪张网卡之上 [root@docker01 ~]# docker run -itd --name bbox1 --ip 172.22.16.10 --network mac_net1 busybox //基于创建的macvlan网络运行一个容器
在docker02上创建macvlan网络,注意与docker01上 的macvlan网络一模一样。
//需要在docker01和docker02上都进行操作。 [root@docker02 ~]# ip link set ens33 promisc on [root@docker02 ~]# ip link show ens33 [root@docker02 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1 [root@docker02 ~]# docker run -itd --name bbox2 --network mac_net1 --ip 172.22.16.20 busybox
验证:
[root@docker01 ~]# docker exec -it bbox1 sh / # ping 172.22.16.20 PING 172.22.16.20 (172.22.16.20): 56 data bytes 64 bytes from 172.22.16.20: seq=0 ttl=64 time=0.884 ms 64 bytes from 172.22.16.20: seq=1 ttl=64 time=1.478 ms 64 bytes from 172.22.16.20: seq=2 ttl=64 time=1.182 ms
二)、macvlan多网络通信
(1)开启网卡混杂模式docker01:
[root@docker01 ~]# ip link set ens33 promisc on //开启网卡的混杂模式
[root@docker01 ~]# ip link show ens33 //查询网卡已经支持PROMISC
2: ens33:
(2)创建虚拟网卡
由于一个网卡最好创建出一个macvlan网卡,所以需创建虚拟网卡以满足要求!
[root@docker01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO=manual //将网络获取模式改为手动模式 [root@docker01 ~]# cd /etc/sysconfig/network-scripts/ [root@docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10 [root@docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.20 [root@docker01 network-scripts]# vim ifcfg-ens33.10 BOOTPROTO=none NAME=ens33.10 DEVICE=ens33.10 ONBOOT=yes IPADDR=192.168.10.1 NETMASK=255.255.255.0 GATEWAY=192.168.10.254 VLAN=yes //保证和原本的物理网卡不在同一网段,并且打开vlan的支持模式 [root@docker01 network-scripts]# vim ifcfg-ens33.20 BOOTPROTO=none NAME=ens33.20 DEVICE=ens33.20 ONBOOT=yes IPADDR=192.168.20.1 NETMASK=255.255.255.0 GATEWAY=192.168.20.254 VLAN=yes [root@docker01 network-scripts]# ifup ifcfg-ens33.10 [root@docker01 network-scripts]# ifup ifcfg-ens33.20 [root@docker01 network-scripts]# ifconfig ens33.10 [root@docker01 network-scripts]# ifconfig ens33.20 //查看网卡是否生效
[root@docker02 ~]# ip link set ens33 promisc on //开启网卡的混杂模式
[root@docker02 ~]# ip link show ens33 //查询网卡已经支持PROMISC
2: ens33:
[root@docker01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO=manual //将网络获取模式改为手动模式 [root@docker02 ~]# cd /etc/sysconfig/network-scripts/ [root@docker02 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10 [root@docker02 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.20 [root@docker02 network-scripts]# vim ifcfg-ens33.10 BOOTPROTO=none NAME=ens33.10 DEVICE=ens33.10 ONBOOT=yes IPADDR=192.168.10.2 NETMASK=255.255.255.0 GATEWAY=192.168.10.254 VLAN=yes [root@docker02 network-scripts]# vim ifcfg-ens33.20 BOOTPROTO=none NAME=ens33.20 DEVICE=ens33.20 ONBOOT=yes IPADDR=192.168.20.2 NETMASK=255.255.255.0 GATEWAY=192.168.20.254 VLAN=yes [root@docker01 network-scripts]# ifup ifcfg-ens33.10 [root@docker01 network-scripts]# ifup ifcfg-ens33.20 [root@docker02 network-scripts]# ifconfig ens33.10 [root@docker02 network-scripts]# ifconfig ens33.20
[root@docker01 ~]# docker network create -d macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33.10 mac_net10 [root@docker01 ~]# docker network create -d macvlan --subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=ens33.20 mac_net20 //创建虚拟网卡并针对其网段、网关 //-d:指令网卡驱动类型,-o parent:绑定在那张网卡上 [root@docker01 ~]# docker network ls
[root@docker02 ~]# docker network create -d macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33.10 mac_net10 [root@docker02 ~]# docker network create -d macvlan --subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=ens33.20 mac_net20
(4)基于创建的macvlan网卡创建容器,验证是否可以通信!
dockerA主机创建容器:
[root@docker01 ~]# docker run -itd --name box10 --network mac_net10 --ip 172.16.10.10 busybox [root@docker01 ~]# docker run -itd --name box20 --network mac_net20 --ip 172.16.20.10 busybox
dockerB主机创建容器:
[root@docker02 ~]# docker run -itd --name box11 --network mac_net10 --ip 172.16.10.20 busybox [root@docker02 ~]# docker run -itd --name box21 --network mac_net20 --ip 172.16.20.20 busybox
进入容器进行验证:
[root@docker01 ~]# docker exec -it box10 /bin/sh / # ping 172.16.10.20 PING 172.16.10.20 (172.16.10.20): 56 data bytes 64 bytes from 172.16.10.20: seq=0 ttl=64 time=0.653 ms 64 bytes from 172.16.10.20: seq=1 ttl=64 time=0.966 ms [root@docker01 ~]# docker exec -it box20 /bin/sh/ # ping 172.16.20.20 PING 172.16.20.20 (172.16.20.20): 56 data bytes 64 bytes from 172.16.20.20: seq=0 ttl=64 time=0.734 ms 64 bytes from 172.16.20.20: seq=1 ttl=64 time=0.718 ms
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~