docker的网络模式
docker的网络模式共有4种:
- bridge,即桥接模式,启动时用–net=bridge指定,不显示指定启动的容器,都会分配子网范围内的ip。运用veth-pair技术,每启动一个容器,就创建1对接口,一端连接宿主机,一端连接容器(eth0接口),通过这个方式,其中的容器可以相互通信,通信模式如下图,四种网络模式中比较常见的就是桥接,下面单独介绍。
[root@master ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
61d70187231b bridge bridge local
c9d98ef2a4af host host local
f473058b9f1b none null local
#用inspect查看默认的桥接网络的子网和网关
[root@master ~]# docker network inspect 61d70187231b
[
{
"Name": "bridge",
"Id": "61d70187231bf0983d30a280f51a05f1956da619726ce8462397df0bec3acb6e",
"Created": "2021-11-28T18:49:57.835795362+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
- host模式:容器和宿主机共享网络命名空间,其实就是不创建新的虚拟网卡,而是偷懒直接使用了宿主机的网卡,但是文件系统和进程等和宿主机隔离。
# 创建的一个demo jar来瞅瞅
[root@master jar_demo]# docker run -d -it --name="host_demo" --net=host -P demo_jar:1.0
# bb9f741e055712638682a00dde8621eddb0c6b34c2038fc0eb8e4fe73afa637d
运行的host_demo和宿主机一样使用ens33网卡,但是用top看进程是看不到宿主机的进程的
[root@master jar_demo]# docker exec -it host_demo ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:fd:fb:01 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.101/24 brd 192.168.1.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fefd:fb01/64 scope link
valid_lft forever preferred_lft forever
[root@master jar_demo]# docker exec -it host_demo top
top - 13:19:59 up 25 min, 0 users, load average: 0.00, 0.01, 0.05
Tasks: 2 total, 1 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.8 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 995704 total, 919292 used, 76412 free, 16 buffers
KiB Swap: 2097148 total, 4616 used, 2092532 free. 321084 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 2694000 114420 14708 S 0.3 11.5 0:04.50 java
27 root 20 0 23636 1516 1132 R 0.0 0.2 0:00.02 top
# 查看宿主机网卡
[root@master jar_demo]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:fd:fb:01 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.101/24 brd 192.168.1.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fefd:fb01/64 scope link
valid_lft forever preferred_lft forever
- none:容器自己可以有独自的网络空间,但是启动时不会默认创建,需要自己指定网卡配置
# 创建一个none的容器看看
[root@master jar_demo]# docker run -d -P --name="none_demo" --net=none demo_jar:1.0
81600d60c2e1938c7aa941ac6c04fa0f8449304f81af255e28b4789d4d038a6a
# 进入容器发现只有一个lo回环网卡
[root@master jar_demo]# docker exec -it none_demo /bin/sh
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
#
- container:创建时指定它的网络命名空间和一个已有的容器共享,包括共享ip、网卡配置等,但文件系统、进程等不共享,和上面的host类似,只不过host换成了一个容器,容器间通过回环网卡通信。
# 先启动一个桥接的容器(之前得容器都清空了)
[root@master jar_demo]# docker run -d -P --name="default_demo" demo_jar:1.0
4c025d5e7942aa482c752b57d168bf9e6d5154804e77ea34097b237f9354bcb1
# 查得ip为172.17.0.2
[root@master jar_demo]# docker exec -it default_demo ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@master jar_demo]#
# 再启动一个container的容器看看
[root@master jar_demo]# docker run -it --name="container_demo" --net=container:default_demo demo_jar:1.0 /bin/bash
...
Caused by: java.net.BindException: Address already in use
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:271)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:226)
at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1213)
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1299)
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:614)
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1072)
... 20 common frames omitted
[root@master jar_demo]#
# hahaha...我这里得demo是个jar服务,不能同一个端口启动两个服务,所以报错了。需要注意得是:因为要和指定容器保持一样得网络配置,所以这里不能用-p或者-P指定暴露端口,否则会抛错端口冲突:docker: Error response from daemon: conflicting options: port publishing and the container type network mode.
bridge桥接模式
我们通过实例来理解bridge模式,首先清空环境,以免不相干的容器看起来混乱。
[root@master ~]# docker rm -f $(docker ps -aq)
[root@master ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@master ~]#
启动两个tomcat容器,并查看ip
[root@master ~]# docker run -d -P --name="tomcat1" yiyu5527/mytomcat8.5.50:0.1
a10441d0556eacfe935a85319e45ccc6582909ec120d69ec02b3e1c8e14dae0a
[root@master ~]# docker run -d -P --name="tomcat2" yiyu5527/mytomcat8.5.50:0.1
6f27b4b89e27f3a04b196c8f5b6df92b80f1c339449ce57055982b8ac1e344a4
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f27b4b89e27 yiyu5527/mytomcat8.5.50:0.1 "/bin/sh -c '/usr/lo…" 5 seconds ago Up 3 seconds 0.0.0.0:32769->8080/tcp tomcat2
a10441d0556e yiyu5527/mytomcat8.5.50:0.1 "/bin/sh -c '/usr/lo…" 11 seconds ago Up 9 seconds 0.0.0.0:32768->8080/tcp tomcat1
[root@master ~]# docker exec -it tomcat1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@master ~]# docker exec -it tomcat2 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
获得两个tomcat的ip分别是172.17.0.2、172.17.0.3,确实是属于172.17.0.0/16,且eth0网卡分别有6-7、8-9成对接口,其中,if7、if9为容器内端口,且再执行docker network inspect
查看,这俩容器都加入了bridge的containers中。
[root@master ~]# docker network inspect 61d70187231b
...
"Containers": {
"6f27b4b89e27f3a04b196c8f5b6df92b80f1c339449ce57055982b8ac1e344a4": {
"Name": "tomcat2",
"EndpointID": "4e5cf28706b011967f731d6c28af6a5f354d8d959630691d31e3db880a59bc91",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"a10441d0556eacfe935a85319e45ccc6582909ec120d69ec02b3e1c8e14dae0a": {
"Name": "tomcat1",
"EndpointID": "348164641be909955698555c3754b66657ff11958df97bc89054bc5288ec7f8c",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
[root@master ~]# docker exec -it tomcat1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
在宿主机上执行ip a看到,连接docker0的是if6、if8端口,和容器的eth0端口相对。
[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
...
5: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:7c:df:b9:ab brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:7cff:fedf:b9ab/64 scope link
valid_lft forever preferred_lft forever
7: veth14986ad@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 92:43:29:7d:06:70 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::9043:29ff:fe7d:670/64 scope link
valid_lft forever preferred_lft forever
9: vethff9bc6e@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether f6:a1:e9:5d:66:24 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::f4a1:e9ff:fe5d:6624/64 scope link
valid_lft forever preferred_lft forever
[root@master ~]#
验证连通性
[root@master ~]# docker exec -it tomcat1 curl -I 172.17.0.3:8080
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 28 Nov 2021 11:28:15 GMT
[root@master ~]# docker exec -it tomcat2 curl -I 172.17.0.2:8080
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 28 Nov 2021 11:28:22 GMT
看到这里,你会不会有个和我一样的疑问:
怎么让tomcat1和tomcat2已容器名的方式访问呢?
可以,有两种方式:
-
方式一:通过link访问
link方式,其实就是通过指定hosts来实现单向通信,现在已经不推荐使用了。
# 这是配置之前的 [root@master ~]# docker exec tomcat1 ping tomcat2 ping: tomcat2: Name or service not known [root@master ~]# docker exec tomcat2 ping tomcat1 ping: tomcat1: Name or service not known [root@master ~]# # 开始配置,停止旧容器 [root@master ~]# docker stop tomcat1 tomcat1 [root@master ~]# docker stop tomcat2 tomcat2 [root@master ~]# docker rm $(docker ps -aq) 6f27b4b89e27 a10441d0556e [root@master ~]# # 重新启动2个容器 [root@master ~]# docker run -d -P --name="tomcat1" yiyu5527/mytomcat8.5.50:0.1 c8d98454b29f845193aac514ad7fd729f5a233ac0faaed61a39b147f7a8cdeb8 [root@master ~]# docker run -d -P --name="tomcat2" --link="tomcat1" yiyu5527/mytomcat8.5.50:0.1 4fd2b3e86f5c6288772069fc6444c08daa456df97f554fc0ebd3277c4a9adf8b # 现在看看访问结果,发现通过--link可以让tomcat2访问tomcat1 [root@master ~]# docker exec -it tomcat1 ping tomcat2 ping: tomcat2: Name or service not known [root@master ~]# docker exec -it tomcat2 ping tomcat1 PING tomcat1 (172.17.0.2) 56(84) bytes of data. 64 bytes from tomcat1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.088 ms 64 bytes from tomcat1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.162 ms #其实--link做的也只不过是在容器的/etc/hosts里添加了主机映射:172.17.0.2 tomcat1 c8d98454b29f [root@master ~]# docker exec -it tomcat2 cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 tomcat1 c8d98454b29f 172.17.0.3 4fd2b3e86f5c
-
方式二:自定义网络
通过–link只实现单向通信,如果要双方互相通信,还需要再tomcat1的/etc/hosts添加tomcat2的主机映射关系。现在我们来看看创建自定义网络怎么实现双向通信。
清空环境
[root@master ~]# docker rm -f $(docker ps -aq)
4fd2b3e86f5c
c8d98454b29f
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@master ~]#
创建一个网络
# 创建前
[root@master ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
61d70187231b bridge bridge local
c9d98ef2a4af host host local
f473058b9f1b none null local
# 模仿docker0创建一个桥接网络,我们需要指定向docker0一样有的关键配置
"Driver": "bridge",
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
[root@master ~]# docker network create --subnet 172.168.0.0/24 --gateway 172.168.0.1 --driver bridge mynet
63836bc255d95863dc405e3128953752dd78e304cfafcdc15ba1482fcbc83b58
#创建成功,network id为63836bc255d9就是我们创建的mynet
[root@master ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
61d70187231b bridge bridge local
c9d98ef2a4af host host local
63836bc255d9 mynet bridge local
f473058b9f1b none null local
[root@master ~]#
# 启动两个tomcat,指定为mynet网络,这里用--net和--network都可以,且docker参数中大多key value等价于key=value
[root@master ~]# docker run -d -P --net mynet --name tomcat1 yiyu5527/mytomcat8.5.50:0.1
6ee31af067564610b66e4ec5cb48ed7744534ddf6f6d9ee40320a1912fd233be
[root@master ~]# docker run -d -P --net mynet --name tomcat2 yiyu5527/mytomcat8.5.50:0.1
0f786258dbd2015b88aca39b5e63b44eaddac43c2f296fa3eec0fcdd06120eac
[root@master ~]#
#查看mynet的container,发现2个容器已经加入子网
[root@master ~]# docker network inspect mynet
[
{
"Name": "mynet",
...
"Containers": {
"0f786258dbd2015b88aca39b5e63b44eaddac43c2f296fa3eec0fcdd06120eac": {
"Name": "tomcat2",
"EndpointID": "001a373a607d22735a7bcae1365b1df1e784eebb8821ae5bae254af0524ad8ae",
"MacAddress": "02:42:ac:a8:00:03",
"IPv4Address": "172.168.0.3/24",
"IPv6Address": ""
},
"6ee31af067564610b66e4ec5cb48ed7744534ddf6f6d9ee40320a1912fd233be": {
"Name": "tomcat1",
"EndpointID": "4d5c1e92e4f52eae8cb129c5d7033d3edf3402cb9e6812cf4cf956ce2a15048f",
"MacAddress": "02:42:ac:a8:00:02",
"IPv4Address": "172.168.0.2/24",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
[root@master ~]#
#验证连通性,发现能互相通信
[root@master ~]# docker exec -it tomcat1 curl -I tomcat2:8080
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 28 Nov 2021 12:20:31 GMT
[root@master ~]# docker exec -it tomcat2 curl -I tomcat1:8080
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 28 Nov 2021 12:20:38 GMT
通过自定义创建网络,不仅方便集群内容器互相通信,还可以实现集群之间的隔离。那,又衍生出一个疑问:
不同网络下的容器怎么实现通信?
也就是说,下面这个图中,tomcat101想要和tomcat2通信,应该怎么实现。
mynet的网络就不清空了,再创建一个桥接网络
[root@master ~]# docker network create --subnet 172.168.101.0/24 --gateway 172.168.101.1 --driver bridge hernet
0efdea61d7b425e85a0b2d865f872d109e0cb6754fa82135dc70b8895f74eca1
[root@master ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
61d70187231b bridge bridge local
0efdea61d7b4 hernet bridge local
c9d98ef2a4af host host local
63836bc255d9 mynet bridge local
f473058b9f1b none null local
# 创建2个再hernet内的tomcat容器
[root@master ~]# docker run -d -P --name tomcat101 --net hernet yiyu5527/mytomcat8.5.50:0.1
7ed2f2b76c0011c402fb09e87377b4e1e0b285838e617fdea3cb17dd91fcc324
[root@master ~]# docker run -d -P --name tomcat102 --net hernet yiyu5527/mytomcat8.5.50:0.1
e3b6c659df219405e93cb00a58758f6d75e432831b17fa12cbb017aaf657a4a9
# 现在有mynet和hernet两个桥接网络,分别处于不同网段,理论上tomcat101和tomcat2是不通的
[root@master ~]# docker exec -it tomcat101 ping tomcat2
ping: tomcat2: Name or service not known
[root@master ~]#
# 不要杠,属于不同网段,ping ip也是不通的
[root@master ~]# docker exec -it tomcat2 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
17: eth0@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:a8:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.168.0.3/24 brd 172.168.0.255 scope global eth0
valid_lft forever preferred_lft foreve
[root@master ~]# docker exec -it tomcat101 ping 172.168.0.3
PING 172.168.0.3 (172.168.0.3) 56(84) bytes of data.
^C
--- 172.168.0.3 ping statistics ---
26 packets transmitted, 0 received, 100% packet loss, time 25023ms
# 要想让tomcat101能访问tomcat2,需要用到connect指令,命令使用方式,用--help看一下就知道了,其他命令同理
[root@master ~]# 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@master ~]#
#看了help,就发现其实这里有两种方式,一是把tomcat101和mynet联通,二是把tomcat2和hernet联通,既然是tomcat101想访问tomcat2,当然得她自己主动了。好了,话不多说,开始联通
[root@master ~]# docker network connect mynet tomcat101
[root@master ~]#
#没有报错应该就是成功了,来请求看看
[root@master ~]# docker exec -it tomcat101 ping tomcat2
PING tomcat2 (172.168.0.3) 56(84) bytes of data.
64 bytes from tomcat2.mynet (172.168.0.3): icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from tomcat2.mynet (172.168.0.3): icmp_seq=2 ttl=64 time=0.160 ms
64 bytes from tomcat2.mynet (172.168.0.3): icmp_seq=3 ttl=64 time=0.281 ms
...
[root@master ~]# docker exec -it tomcat101 curl -I tomcat2:8080
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 28 Nov 2021 12:55:55 GMT
[root@master ~]#
果然可以,docker network connect诚不我欺!这里其实是把容器添加到了网络得containers里,让她脚踏两只船,我们inspect就能看到mynet得containers里多了tomcat101。这个处方虽然治好了tomcat101不能访问tomcat2得问题,却也有副作用,因为tomcat101加入了mynet的网络,那tomcat1和tomcat101也就都互相联通了。
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
[root@master ~]# docker network inspect mynet
...
"Containers": {
"0f786258dbd2015b88aca39b5e63b44eaddac43c2f296fa3eec0fcdd06120eac": {
"Name": "tomcat2",
"EndpointID": "001a373a607d22735a7bcae1365b1df1e784eebb8821ae5bae254af0524ad8ae",
"MacAddress": "02:42:ac:a8:00:03",
"IPv4Address": "172.168.0.3/24",
"IPv6Address": ""
},
"6ee31af067564610b66e4ec5cb48ed7744534ddf6f6d9ee40320a1912fd233be": {
"Name": "tomcat1",
"EndpointID": "4d5c1e92e4f52eae8cb129c5d7033d3edf3402cb9e6812cf4cf956ce2a15048f",
"MacAddress": "02:42:ac:a8:00:02",
"IPv4Address": "172.168.0.2/24",
"IPv6Address": ""
},
"7ed2f2b76c0011c402fb09e87377b4e1e0b285838e617fdea3cb17dd91fcc324": {
"Name": "tomcat101",
"EndpointID": "dacfe8c4dbfcbb8941f9f6776531871c8126f2dfcc5db158855eb7dfde7f06ce",
"MacAddress": "02:42:ac:a8:00:04",
"IPv4Address": "172.168.0.4/24",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
[root@master ~]# docker exec -it tomcat1 ping tomcat101
PING tomcat101 (172.168.0.4) 56(84) bytes of data.
64 bytes from tomcat101.mynet (172.168.0.4): icmp_seq=1 ttl=64 time=0.092 ms
64 bytes from tomcat101.mynet (172.168.0.4): icmp_seq=2 ttl=64 time=0.165 ms
常用的docker网络命令
docker network ls #查看网络列表
rm #删除网络
inspect #查看网络详细信息
connect #连接容器和网络
create #创建网络