Docker Network 基础

news2024/11/18 9:30:02

一、是什么

Docker网络是Docker容器之间和容器与外部网络之间的通信和连接的一种机制。在Docker中,每个容器都可以有自己的网络栈,包括网络接口、IP地址和网络配置。Docker网络提供了一种灵活且可定制的方式,使得容器之间可以相互通信,并与主机或其他网络资源进行交互。

二、能做什么

Docker网络可以实现容器之间的互联以及端口映射容器IP变动的时候可以通过服务名直接网络通信而不受影响

三、常用命令

命令作用
connect将容器连接到网络
create创建网络
disconnect断开容器与网络的连接
inspect显示一个或多个网络上的详细信息
ls列举所有网络
prune删除所有未使用的网络
rm删除一个或多个网络

查看网络

通过 docker network ls 查看所有网络。

root@DESKTOP-R4LSK2C:~# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
4a0f7a00714f   bridge    bridge    local
ff4eecf4c521   host      host      local
db2d9d647b48   none      null      local

查看网络源数据

通过docker network inspect 网络名称查看网络的具体信息

root@DESKTOP-R4LSK2C:~# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "4a0f7a00714fda127c61e6359fd9ead4f9f29c738f7623e4bf695c8b7df7c61a",
        "Created": "2023-06-25T09:08:49.753463804+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"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

创建网络

通过 docker network create 网络名称 创建一个新的网络(自定义网络)。

root@DESKTOP-R4LSK2C:~# docker network create my_network
fe52e5328a98071302bf79c9740a7c07e6d9f6c3f7feee064311f4747e1bb5c2

连接网络

启动一个tomcat8容器,查看网络连接状态。

root@DESKTOP-R4LSK2C:~# docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
903c09561a0a98b97eb2c169ce2df3c43ed183dbf3c46e377f6c0dbbdb0e9571

通过 docker inspect 容器名称|ID 查看容器的网络信息,在 NetworkSettings 节点中可以看到详细信息。

root@DESKTOP-R4LSK2C:~# docker inspect tomcat82 | tail -n 40
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "5f1bf621976c7aa9797285805dff18ce63cad6d9f1706ac8ca1636e2edd9111d",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/5f1bf621976c",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "4a0f7a00714fda127c61e6359fd9ead4f9f29c738f7623e4bf695c8b7df7c61a",
                    "EndpointID": "",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": null
                }
            }
        }
    }

通过 docker network connect 网络名称 容器名称 为容器连接新的网络模。

root@DESKTOP-R4LSK2C:~# docker network connect my_network tomcat82

发现以及连接了我们新建的网络。

root@DESKTOP-R4LSK2C:~# docker inspect tomcat82 | tail -n 40
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "4a0f7a00714fda127c61e6359fd9ead4f9f29c738f7623e4bf695c8b7df7c61a",
                    "EndpointID": "",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": null
                },
                "my_network": {
                    "IPAMConfig": {},
                    "Links": null,
                    "Aliases": [
                        "01d6192dc23d"
                    ],
                    "NetworkID": "",
                    "EndpointID": "",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": {}
                }
            }
        }
    }
]

断开网络

通过 docker network disconnect 网络名称 容器名称 命令断开网络。

root@DESKTOP-R4LSK2C:~# docker network disconnect my_network tomcat82
root@DESKTOP-R4LSK2C:~# docker inspect tomcat82 | tail -n 40
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "5f1bf621976c7aa9797285805dff18ce63cad6d9f1706ac8ca1636e2edd9111d",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/5f1bf621976c",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "4a0f7a00714fda127c61e6359fd9ead4f9f29c738f7623e4bf695c8b7df7c61a",
                    "EndpointID": "",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": null
                }
            }
        }
    }
]

删除网络

通过 docker network rm 网络名称 删除网络。

root@DESKTOP-R4LSK2C:~# docker network rm my_network
aa

四、网络模式

