让外网能否访问容器的端口映射方法:
1.手动指定端口映射关系
两台虚拟机,第一台映射端口(第二台访问宿主机端口,就是访问容器端口 curl 192.168.1.1:90 。)
docker run -itd --name web1 -p 90:80 nginx:latest
2>从宿主机随机映射端口到容器,
docker run -itd --name web2 -p 80 nginx:latest
3》从宿主机随机映射端口到容器,容器内所有暴漏端口,都会一一映射。
docker run -itd --name web4 -P nginx:latest
Join容器:container(共享网络协议栈)
容器和容器之间。
docker run -itd --name web5 busybox
docker run -itd --name web6 --network container:web5 busybox:latest
docker exec -it web6 /bin/sh
echo 6666666 > /tmp/index.html
httpd -h /tmp/
docker exec -it web5 /bin/sh
get -O - -q 127.0.0.1
6666666
这时会发现,两个容器的ip地址一样。
PS:这种方法的使用场景:
由于这种网络的特殊性,一般在运行同一服务,并且合格服务需要做监控,以及日志收集,或者网络监控的时候,可以选择这种网络。
Docker的跨主机网络解决方案。
overlay 的解决方案。
实验:
作业:
1)实现容器的跨主机通信,使用Overlay网络的方式实现。
2)准备3台dockerHost,基于上述创建的Overlay网络创建容器服务。 docker01上基于busybox镜像运行服务,名称为:自己名称+t1. docker02上基于busybox镜像运行服务,名称为:自己名称+t2. docker03上基于busybox镜像运行服务,名称为:自己名称+t3.
3)要求容器使用指定网段,10.10.10.0/16网段。 IP地址分别为:
t1: 10.10.10.6 t2: 10.10.10.8 t3: 10.10.10.10
4) 要求3个容器可以分别实现IP和容器名称的通信。
myprogrium-consul.tar
实验环境consul :是数据中心
docker01 docker02 docker03
192.168.1.1 ,192.168.1.20 ,192.168.1.30暂时不考虑防火墙,和selinux安全问题。
将三台dockerhost防火墙和selinux全部关闭,并且分别更改主机名为,docker01 docker02 docker03更改主机名。
hostnamectl set-hostname docker01
su -
关闭防火墙。
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
在docker上操做
导入
docker run -d -p 8500:8500 -h consul --name consul --restart always progrium/consul -server -bootstrap
PS:容器生产,之后,我们可以通过浏览器访问consul服务,验证consul服务是否正常,访问dockerHost加映射端口。
如果出现这个,是因为刚更改防火墙需重启docker
systemctl restart docker
docker start consul
访问consul
http://192.168.1.1:8500/ui/#/dc1/services
修改docker02和docker03上的docker配置文件,
vim /usr/lib/systemd/system/docker.service (加)
/var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store
=consul://192.168.1.1:8500 --cluster-advertise=ens33:2376
保存退出
重启
systemctl daemon-reload
systemctl restart docker (重启docker)
返回浏览器192.168.1.1的consul界面
在,docker02上创建一个自定义网络,
docker network create -d overlay --subnet 10.10.10.0/16 ov_net1
docker network create -d overlay ov_net1
docker network ls(2,3台都会有)
在docker02上创建的网络,我们可以看到它的scope定义的是global(全局),意味着加入到consul这个服务的docker服务,都可以看到我们自定义的网络,同理如果是用此网络创建的容器,会有两张网卡。
默认这张网卡,的网段是10.0.0.0网段,如果想要docker01也可能看到这个网络,那么也只在docker01的docker配置文件添加相应内容即可
注意global;表示全局的意思同理,因为是自定义网络,符合自定义网络的特性,可以直接通过docker容器的名称相互通信,当然也可以在自定义网络的时候,指定它的网段,那么使用此网络的容器也可以指定IP地址。
在docker01上也添加
并重启
systemctl stop docker.service
systemctl start docker.service
在docker01 -----docker03上创建t1,t2,t3
自己的名称+t1,t2,t3
指定IP地址
docker run? -itd --name lbst1 --network ov_net1 --ip 10.10.10.6 busybox:latest
docker run? -itd --name lbst1 --network ov_net1 --ip 10.10.10.8 busybox:latest
docker run? -itd --name lbst1 --network ov_net1 --ip 10.10.10.10 busybox:latest
不指定IP地址
docker run -itd --name t1 --network ov_net1 busybox:latest
docker run -itd --name t2 --network ov_net1 busybox:latest
docker run -itd --name t3 --network ov_net1 busybox:latest进入t1 ping docke02到03
docker exec -it t1 /bin/sh
进入t2ping docker01与 03
进入t3ping docker01与 02
另一种跨主机网络MacVlan
Docker 跨主机网络方案之MacVlan
实验环境:vlan(局域网)
Docker01 docker02
192.168.1.1 192.168.1.20
关闭防火墙和禁用selinux,更改主机名。
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
关闭防火墙与selinux,需要重启一下docker
systemctl daemon-reload
systemctl restart docker
Macvlan的单网络通信
1》打开网卡的混杂模式(需要在docker02到docker01都需要开启)
ip link show ens33(查看网卡)
开启混杂模式
ip link set ens33 promisc on
2》在docker01上创建macvlan网络
docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1PS: -o parent=绑定在那张网卡之上。
3》基于创建的macvlan网络运行一个容器
docker run -itd --name bbox1 --ip 172.22.16.10 --network mac_net1 busybox
4>在dcker02上创建的macvlan网络,注意与docker1上的macvlan网络一摸一样
docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1
5》在docker2上,基于创建的macvlan网络运行一个容器,验证与docker01容器的通信
docker run -itd --name bbox2 --network mac_net1 --ip 172.22.16.20 busybox
Macvlan的多网络通信(真实接口不够用的问题)
验证内核模块8021q封装
Macvlan需要解决的问题,基于真实的ens33网卡,生产新的虚拟网卡
1》Docker01到docker02验证内核模块
modinfo 8021q如果内核模块没有开启,加载内核模块
modprobe 8021q
> 2》基于ens33创建虚拟网卡
cd /etc/sysconfig/network-scripts/
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改ens33网卡的配置文件
手动添加虚拟网卡的配置文件
cp -p ifcfg-ens33 ifcfg-ens33.10
PS: -p保留源文件或目录的属性
修改ens33.10
创建第二个虚拟网卡配置文件
cp -p ifcfg-ens33.10 ifcfg-ens33.20
vim ifcfg-ens33.20
3》Docker01上的操做启用创建的虚拟网卡
ifup ifcfg-ens33.10
ifup ifcfg-ens33.20
4》基于虚拟网卡,创建macvlan的网络
docker network create -d macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33.10 mac_net10docker network create -d macvlan --subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=ens33.20 mac_net20
scp -p ifcfg-ens33.10 ifcfg-ens33.20 192.168.1.20:/etc/sysconfig/network-scripts/
创建容器(docker01到docker02)
docker run -itd --name bbox10 --network mac_net10 --ip 172.16.10.10 192.168.1.1:5000/test:latestdocker run -itd --name bbox20 --network mac_net20 --ip 172.16.20.20 192.168.1.1:5000/test:latest
5》基于上述创建的macvlan网络,运行对应的容器,不过这里需要注意,运行的容器与网络对应的网段相符合,还需注意,ip地址的唯一性。
6》在docker02上进行操做,创建网络机容器
这里只需要,我们在这里的操做跟docker01上的一摸一样,操做顺序大致为:
1.验证8021q内核封装
2.基于ens33网卡创建新的虚拟网卡,esn33.10和ens33.20(注意和docker01上ens33.10和ens33.20必须是在同一网段,且ip不能冲突)
3.基于此网络运行容器,(注意和docker01上的容器,都是基于刚刚创建的macvlan网络,但ip地址不能冲突)
7》验证:
注意:Vmware的网络必须是桥接(Bridge)
在docker01上进入容器bbox10和docker02上的bbox1进行通信
在docker01上进入容器bbox20和docker02上的bbox21进行通信
个人总结:macVlan网络的实现原理及步骤
原理:
1.基于宿主机的网卡的修改配置多个虚拟网卡。
2.基于虚拟网卡创建macvlan网络
3.基于虚拟网络创建要求的容器
步骤:1.验证8021q内核封装
2.基于ens33网卡创建新的虚拟网卡,esn33.10和ens33.20(注意和docker01上ens33.10和ens33.20必须是在同一网段,且ip不能冲突)
3.基于此网络运行容器,(注意和docker01上的容器,都是基于刚刚创建的macvlan网络,但ip地址不能冲突)
原文地址:https://blog.51cto.com/13911055/2468509