上篇 Docker网络篇_dotaer-df的博客-CSDN博客 讲到了Docker0的作用,它其实有局限性,因为容器会经常重启,重启后ip地址会变化,那么再用原来的ip进行通信,肯定是行不通了,有没有一种方法通过名字来进行通信了。有两种方案一种是容器启动时候制定--link,一种是自定义网络,下面详细的介绍一下这两种方案。
一、--link
--link list Add link to another container
(1) 容器run时,不指定--link,可以看到01无法ping通02
(2)容器run时,指定--link
可以看到启动mycentos02的时候指定了 --link 与01进行了绑定,然后我们通过02 ping 01是可以ping通的。但是反过来01 ping 02就是不行的
那原理是什么呢?其实很简单,我们可以进入02容器里,查看 /etc/hosts这个文件
可以发现它把 01 与 172.17.0.2作了一个绑定 ,同时加了容器的id,也就是我们ping容器id也是可以ping通的。
二、通过自定义网络(常用)
我们先通过docker network命令查看当前的一个网络
[root@iZbp1csuqi4s80m3g73awpZ home]# docker network ls
NETWORK ID NAME DRIVER SCOPE
37f5939b2d4f bridge bridge local
7aafef127881 host host local
40ef83445d70 none null local
其中:
- bridge:桥接,即docker0(默认)
- none:不配置网络
- host:和宿主机共享网络
然后我们通过 docker network create来创建一个网络
[root@iZbp1csuqi4s80m3g73awpZ home]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
929ad745cafb8e53974e57b059374cf2b77b9454e629c54644b1a198947469fe
[root@iZbp1csuqi4s80m3g73awpZ home]# docker network ls
NETWORK ID NAME DRIVER SCOPE
37f5939b2d4f bridge bridge local
7aafef127881 host host local
929ad745cafb mynet bridge local
40ef83445d70 none null local
--driver #指定网络模式使用桥接模式(同时也是默认值)
--subnet #指定可以互相访问的网段 192.168.0.0/16(192.168.0.1 ~ 192.168.255.254)
--gateway #指定网关,所有容器互相访问都要通过这个网关
mynet #自定义网络的名字
看一下我们自定义网络的详细信息
[root@iZbp1csuqi4s80m3g73awpZ home]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "929ad745cafb8e53974e57b059374cf2b77b9454e629c54644b1a198947469fe",
"Created": "2022-05-19T15:30:00.140680599+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
可以看到上面这一部分的containers中有正在运行的所有容器和他们的ip。当运行容器不指定ip的时候,它就会随机分配一个ip,而随机分配的数量也是有限制的,通过上文指定的--subnet。
然后启动的时候通过--net指定我们自定义的网络就ok了
docker run -dit --name mycentos03 --net mynet mycentos:1.0 /bin/bash
docker run -dit --name mycentos04 --net mynet mycentos:1.0 /bin/bash
[root@iZbp1csuqi4s80m3g73awpZ home]# docker run -dit --name mycentos03 --net mynet mycentos:1.0 /bin/bash
4493f89702bbfb9142cac33a6ca5e5218025cf35d674214b77728cf8a034917b
[root@iZbp1csuqi4s80m3g73awpZ home]# docker run -dit --name mycentos04 --net mynet mycentos:1.0 /bin/bash
374fe4415d538389bf41dbffa7e1b94d6b4f1729830b9aba23ec11178d210f7a
d[root@iZbp1csuqi4s80m3g73awpZ home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
374fe4415d53 mycentos:1.0 "/bin/bash" 3 seconds ago Up 1 second mycentos04
4493f89702bb mycentos:1.0 "/bin/bash" 10 seconds ago Up 9 seconds mycentos03
8ee919784d2c mycentos:1.0 "/bin/bash" About an hour ago Up About an hour mycentos02
ba6330c7064d mycentos:1.0 "/bin/bash" About an hour ago Up About an hour mycentos01
[root@iZbp1csuqi4s80m3g73awpZ home]# docker exec -it 374fe4415d53 ping mycentos03
PING mycentos03 (192.168.0.2) 56(84) bytes of data.
64 bytes from mycentos03.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.127 ms
64 bytes from mycentos03.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.078 ms
[root@iZbp1csuqi4s80m3g73awpZ home]# docker exec -it 4493f89702bb ping mycentos04
PING mycentos04 (192.168.0.3) 56(84) bytes of data.
64 bytes from mycentos04.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.099 ms
64 bytes from mycentos04.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.101 ms
64 bytes from mycentos04.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.094 ms
三、connect
我们都知道不同网段是通常是不能访问的,01是在Docker0这个网络下,03是在mynet这个网络下,处在不同网段,如下图
那如何实现01访问03呢,答案是通过connect
先看一下这个命令如何使用
[root@iZbp1csuqi4s80m3g73awpZ home]# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
--alias strings Add network-scoped alias for the container
--driver-opt strings driver options for the network
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
--link list Add link to another container
--link-local-ip strings Add a link-local address for the container
[root@iZbp1csuqi4s80m3g73awpZ home]# docker network connect mynet mycentos01
[root@iZbp1csuqi4s80m3g73awpZ home]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "929ad745cafb8e53974e57b059374cf2b77b9454e629c54644b1a198947469fe",
"Created": "2022-05-19T15:30:00.140680599+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"374fe4415d538389bf41dbffa7e1b94d6b4f1729830b9aba23ec11178d210f7a": {
"Name": "mycentos04",
"EndpointID": "9d7763fc71a2a99e81d3e47ad33e72b024b24d0823a0a62948c4f45bbeba8e53",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"4493f89702bbfb9142cac33a6ca5e5218025cf35d674214b77728cf8a034917b": {
"Name": "mycentos03",
"EndpointID": "06b457fd1d66e1244a36d59e71de570499c0cc8cb628568da10cedbd7f225324",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"ba6330c7064d9db63bcbe7e31937e4c77f126299c146de405cf70b74e459b139": {
"Name": "mycentos01",
"EndpointID": "aacc3a21391798ceaf96981a056e5cf89ceed9870ec4b38925f7b7e368057cac",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
# 连通之后就是mycentos01 放到了mynet网路下,可以看到ip也变了,这样一个容器就有了两个ip地址,01和03,04就可以互通了
参考链接: