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网络的自定义

@天才卧龙的拨客人

 

 @天才卧龙的波尔克

posted @ 2022-04-11 18:19  天才卧龙  阅读(604)  评论(0编辑  收藏  举报