Docker--网络跨主机实现之docker网络通信、跨主机容器网络

目录

一、docker网络通信

1、容器通信

2、监控容器内的web服务器:--link的通信方式

3、跨主机通信:

容器访问外网【使用防火墙】

二、跨主机容器网络 

1、macvlan网络方案实现

 创建macvlan网络

 让不同macvlan网络容器通信:


一、docker网络通信

1、容器通信

【推荐使用自定义网络,因为有dns】

docker ps -a
docker container prune   
#删除所有已经停止的容器

docker run -d  --name demo nginx  #开启nginx容器
docker ps

docker run -it --network container:demo busybox 
#这个版本不能用curl命令
--/ # ip addr   #获取的是172.17.0.2的ip
--/ # netstat -antlp 
  
docker pull radial/busyboxplus 
docker images

docker tag radial/busyboxplus:latest busyboxplus:latest  #改名
docker rmi radial/busyboxplus:latest   
#删除之前的镜像名称
docker ps -a
docker container  prune 

docker run -it --rm --network container:demo busyboxplus
--/ # ip addr
--/ # curl  localhost
docker ps
docker inspect demo  #可以看到监听的是0.2

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第1张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第2张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第3张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第4张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第5张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第6张图片

2、监控容器内的web服务器:--link的通信方式

【两个容器之前使用共享的网络栈,通过localhost进行快速通信】

 docker run -it --rm --link demo:web busyboxplus   
#--link可以来连接两个容器。给demo容器重新起别名web

--/ # ip addr 
#可以看到ip是0.3,跟之前的不一样

--/ # ping 172.17.0.2  
#可以ping通,两者之前是互通的,但是属于两个容器

--/ # curl 172.17.0.2
--/ # ping web  
--/ # ping demo
--/ # cat /etc/hosts  #可以看到更新了我们的host文件
--/ # env  
#里面有其环境变量【当原始demo容器更新之后就没有了】

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第7张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第8张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第9张图片 在开启一个server2窗口

docker ps
docker stop demo  #停掉demo

docker run -d --name demo2 nginx #运行demo2

docker inspect demo2 
#可以看到demo2获取到原先demo的ip

docker start demo    
#开启demo

docker inspect demo  
#可以看到demo获取的是0.4

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第10张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第11张图片

返回第一台server2端口

--/ # env  #可以看到变量没有变
--/ # cat /etc/hosts   #但是host变了

--/ # ping web
--/ # ping demo
--/ # ping demo2  
#可以看到demo2ping不通,没有解析 

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第12张图片

3、跨主机通信:

容器访问外网【使用防火墙】

【宿主机访问本机使用的是iptables  DNAT
 外部主机访问容器或者容器之间的访问是docker-proxy】

iptables -t nat -nL
外网访问容器【定义端口影射】
docker ps
docker rm -f demo2
docker rm -f demo
以上两者都不能访问(没有做端口影射),监听的是本机内部的,

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第13张图片

docker run -d --name demo -p 80:80 nginx
docker ps
docker port  demo

 在真机中:

curl  172.25.70.2  #可以访问到

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第14张图片server2:

iptables -nL -t nat
#可以看到防火墙有DNAT规则:当有人访问目标端口80时重定向到0.2的80

netstat -antlp
#可以看到ipv4和ipv6的80端口进程显示:docker-proxy。这是docker的双冗余机制

iptables -t nat -D DOCKER 4 
#删除docker链里的第4条

iptables -nL -t nat

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第15张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第16张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第17张图片

 真机中:

curl  172.25.70.2  #还可以访问到默认页面【curl命令没有缓存】
curl  172.25.70.2 -I

server2:
刚删掉DNAT规则还可以访问到就是因为docker时双冗余机制

netstat -antlp
kill -9 5668  #删除docker-proxy
netstat -antlp

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第18张图片

真机中:

curl  172.25.70.2 -I  #访问被拒绝

server2:

docker restart demo  
#重新启动demo

netstat -antlp  
#可以看到docker-proxy又恢复了

iptables -t nat -nL  
#DNAT规则也已经重新自动创建好了

netstat -antlp
kill -9 5908  
#再次删掉docker-proxy,【留着防火墙】

netstat -antlp

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第19张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第20张图片

真机中:

curl  172.25.70.2 -I  #还可以访问

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第21张图片

本机内部访问:

docker inspect demo
curl 172.17.0.2  #可以访问到默认页面
brctl  show  #内部数据包走的是网桥

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第22张图片


二、跨主机容器网络 

1、macvlan网络方案实现

(linux内核提供的网卡虚拟化技术,不需要桥接,使用物理接口)

