docker 自定义网络 不使用 --link 也能实现容器间网络互通
十年河东,十年河西,莫欺少钱穷
学无止境,精益求精
关于docker网络基础,大家可参考:https://blog.csdn.net/weixin_45677119/article/details/108187604
1.介绍
常规docker容器启动,可以用–link,进行容器网络绑定,但是一旦容器多了,之后就会非常麻烦,所以要自定义一个docker网络,小白推荐使用–link命令
自定义网络修复了docker0的容器之间无法用容器名相互ping通的问题
自定义网络可以有效的区分不同镜像生成的容器管理问题,例如MySQL 集群使用自定义网络1,Redis集群使用自定义网络2,等
自定义网络同网段容器可以相互ping通【不需要使用--link指令就可以通】,是不是很牛逼
2.命令
自定义网络命令 | 说明 |
---|---|
docker network create | 创建自定义网络 |
docker network inspect | 查看自定义网络详情 |
docker network ls | 查看网络列表 |
docker network connect | 不同的自定义网络互相连接 |
docker network rm | 删除自定义网络 |
3、查看网络列表
docker network ls
4、查看网络元数据
docker network inspect 891c28afc2df
5、自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
--driver bridge 网络模式默认为桥接模式
--subnet 192.168.0.0/16 子网掩码 后16位可为任意值,大概支持 65535 个IP
--gateway 192.168.0.1 网关IP
6、查看创建的网络 mynet 的详细信息
docker network inspect mynet
7、创建指定网络的容器,我的本地镜像为centos
docker run -it --name mycentos --net mynet centos
--net 指定某个网络
8、容器内 ping 百度
ping www.baidu.com
可以ping通 网络正常
9、退出容器【ctrl +p+q】,容器还要继续运行的,在创建一个新的容器
docker run -it --name mycentos2 --net mynet centos
10,在容器mycentos2中 ping mycentos 容器
先进入容器
docker exec -it 13df312b5feb /bin/bash
然后ping
ping mycentos
由此可见,在自定义网络中,我们不使用 --link 指令,也能实现容器间网络互通。
继续新建一个网络,不同子网掩码,不同网关,实现两个不同网络之间的互联,这时就要用到另外一个命令,docker network connect [OPTIONS] NETWORK CONTAINER
docker network connect [OPTIONS] NETWORK CONTAINER
NETWORK 是指一个网络,例如上述创建的mynet
CONTAINER 是指一个容器,是不在 指定NETWORK 中的一个容器名称 或 容器ID
两个不同网络之间的容器互联技术
继续新建一个网络:
docker network create --subnet 192.170.1.0/16 --gateway 192.170.0.1 mynet2
此时,我们就有了两个2个网络,一个名称为 mynet ,一个名称为mynet2
在mynet2 网络下新建两个容器,分别命名为:networkcentos 、 networkcentos2
docker run -it --name networkcentos --net mynet2 centos
及
docker run -it --name networkcentos2 --net mynet2 centos
查看我们现有的四个容器
docker ps -a
启动mycentos 及 mycentos2
[root@localhost ~]# docker start 2641576ed291
2641576ed291
[root@localhost ~]# docker start 13df312b5feb
此时,四个容器均为启动状态,他们之间有如下关系
那么,在Mynet 中是否可以 ping 通 myNet2 中的容器?
进入容器,并尝试 Ping
docker attach mycentos
ping networkcentos2
ping 不通,此时我们只需执行一条 connect 指令,即可完成网络互通
关键指令:
docker network connect mynet2 mycentos
该指令的意思是指: mycentos 容器 可以和mynet2 网络中的任何一个容器互联
测试如下,分别进入mynet2 容器, ping centos 容器:
[root@localhost ~]# docker attach networkcentos [root@75c9fb8107ed /]# ping mycentos PING mycentos (192.170.0.4) 56(84) bytes of data. 64 bytes from mycentos.mynet2 (192.170.0.4): icmp_seq=1 ttl=64 time=0.363 ms 64 bytes from mycentos.mynet2 (192.170.0.4): icmp_seq=2 ttl=64 time=0.273 ms 64 bytes from mycentos.mynet2 (192.170.0.4): icmp_seq=3 ttl=64 time=0.589 ms 64 bytes from mycentos.mynet2 (192.170.0.4): icmp_seq=4 ttl=64 time=0.418 ms read escape sequence [root@localhost ~]# docker attach networkcentos2 [root@6a179f79f064 /]# ping mycentos PING mycentos (192.170.0.4) 56(84) bytes of data. 64 bytes from mycentos.mynet2 (192.170.0.4): icmp_seq=1 ttl=64 time=0.174 ms 64 bytes from mycentos.mynet2 (192.170.0.4): icmp_seq=2 ttl=64 time=0.336 ms 64 bytes from mycentos.mynet2 (192.170.0.4): icmp_seq=3 ttl=64 time=0.337 ms
测试结果,可以 ping 通
如果在 mynet2 容器中,ping mycentos2 是否能ping通呢?
[root@6a179f79f064 /]# ping mycentos2
ping: mycentos2: Name or service not known
测试结果 ping 不通
如果想让 mycentos2 容器访问 mynet2网络,只需执行:
docker network connect mynet2 mycentos2 --mycentos2 可以访问 mynet2 中的任何容器
这就是docker网络的自定义
@天才卧龙的拨客人
@天才卧龙的波尔克