网络模式简介
bridge为每个容器分配,设置ip等,并将容器连接到一个docker0,虚拟网桥,默认该模式。
host容器将不会虚拟出自己的网卡,配置自己的Ip等,而是使用宿主机的IP和端口。
none容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,IP等。
container而创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等。

Bridge模式

Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

启动两个容器,启动容器要保证你的系统中有相应的镜像。

root@DESKTOP-R4LSK2C:~# docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
b8f3c005d48a525c62b9e3c0c3d0b9d0d807cf066e1f137b0e95da3cc8cbde5d
root@DESKTOP-R4LSK2C:~# docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
01d6192dc23d5a34dea3ef13d6a7ac6b476a3cbfbbdc2cee36287494d80165b2

查看docker的ip地址,会新增两个网卡veth86f068f@if5,vethb1f17be@if7。所以可以得出结论们每启动一个容器,就会多出一对网卡,同时他们被连接到docker0上,而docker0又和虚拟机之间连通。

root@DESKTOP-R4LSK2C:~# ip addr
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:86:0b:07 brd ff:ff:ff:ff:ff:ff
    inet 172.22.78.81/20 brd 172.22.79.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fe86:b07/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:36:f7:04:fc 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:36ff:fef7:4fc/64 scope link
       valid_lft forever preferred_lft forever
6: veth86f068f@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether 62:3f:7c:bf:04:b4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::603f:7cff:febf:4b4/64 scope link
       valid_lft forever preferred_lft forever
8: vethb1f17be@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether 7e:6b:dc:90:cd:6c brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::7c6b:dcff:fe90:cd6c/64 scope link
       valid_lft forever preferred_lft forever

进入端口号为81的容器,查看容器的ip地址,会有eth0@if6这个网卡。

root@DESKTOP-R4LSK2C:~# docker exec -it tomcat81 bash
root@b8f3c005d48a:/usr/local/tomcat# ip addr
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
5: eth0@if6: <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

进入端口号为82的容器,查看容器的ip地址,会有eth0@if8这个网卡。

root@DESKTOP-R4LSK2C:~# docker exec -it tomcat82 bash
root@01d6192dc23d:/usr/local/tomcat# ip addr
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
7: eth0@if8: <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

从中我们可以知道只要我们创建了一个容器,docker就会新增一个网卡,同时容器也会新增一个网卡来与之对应,我们可以抽象为这样一个网络模型。
在这里插入图片描述
从以上的分析我们可以得出以下结论

  • Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
  • docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。
  • 网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。

通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。

Host 模式

直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。

我们可以使用host 网络模式需要在创建容器时通过参数 --net host 或者 --network host 指定,使用了host网络模式就不需要使用-p指定端口号,通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。

root@DESKTOP-R4LSK2C:~# docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
WARNING: Published ports are discarded when using host network mode
022bd58f324206ae8a0d059810bd94ace5c69613c1027b653d48a211f657d29c

正确的使用方法直接使用--net host就可以了。

root@DESKTOP-R4LSK2C:~# docker run -d --net host --name tomcat83 billygoo/tomcat8-jdk8
3995d89c8a373c3d3aabfc1250141b712de118d355c9bcaf30ca8517a4d1d56a

查看docker的ip地址,我们可以发现使用host网络模式并没有在docker中并没有增加网卡。

root@DESKTOP-R4LSK2C:~# ip addr
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:86:0b:07 brd ff:ff:ff:ff:ff:ff
    inet 172.22.78.81/20 brd 172.22.79.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fe86:b07/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:36:f7:04:fc 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:36ff:fef7:4fc/64 scope link
       valid_lft forever preferred_lft forever
6: veth86f068f@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether 62:3f:7c:bf:04:b4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::603f:7cff:febf:4b4/64 scope link
       valid_lft forever preferred_lft forever
8: vethb1f17be@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether 7e:6b:dc:90:cd:6c brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::7c6b:dcff:fe90:cd6c/64 scope link
       valid_lft forever preferred_lft forever

