命令
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": {}
网友评论