目录
一、docker网络通信
1、容器通信
2、监控容器内的web服务器:--link的通信方式
3、跨主机通信:
容器访问外网【使用防火墙】
二、跨主机容器网络
1、macvlan网络方案实现
创建macvlan网络
让不同macvlan网络容器通信:
【推荐使用自定义网络,因为有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
【两个容器之前使用共享的网络栈,通过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 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
--/ # env #可以看到变量没有变
--/ # cat /etc/hosts #但是host变了
--/ # ping web
--/ # ping demo
--/ # ping demo2
#可以看到demo2ping不通,没有解析
【宿主机访问本机使用的是iptables DNAT
外部主机访问容器或者容器之间的访问是docker-proxy】
iptables -t nat -nL
外网访问容器【定义端口影射】
docker ps
docker rm -f demo2
docker rm -f demo
以上两者都不能访问(没有做端口影射),监听的是本机内部的,
docker run -d --name demo -p 80:80 nginx
docker ps
docker port demo
在真机中:
curl 172.25.70.2 #可以访问到
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
真机中:
curl 172.25.70.2 #还可以访问到默认页面【curl命令没有缓存】
curl 172.25.70.2 -I
server2:
刚删掉DNAT规则还可以访问到就是因为docker时双冗余机制
netstat -antlp
kill -9 5668 #删除docker-proxy
netstat -antlp
真机中:
curl 172.25.70.2 -I #访问被拒绝
docker restart demo
#重新启动demo
netstat -antlp
#可以看到docker-proxy又恢复了
iptables -t nat -nL
#DNAT规则也已经重新自动创建好了
netstat -antlp
kill -9 5908
#再次删掉docker-proxy,【留着防火墙】
netstat -antlp
真机中:
curl 172.25.70.2 -I #还可以访问
本机内部访问:
docker inspect demo
curl 172.17.0.2 #可以访问到默认页面
brctl show #内部数据包走的是网桥
(linux内核提供的网卡虚拟化技术,不需要桥接,使用物理接口)
给server1、2上个添加一个网卡
server2:
docker network ls
docker network prune 删除多余的网络
docker network ls
停掉仓库
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 #打开混杂模式
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 可以看到混杂模式已经打开
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 network create -d macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.1 -o parent=eth1 macvlan1
docker inspect macvlan1
docker run -it --rm --network macvlan1 busybox
--/ # ip addr
分到的地址是10.0.0.2
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 run -it --rm --network macvlan1 --ip 10.0.0.10 busybox
--/ # ip addr
--/ # ping 10.0.0.11 #可以访问成功
--/ # ping 10.0.0.10
--/ # ping 10.0.0.10 #2台机器是互通的
brctl show #没有桥接,直接使用宿主机网卡做的直通
docker ps
docker rm -f demo #删掉之前的demo容器
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
**注意:macvlan网络在二层上是隔离的,所以不同macvlan网络容器是不能通信的,
server1:
docker run -it --rm --network macvlan2 --ip 192.168.0.10 busybox
--/ # ip addr
server2同理:
docker run -it --rm --network macvlan2 --ip 192.168.0.11 busybox
--/ # ip addr
/ # ping 192.168.0.10 #可以通信
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通自己
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
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 不能通
在第二台server2窗口:
docker network connect macvlan1 demo3
--/ # ip addr #可以看到有两块网卡
/ # ping 10.0.0.10 #可以通