给server1、2上个添加一个网卡

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第23张图片

 server2:

docker network ls
docker network prune   删除多余的网络
docker network ls

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第24张图片 server1:

停掉仓库

cd harbor/
docker-compose stop
ip addr  #可以看到eth1目前是没有开启的状态

激活eth1:
cd /etc/sysconfig/network-scripts/
ls
cp ifcfg-eth0  ifcfg-eth1 

vim ifcfg-eth1
  BOOTPROTO=none
  NAME=eth1
  DEVICE=eth1
  ONBOOT=yes

ifup ifcfg-eth1  
#激活,用来做容器的底层通信网卡

ip addr  #可以看到已经激活

ip link set eth1 promisc on   #打开混杂模式

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第25张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第26张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第27张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第28张图片

server2同理:
激活eth1

cd /etc/sysconfig/network-scripts/
ls
cp ifcfg-eth0 ifcfg-eth1
vim ifcfg-eth1
  BOOTPROTO=none
  NAME=eth1
  DEVICE=eth1
  ONBOOT=yes
ifup eth1
ip addr
ip link set eth1 promisc on  #打开混杂模式
ip addr 可以看到混杂模式已经打开

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第29张图片

 创建macvlan网络

server1:

docker network ls
docker network create  -d macvlan --subnet  10.0.0.0/24 --gateway 10.0.0.1 -o parent=eth1 macvlan1
#创建macvlan,指定子网和本地网络不冲突,-o指定父级为eth1

docker inspect macvlan1 #可以看到已经创建成功

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第30张图片 server2同理:

docker network create  -d macvlan --subnet  10.0.0.0/24 --gateway 10.0.0.1 -o parent=eth1 macvlan1
docker inspect macvlan1 

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第31张图片server1:

docker run -it --rm --network macvlan1 busybox
--/ # ip addr
分到的地址是10.0.0.2

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第32张图片server2:

docker run -it --rm --network macvlan1 busybox
--/ # ip addr
分到的地址是10.0.0.2,这样和servre1会冲突

docker run -it --rm --network macvlan1 --ip 10.0.0.11 busybox  #自己定义子网
--/ # ip addr

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第33张图片server1:

docker run -it --rm --network macvlan1 --ip 10.0.0.10 busybox
--/ # ip addr
--/ # ping 10.0.0.11  #可以访问成功
--/ # ping 10.0.0.10

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第34张图片server2:

--/ # ping 10.0.0.10  #2台机器是互通的

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第35张图片 第2台server2端口:

brctl show  #没有桥接,直接使用宿主机网卡做的直通
docker ps
docker rm -f demo  #删掉之前的demo容器

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第36张图片

server1

docker network create  -d macvlan --subnet  192.168.0.0/24 --gateway 192.168.0.1 -o parent=eth1.1 macvlan2

server2同理

docker network create  -d macvlan --subnet  192.168.0.0/24 --gateway 192.168.0.1 -o parent=eth1.1 macvlan2
docker network ls 
docker inspect macvlan2

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第37张图片 **注意:macvlan网络在二层上是隔离的,所以不同macvlan网络容器是不能通信的,
server1:

docker run -it --rm --network macvlan2 --ip 192.168.0.10 busybox
--/ # ip addr

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第38张图片

server2同理:

docker run -it --rm --network macvlan2 --ip 192.168.0.11 busybox
--/ # ip addr
/ # ping 192.168.0.10 #可以通信

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第39张图片servre1:

docker run -it --rm --name demo1 --network macvlan2 --ip 192.168.0.10 busybox

 server2:

--/ # ping demo1 #不能ping通

docker run -it --rm --name demo2 --network macvlan2 --ip 192.168.0.11 busybox
/ # ping demo2  #能ping通自己

 让不同macvlan网络容器通信:

server1:

--/ # ip addr
ctrl+p+q #不回收

docker ps  #可以看到demo1是活着的
docker inspect  demo1 
docker run -d --name demo2 --network macvlan1 --ip 10.0.0.10 nginx
docker inspect demo2
docker ps  #可以看到开了两个,分别接入不同的macvlan

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第40张图片

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第41张图片

server2:

docker run -it --rm --name demo3 --network macvlan2 --ip 192.168.0.11 busybox
--/ # ping 192.168.0.10  可以通
/ # ping 10.0.0.10  不能通

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第42张图片

在第二台server2窗口:

docker network  connect  macvlan1 demo3


回到刚才的server2:

--/ # ip addr  #可以看到有两块网卡
/ # ping 10.0.0.10  #可以通

Docker--网络跨主机实现之docker网络通信、跨主机容器网络_第43张图片

你可能感兴趣的:(docker,网络,容器)