对比一下tomcat82容器和tomcat83容器的网络连接,发现host网络模式子安是没有IP地址和网关的,而bridge模式下且是有网关和IP地址。

root@DESKTOP-R4LSK2C:~# docker inspect tomcat83 | tail -n 20
            "Networks": {
                "host": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "ff4eecf4c521cc1dadfd9352b22efec3c2094f2065234b20acf96e4c46cf3f3d",
                    "EndpointID": "49b9468a47e650e19b6ea2291973bc68f011abce58e0ce541f89d626c6e6f354",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": null
                }
            }
        }
    }
]
root@DESKTOP-R4LSK2C:~# docker inspect tomcat82 | tail -n 20
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "4a0f7a00714fda127c61e6359fd9ead4f9f29c738f7623e4bf695c8b7df7c61a",
                    "EndpointID": "4135c3042cd5eacb8b42638f70b0ad967c7e9e8636524596aaeaec1a5e7bcf71",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        }
    }
]

入tomcat83容器查看IP地址,可以发现和docker上网卡是一模一样的。

root@DESKTOP-R4LSK2C:/usr/local/tomcat# ip addr
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:86:0b:07 brd ff:ff:ff:ff:ff:ff
    inet 172.22.78.81/20 brd 172.22.79.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fe86:b07/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:36:f7:04:fc 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:36ff:fef7:4fc/64 scope link
       valid_lft forever preferred_lft forever
6: veth86f068f@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether 62:3f:7c:bf:04:b4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::603f:7cff:febf:4b4/64 scope link
       valid_lft forever preferred_lft forever
8: vethb1f17be@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether 7e:6b:dc:90:cd:6c brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::7c6b:dcff:fe90:cd6c/64 scope link
       valid_lft forever preferred_lft forever

我们可以抽象为这样一个网络模型。
在这里插入图片描述
从以上的分析我们可以得出以下结论

  • 容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口

Container 模式

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。在创建容器时通过参数 --net container:已运行的容器名称|ID 或者 --network container:已运行的容器名称|ID 指定。

启动alpine1容器,查看IP地址。

root@DESKTOP-R4LSK2C:~# docker run -it --name alpine1 alpine /bin/sh
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

用container网络模式启动alpine2容器,让其共用alpine1容器的网络,查看alpine2容器的IP地址。

root@DESKTOP-R4LSK2C:~# docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

我们可以抽象为这样一个网络模型。
在这里插入图片描述

从以上分析我们可以得出以下结论。

  • Container 网络模式下新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

None模式

禁用网络功能,只有lo标识(环回地址:127.0.0.1)

启动tomcat84容器,使用none模式。

root@DESKTOP-R4LSK2C:~# docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
a3346e4a854bb8aa44490e01a5ae3f46b9c92da5d2600d0b6aa3814be39b7117

查看tomcat84容器的IP。

root@DESKTOP-R4LSK2C:~# docker exec -it tomcat84 bash
root@a3346e4a854b:/usr/local/tomcat# ip addr
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

从以上分析我们可以得出结论。

  • 在none模式下,并不为Docker容器进行任何网络配置,也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo,需要我们自己为Docker容器添加网卡、配置IP等。

自定义网络

虽然 Docker 提供的默认网络使用比较简单,但是为了保证各容器中应用的安全性,在实际开发中更推荐使用自定义的网络进行容器管理,以及启用容器名称到 IP 地址的自动 DNS 解析。

在上面的实例中我们已经创建了两个容器一个是tomcat81,一个是tomcat82,这两个容器都是使用bridge网络模式,现在我们来验证以下他们之间的网络通讯。我们进入两个容器互相ping对方的IP。

