美文网首页
Docker 网络

Docker 网络

作者: _于曼丽_ | 来源:发表于2020-01-26 21:15 被阅读0次

命令

docker run --network
docker run -p
docker run -P
docker port
docker network ls
docker network inspect
docker network connect
docker network disconnect
docker network create
docker network rm
docker network prune

命令很简单,使用 --help 就能看明白。

docker run --network

使用 docker run --network 命令创建一个容器,并将容器加入到 --network 参数指定的网络当中。如果不加 --network 参数,则默认加入到 bridge 网络。

$ docker run -d --network none --name web_none nginx
$ docker run -d --network host --name web_host nginx
$ docker run -d --network bridge --name web_bridge nginx
$ docker run -d --name web_default nginx

docker network inspect

使用 docker network inspect 命令查看某个网络的信息,其中 Containers 字段列出了处于该网络中的运行中的容器。以下代码显示有两个运行中的容器处于 bridge 网络中。

$ docker network inspect bridge
"Containers": {
    "274d437be25886694fcbe9bcfab8896980cb80187994046dc86821755d784474": {
        "Name": "web_default",
        "EndpointID": "34c726695d2ff6fe39238928339902b93ef40ed47a61786a0fe1cb19f0895af4",
        "MacAddress": "02:42:ac:11:00:03",
        "IPv4Address": "172.17.0.3/16",
        "IPv6Address": ""
    },
    "72d381f94b5961d602d83ac10bd6fa4358f9f52cfe3ba5973770fd3610d04a04": {
        "Name": "web_bridge",
        "EndpointID": "48e915dd349cfdc6be5e7a71f1b63eb11c30ded61c907923c83d4e04ca2d9e8e",
        "MacAddress": "02:42:ac:11:00:02",
        "IPv4Address": "172.17.0.2/16",
        "IPv6Address": ""
    }
}

使用 docker stop webpack_default 命令停止 webpack_default 容器的运行,则该容器不会出现在 bridge 网络的 Containers 字段里。

$ docker stop web_default
$ docker network inspect bridge
"Containers": {
    "72d381f94b5961d602d83ac10bd6fa4358f9f52cfe3ba5973770fd3610d04a04": {
        "Name": "web_bridge",
        "EndpointID": "48e915dd349cfdc6be5e7a71f1b63eb11c30ded61c907923c83d4e04ca2d9e8e",
        "MacAddress": "02:42:ac:11:00:02",
        "IPv4Address": "172.17.0.2/16",
        "IPv6Address": ""
    }
}

但是 web_default 容器并没有从 bridge 网络里移除,使用 docker inspect web_default 命令可以查看 web_default 容器加入的网络。

$ docker inspect web_default
"Networks": {
    "bridge": {
        ...
    }
}

使用 docker start web_default 命令重新启动 web_default 容器,则该容器又会出现在 bridge 网络的 Containers 字段里了。

$ docker start web_default
$ docker network inspect bridge
"Containers": {
    "274d437be25886694fcbe9bcfab8896980cb80187994046dc86821755d784474": {
        "Name": "web_default",
        "EndpointID": "34c726695d2ff6fe39238928339902b93ef40ed47a61786a0fe1cb19f0895af4",
        "MacAddress": "02:42:ac:11:00:03",
        "IPv4Address": "172.17.0.3/16",
        "IPv6Address": ""
    },
    "72d381f94b5961d602d83ac10bd6fa4358f9f52cfe3ba5973770fd3610d04a04": {
        "Name": "web_bridge",
        "EndpointID": "48e915dd349cfdc6be5e7a71f1b63eb11c30ded61c907923c83d4e04ca2d9e8e",
        "MacAddress": "02:42:ac:11:00:02",
        "IPv4Address": "172.17.0.2/16",
        "IPv6Address": ""
    }
}

docker run -p

使用 docker run -p host_port:container_port 命令创建一个容器,并指定主机的端口映射到容器的端口。该命令使外界可以访问处于 bridge 网络中的容器。以下代码将主机的 8080 端口映射到容器的 80 端口。

$ docker run -d -p 8080:80 --name web_server1 nginx

可以省略 host_port,这时候会随机指定一个 host_port。以下代码将主机的一个随机端口映射到容器的 80 端口。

$ docker run -d -p 80 --name web_server2 nginx

docker run -P

使用 docker run -P 命令创建一个容器,将容器暴露的所有端口随机映射到主机的端口上。

$ docker run -d -P --name web_server3 nginx

docker port

使用 docker port 命令查看容器与主机之间的端口映射关系。

$ docker port web_server1
80/tcp -> 0.0.0.0:8080

网络类型

Docker 提供了几种网络的类型,它们决定了容器之间,还有外界跟容器之间怎么样相互通信。

none

加入这种网络类型的容器没有 ip 地址,无法与外界通信,容器之间也无法通信。

