Docker基础(三)--网络

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	#创建网络
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值