Docker Network 基础

一、是什么

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 Network 基础_第1张图片
从以上的分析我们可以得出以下结论

  • 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

我们可以抽象为这样一个网络模型。
Docker Network 基础_第2张图片
从以上的分析我们可以得出以下结论

  • 容器将不会获得一个独立的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

我们可以抽象为这样一个网络模型。
Docker Network 基础_第3张图片

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

  • 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网络的内容就分享到这里啦,根据自己的学习我会进一步完善这篇文章,希望能帮到大家。

你可能感兴趣的:(docker,运维,java)