host

加入这种网络类型的容器跟主机使用同样的 ip 地址,容器对外界是完全开放,只要能访问到主机就能访问到容器。host 模式仅适支持 Linux 主机,不支持 Docker for Mac。

bridge (默认类型)

加入这种网络的容器使用局域网 ip 地址,容器相互之间可以使用 ip 地址进行通信,外界无法直接访问容器,可以通过主机和容器之间的端口映射,来让外界访问容器。

自定义网络

我们可以基于某个类型的网络去创建一些自定义的网络,这样属于这个网络的容器会被单独隔离出来,它们之间可以相互通信,其它的不在这些自定义网络上的容器不能直接访问到它们。

一个容器可以属于多个网络。在用户自定义网络上的容器,它们之间可以使用各自的容器的名字访问到对方,因为会用到 Docker 内嵌的 DNS 功能。

docker network create

使用 docker network create -d 命令创建一个自定义网络,-d 参数指定了基于哪种类型的网络去创建自定义网络,默认值为 bridge。以下代码创建了一个名为 web 的基于 bridge 网络类型的网络。

$ docker network create web

使用 docker network inspect 查看 web 网络的信息,它的子网是 172.19.0.0,目前还没有容器使用这个自定义的网络。

$ docker network inspect web
...
"IPAM": {
    "Driver": "default",
    "Options": {},
    "Config": [
        {
            "Subnet": "172.19.0.0/16",
            "Gateway": "172.19.0.1"
        }
    ]
}
...
"Containers": {}

docker network connect

使用 docker network connect 命令将容器加入到指定的网络。

$ docker run -d --name container_1 nginx
$ docker network connect web container_1
$ docker network inspect web
"Containers": {
    "449188a93b5600e60c2ed5c8dc316cc54d59929dfd9532e57b757a9240c2768f": {
        "Name": "container_1",
        "EndpointID": "ccbae4c235a652d132fdd96b038ab56c56fe289588f8cf96b1e772930a4e6eb4",
        "MacAddress": "02:42:ac:13:00:02",
        "IPv4Address": "172.19.0.2/16",
        "IPv6Address": ""
    }
}

使用 docker run --network 命令将容器加入到指定的网络。

$ docker run -d --network web --name container_2 nginx
$ docker network inspect web
"Containers": {
    "449188a93b5600e60c2ed5c8dc316cc54d59929dfd9532e57b757a9240c2768f": {
        "Name": "container_1",
        "EndpointID": "ccbae4c235a652d132fdd96b038ab56c56fe289588f8cf96b1e772930a4e6eb4",
        "MacAddress": "02:42:ac:13:00:02",
        "IPv4Address": "172.19.0.2/16",
        "IPv6Address": ""
    },
    "840da6c1822b7ee651fa9fa61867d4e451b1b19704ba2138a5c1ae9d0e65c422": {
        "Name": "container_2",
        "EndpointID": "19d45abfb00b48531a6335e2a0c44c58d664f4b049292002c2d3ec2bd311c7af",
        "MacAddress": "02:42:ac:13:00:03",
        "IPv4Address": "172.19.0.3/16",
        "IPv6Address": ""
    }
}

container_1 容器同时属于 web 网络和 bridge 网络,container_2 容器只属于 web 网络。

$ docker network inspect bridge
"Containers": {
    "449188a93b5600e60c2ed5c8dc316cc54d59929dfd9532e57b757a9240c2768f": {
        "Name": "container_1",
        "EndpointID": "ccbae4c235a652d132fdd96b038ab56c56fe289588f8cf96b1e772930a4e6eb4",
        "MacAddress": "02:42:ac:13:00:02",
        "IPv4Address": "172.19.0.2/16",
        "IPv6Address": ""
    }
}

docker network disconnect

使用 docker network disconnect 将容器移除指定网络。以下代码将 container_2 容器移除 web 网络。

$ docker network disconnect web container_2

现在 web 网络中的容器只有 container_1 了。

$ docker network inspect web
"Containers": {
    "449188a93b5600e60c2ed5c8dc316cc54d59929dfd9532e57b757a9240c2768f": {
        "Name": "container_1",
        "EndpointID": "ccbae4c235a652d132fdd96b038ab56c56fe289588f8cf96b1e772930a4e6eb4",
        "MacAddress": "02:42:ac:13:00:02",
        "IPv4Address": "172.19.0.2/16",
        "IPv6Address": ""
    }
}

container_1 容器属于 bridge 网络和 web 网络。

$ docker inspect container_1
"Networks": {
    "bridge": {
        ...
    },
    "web": {
        ...
    }
}

container_2 容器不属于任何网络。

$ docker inspect container_2
"Networks": {}

相关文章

网友评论

      本文标题:Docker 网络

      本文链接:https://www.haomeiwen.com/subject/hgqsthtx.html