root@DESKTOP-R4LSK2C:~# docker exec -it tomcat81 /bin/bash
root@b8f3c005d48a:/usr/local/tomcat# ip addr
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
5: eth0@if6: <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@DESKTOP-R4LSK2C:~# docker exec -it tomcat82 /bin/bash
root@01d6192dc23d:/usr/local/tomcat# ip addr
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
7: eth0@if8: <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
root@b8f3c005d48a:/usr/local/tomcat# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.126 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.050 ms
root@01d6192dc23d:/usr/local/tomcat# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.438 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.043 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.070 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.083 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.099 ms

可以发现他们两个容器之间的网络通讯是正常的,那么我们ping对方的容器名呢?

root@01d6192dc23d:/usr/local/tomcat# ping tomcat81
ping: tomcat1: Name or service not known
root@b8f3c005d48a:/usr/local/tomcat# ping tomcat82
ping: tomcat2: Name or service not known

无法ping通对法的容器,因为IP是动态的我们不可能写死IP所以我们需要用自定义的网络模式来通过容器名来进行容器之间的通讯。

新建一个自定义的网络

root@DESKTOP-R4LSK2C:~# docker network create my_network
2fe7b062a07d8d6e04abfd7a8db523279afa63d1d27240e46b512c4b2a9612fd

停掉tomcat81和tomcat82容器,然后使用自定义网络模式的方式启动容器。

root@DESKTOP-R4LSK2C:~# docker stop tomcat82
tomcat82
root@DESKTOP-R4LSK2C:~# docker stop tomcat81
tomcat82
root@DESKTOP-R4LSK2C:~# docker run -d -p 8081:8080 --net my_network --name tomcat81 billygoo/tomcat8-jdk8
903c09561a0a98b97eb2c169ce2df3c43ed183dbf3c46e377f6c0dbbdb0e9571
root@DESKTOP-R4LSK2C:~# docker run -d -p 8082:8080 --net my_network --name tomcat82 billygoo/tomcat8-jdk8
20766ca1078657bc5ba1d30363c89992de30af3843d9f1059ce7f91b63fcc62d

进入容器,互相ping对方的容器名。

root@DESKTOP-R4LSK2C:~# docker exec -it tocat81 /bin/bash
root@903c09561a0a:/usr/local/tomcat# ping tocat82
PING tocat82 (172.19.0.3) 56(84) bytes of data.
64 bytes from tocat82.my_network (172.19.0.3): icmp_seq=1 ttl=64 time=0.269 ms
64 bytes from tocat82.my_network (172.19.0.3): icmp_seq=2 ttl=64 time=0.102 ms
64 bytes from tocat82.my_network (172.19.0.3): icmp_seq=3 ttl=64 time=0.094 ms
64 bytes from tocat82.my_network (172.19.0.3): icmp_seq=4 ttl=64 time=0.082 ms
root@DESKTOP-R4LSK2C:~# docker exec -it tocat82 /bin/bash
root@20766ca10786:/usr/local/tomcat# ping tocat81
PING tocat81 (172.19.0.2) 56(84) bytes of data.
64 bytes from tocat81.my_network (172.19.0.2): icmp_seq=1 ttl=64 time=0.200 ms
64 bytes from tocat81.my_network (172.19.0.2): icmp_seq=2 ttl=64 time=0.052 ms
64 bytes from tocat81.my_network (172.19.0.2): icmp_seq=3 ttl=64 time=0.117 ms

从以上分析我们可以得出以下结论。

  • 自定义网络本身就维护好了主机名和IP的对应关系(IP和域名都能通)

docker网络的内容就分享到这里啦,根据自己的学习我会进一步完善这篇文章,希望能帮到大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/687344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【单元测试】Junit 4(二)--eclipse配置Junit+Junit基础注解

目录 1.0 前言 1.1 配置Junit 4 1.1.1 安装包 1.1.2 创建Junit项目 1.2 Junit 4 注解 1.2.1 测试用例相关的注解 1.2.1.1 Before 1.2.1.2 After 1.2.1.3 BeforeClass 1.2.1.4 AfterClass 1.2.1.5 Test 1.2.1.6 Ignore 1.2.1.7 示例 1.2.2 打包测试Suite相关的注解…

