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