目录
docker容器互联详解
一、容器互联概述:
二、案例实验:
1、用户自定义的网络:
2、查看当前的IP信息:
3、启动第三个容器:
4、查看三个容器内部的网络:
5、Ping测试:
Ps备注:
docker容器互联详解
一、容器互联概述:
容器互联是除了端口映射外另一种可以与容器通信的方式。端口映射的用途是宿主机网络与容器的通信,而容器互联是容器之间的通信。
当前实现容器互联有两种方式:
一种是把两个容器放进一个用户自定义的网络中,
另一种是使用--link参数(已经弃用,即将删除的功能)。
为什么要使用一个单独的网络来连接两个容器呢?
设想一下后端容器需要调用一个数据库环境,数据库容器和后端服务容器如果使用上下文中的暴露端口或者映射端口来通信,势必会把数据库的端口也暴露在外网中,导致数据库容器的安全性大大降低,为了解决这个问题,docker允许用户建立一个独立的网络来放置相应的容器,只有在该网络中的容器才能相互通信,外部容器是无法进入这个特定网络中的。
一个容器可以同时加入多个网络,使用不同地址可以访问不同网络中的容器。
二、案例实验:
1、用户自定义的网络:
首先创建两个容器,命名为cont1和cont2
[root@docker ~]# docker run -itd --name=cont1 busybox
[root@docker ~]# docker run -itd --name=cont2 busybox
2、查看当前的IP信息:
Cont1pingcont2测试:
接下来创建一个独立的容器网络,这里使用bridge驱动(桥接模式),其他可选的值还有overlay和macvlan。
[root@docker ~]# docker network create -d bridge --subnet 172.25.0.0/16 demo_net
[root@docker ~]# docker network ls
使用--subnet和--gateway可以指定子网和网关,现在我们把cont2加入到demo_net中
[root@docker ~]# docker network connect demo_net cont2
[root@docker ~]# docker network inspect demo_net
使用docker network inspect可以查看网络中容器的连接状态。Container2已经在demo_net网络中,注意IP地址使自动分配的。
[root@huyang1 ~]# docker exec -it 9a /bin/sh
/ # ifconfig
对比发现,此时cont2已经有了172.25.0.0的网络
3、启动第三个容器:
[root@docker ~]# docker run --network=demo_net --ip=172.25.3.3 -itd --name=cont3 busybox
[root@docker ~]# docker network inspect demo_net
此时,有三个容器,cont1和cont2可以ping通,cont2
和cont3可以ping通,而宿主机可以和三者任意ping通,详情如下图:
4、查看三个容器内部的网络:
[root@docker ~]# docker exec -it cont1 ifconfig
[root@docker ~]# docker exec -it cont2 ifconfig
[root@docker ~]# docker exec -it cont3 ifconfig
5、Ping测试:
【cont2】
[root@docker ~]# docker exec -it cont2 ping 172.17.0.2
[root@docker ~]# docker exec -it cont2 ping 172.25.3.3
【cont1】
[root@docker ~]# docker exec -it cont1 ping 172.17.0.2
[root@docker ~]# docker exec -it cont1 ping 172.25.0.2
[root@docker ~]# docker exec -it cont1 ping 172.25.3.3
【cont3】
[root@docker ~]# docker exec -it cont3 ping 172.17.0.2
[root@docker ~]# docker exec -it cont3 ping 172.25.0.2
[root@docker ~]# docker exec -it cont3 ping 172.17.0.3
Ps备注:
当发生三个容器cont1/2/3可以相互之间都能ping通,这时候,需要重启容器(systemctl restart docker),再开启测试!!!