JAVA工程打包

目录 一、工程代码和第三方依赖包分开 二、工程代码和第三方依赖包打入同一个jar包 1、工程的class文件和依赖的第三方jar包所包含的class文件打进同一个jar包中。部署时&#xff0c;直接部署该jar包即可。 2、如果是springboot工程&#xff0c;可以将工程的class文件和依赖…

iOS多语言解决方案全面指南

本文以及相关工具和代码旨在为已上线的iOS项目提供一种快速支持多语言的解决方案。由于文案显示是通过hook实现的&#xff0c;因此对App的性能有一定影响&#xff1b;除了特殊场景的文案显示需要手动支持外&#xff0c;其他任务均已实现自动化。 本文中的部分脚本代码基于 Chat…

OpenShift 4 - 可观测性之用 Network Observability Operator 对网络流量进行监控观测(视频)

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在支持 OpenShift 4.12 Loki Operator 5.7.2 Network observability 1.2.0 的环境中验证 文章目录 Network Observability 相关组件和架构安装 Network Observaility 功能安装 Operator配置对象存储配置 …

Scrapy的基本使用

目录 Scrapy是什么 安装 使用 获取更多页面信息 写入数据库 图片下载 文件下载 更改文件名称以及路径 更改图片名称以及路径 循环获取页面信息时&#xff0c;item的数据重复或者对不上 下载文件时获取文件流直接上传到某个地方 Scrapy是什么 Scrapy 是一个基于 Pyth…

园区自然人代开果真那么好?可以解决成本票缺失吗?

园区自然人代开果真那么好&#xff1f;可以解决成本票缺失吗&#xff1f; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 自然人代开也就是指个人跟公司发生业务往来的时候&#xff0c;公司要求个人开具发票&#xff0c;进行入账&am…

open-mmlab/mmocr 环境搭建、推理和训练入门教程【一】

文章目录 博文基础信息Linux 搭建 open-mmlab/mmocr 运行环境准备数据集准备必要的预训练模型推理训练测试可视化输出 &#x1f4d9; 预祝各位 前途似锦、可摘星辰 博文基础信息 https://mmocr.readthedocs.io/zh_CN/dev-1.x/get_started/quick_run.html显卡&#xff0c;11G 1…

【Pytorch】梯度裁剪——torch.nn.utils.clip_grad_norm_的原理及计算过程

文章目录 一、torch.nn.utils.clip_grad_norm_二、计算过程三、确定max_norm 众所周知&#xff0c;梯度裁剪是为了防止梯度爆炸。在训练FCOS算法时&#xff0c;因为训练过程出现了损失为NaN的情况&#xff0c;在github issue有很多都是这种训练过程出现loss为NaN&#xff0c;作…

RISCV Reader笔记_3 RISCV汇编

RISC-V 汇编语言 函数调用的步骤在计算机组成与设计中也有过涉及&#xff1a; 指定寄存器存入参数&#xff1b;跳转到函数开始位置&#xff08;jal&#xff09;&#xff1b;在callee中按需保存寄存器&#xff1b;执行函数&#xff1b;恢复保存的寄存器&#xff1b;把返回值存入…

使用传统图像处理算法+机器学习进行shadow detection

前言 阴影是图像中常见的现象&#xff0c;它们对于场景理解和分析非常重要。由于阴影区域通常比较暗淡&#xff0c;而且与周围物体区别较大&#xff0c;因此在图像处理和计算机视觉领域中&#xff0c;阴影检测是一个重要的研究方向。传统的阴影检测算法通常基于阈值或边缘检测…

深入理解 kernel panic 的流程

我们在项目开发过程中&#xff0c;很多时候会出现由于某种原因经常会导致手机系统死机重启的情况&#xff08;重启分Android重启跟kernel重启&#xff0c;而我们这里只讨论kernel重启也就是 kernel panic 的情况&#xff09;&#xff0c;死机重启基本算是影响最严重的系统问题了…

