Docker——创建网络

443 阅读4分钟

要创建一个完整的 Web 应用程序,可能需要运行多个容器。例如,提供数据库服务的容器,提供Web服务的容器,等等。

默认情况下,容器的运行是彼此隔离的,一个容器不知道在同一个机器上的其他进程或容器。容器组网 (container networking) 能够把多个容器连接在一起并进行通信。

创建网络

docker network create topeid-network

可以通过 docker network ls 查看已经创建的网络。

4d8b056ae7ac   bridge                 bridge    local
871601d4ec64   host                   host      local
385a5fb00f2f   none                   null      local
54aeb37c4f31   topeid-network         bridge    local

可以通过 docker network inspect topeid-network 命令,查看创建的网络的详细信息。

[
    {
        "Name": "topeid-network",
        "Id": "54aeb37c4f31dc08da373c8237df3b7e4bf3194f3cb296dc050319459c53adb6",
        "Created": "2022-10-13T10:53:52.6993315Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
        },
        "Options": {},
        "Labels": {}
    }
]

连接网络

在第一次运行一个容器的时候,可以将容器添加到网络中。

docker run -d --network topeid-network --name topeid-mysql8 mysql:8.0.33

再次运行查看网络的命令 docker network inspect topeid-network,会发现 Containers 属性中,已经包含了刚刚运行的容器。

[
    {
        "Name": "topeid-network",
        "Id": "54aeb37c4f31dc08da373c8237df3b7e4bf3194f3cb296dc050319459c53adb6",
        "Created": "2022-10-13T10:53:52.6993315Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "a309ae447cd913df44aa514ab49f7beb76f9c6b9343f535e552b99512fdea6b2": {
                "Name": "topeid-mysql8",
                "EndpointID": "5f66eca82094423e7cfb1bbb65a798734f60a77b2aa7ba8c95f213aa1b29b4bb",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

我们也可以把正在运行的容器添加到一个网络中。例如,我们先运行一个 Tomcat8 的容器。

docker run -d --name tomcat8 -p 8080:8080 tomcat:8-jdk8

查看容器所在的网络,从 "NetworkID":"4d8b056ae7acb03ce55fdf7ae333d07602085082f30f079c2760d767b5a44106" 的值可以看出,容器默认是连接到 bridge 网络上的。

docker inspect --format='{{json .NetworkSettings.Networks}}'  tomcat8
{
    "bridge":
    {
        "IPAMConfig":null,
        "Links":null,
        "Aliases":null,
        "NetworkID":"4d8b056ae7acb03ce55fdf7ae333d07602085082f30f079c2760d767b5a44106",
        "EndpointID":"a9d392d165504a27d9fa3fc718da54581e47934dbf8b44e5f85ad8267d51e94d",
        "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
    }
}

接着,我们把 tomcat8 容器连接到 topeid-network 上。

docker network connect topeid-network tomcat8

再次查看容器所在的网络。

docker inspect --format='{{json .NetworkSettings.Networks}}'  tomcat8

可以看出,"NetworkID":"54aeb37c4f31dc08da373c8237df3b7e4bf3194f3cb296dc050319459c53adb6" 表明 tomcat8 容器连接到了 topeid-network 网络上。同时,也能够知道,一个容器可以连接到多个网络。

{
    "bridge":{
        "IPAMConfig":null,
        "Links":null,
        "Aliases":null,
        "NetworkID":"4d8b056ae7acb03ce55fdf7ae333d07602085082f30f079c2760d767b5a44106",
        "EndpointID":"a9d392d165504a27d9fa3fc718da54581e47934dbf8b44e5f85ad8267d51e94d",
        "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
    },
    "topeid-network":{
        "IPAMConfig":{},
        "Links":null,
        "Aliases":["0ba391a40d6b"],
        "NetworkID":"54aeb37c4f31dc08da373c8237df3b7e4bf3194f3cb296dc050319459c53adb6",
        "EndpointID":"9962b507ebc89079da6e51a14dd71d287a461b1748ffbd94c38da00bc2962034",
        "Gateway":"172.18.0.1",
        "IPAddress":"172.18.0.5",
        "IPPrefixLen":16,
        "IPv6Gateway":"","GlobalIPv6Address":"",
        "GlobalIPv6PrefixLen":0,
        "MacAddress":"02:42:ac:12:00:05",
        "DriverOpts":{}
    }
}

参考文献