180_Power BI 新卡片图计算组与同环比应用

180_Power BI 新卡片图计算组与同环比应用 一、背景 在 2023 年 6 月&#xff0c;Power BI 更新了新的视觉对象&#xff1a;Card(new) 。 当前还需要在预览功能中将其打开。 我们在实际的应用中将新卡片图做了一些应用&#xff0c;先来看看具体效果。 Power BI 公共 web 效果…

安全区域内活动UWB标签,高精度UWB定位监测,室内厘米级测距应用

随着人们对于室内安全和定位需求的增加&#xff0c;相应的技术应运而生&#xff0c;超宽带&#xff08;UWB&#xff09;标签定位技术应用于室内定位领域&#xff0c;并获得了快速的发展和应用。 UWB技术是一种基于极窄脉冲的无线技术&#xff0c;它的主要特点是无载波&#xf…

软件测试技能,JMeter压力测试教程,setUp线程组批量登录(九)

前言 前面一篇已经实现了在 setUp 线程组实现单个用户先登录后提取token给其它线程组使用&#xff0c;在压测的时候&#xff0c;单个用户登录很显然不能满足我们的压测需求 我们在压测接口的时候&#xff0c;需批量获取多个用户登录后返回的token值&#xff0c;那么在setUp 线…

RabbitMQ消息队列高级特性

文章目录 1.消息的可靠投递2.ConSumer ACK消费者确认接收消息3.消费者限流4.TTL过期时间5.死信队列6.延迟队列7.日志与监控8.消息追踪 1.消息的可靠投递 在线上生产环境中&#xff0c;RabbitMQ可能会产生消息丢失或者是投递失败的一个场景&#xff0c;RabbitMQ为了避免这种场景…

Redis慢查询分析

慢查询分析 谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间&#xff0c;当超过预设阀值&#xff0c;就将这条命令的相关信息&#xff08;例如&#xff1a;发生时间&#xff0c;耗时&#xff0c;命令的详细信息&#xff09;记录下来。 执行一条命令分为如下4个部分…

【每日算法 数据结构(C++)】—— 05 | 判断单链表是否有环(解题思路、流程图、代码片段)

文章目录 01 | &#x1f451; 题目描述02 | &#x1f50b; 解题思路03 | &#x1f9e2; 代码片段 The future belongs to those who believe in the beauty of their dreams. 未来属于那些相信梦想之美的人 01 | &#x1f451; 题目描述 给你一个单链表&#xff0c;请判断其中是…

Mac(M1)上安装Ubuntu虚拟机

Mac&#xff08;M1&#xff09;上安装Ubuntu虚拟机 0.下载资料汇总 VMware Fusionhttps://www.vmware.com/products/fusion/fusion-evaluation.htmlubuntu-desktop-arm64.isohttps://cdimage.ubuntu.com/jammy/daily-live/current/ 1.安装VMware Mac版本的VMware叫 VMware …

黑马程序员前端 Vue3 小兔鲜电商项目——(十一)支付页

文章目录 基础数据渲染封装接口数据渲染 支付功能实现支付携带参数支付宝沙箱账号信息 支付结果页展示模版代码绑定路由渲染数据 倒计时逻辑函数封装 支付页有俩个关键数据&#xff0c;一个是要支付的钱数&#xff0c;一个是倒计时数据&#xff08;超时不支付商品释放)。 基础…

Tomcat项目更新Tomcat版本,重新配置conf,并在Idea运行项目,服务器替换SSL证书

Tomcat项目更新Tomcat版本&#xff0c;重新配置conf&#xff0c;并在Idea运行项目 1.下载Tomcat包2.Tomcat配置-ssi配置3.Idea运行 Tomcat 项目4.服务器Tomcat替换SSL证书4. Tomcat 项目重启 1.下载Tomcat包 Tomcat 官网 - https://tomcat.apache.org/ jdk1.8.0_191 我选择的…