Networking
这里的联网包括两个方面,容器和容器之间的通信以及容器和主机之间的通信。
容器默认是启用联网的,即他可以创建传出连接,但是它默认是不暴露任何端口的,这意味着是没有办法传入连接的。
docker network
docker network
命令用于管理网络:
子命令 | 描述 |
---|---|
docker network create |
创建网络 |
docker network connect |
将容器连接到指定网络 |
docker network disconnect |
断开容器与指定网络的连接 |
docker network inspect |
显示网络的详细信息 |
docker network ls |
列出网络 |
docker network prune |
删除所有未使用的网络 |
docker network rm |
删除网络 |
查看所有网络
我看可以执行 docker network ls
来显示所有网络:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
11d3df0db53d bridge bridge local
3217c6b33f13 host host local
bf17ced026a1 none null local
上面的三个是 Docker 默认会存在的网络,并且创建一个容器默认会使用 bridge 驱动,因此本机创建的所有容器默认就是在一个局域网中的。容器之间可以能够通过容器的 Container-IP 直接通信。
Tips
在连接到网络是 --network host
就会自动加入 Docker 默认的 host 驱动网络
创建网络: docker network create
Docker 中可以自定义网络,他可以让多个容器连接到这个新建的网路中来实现彼此之间的通信(相当于创建了一个局域网环境)。
# -d 指定网络驱动
# network create -d [driver] [network_name]
docker network create -d bridge my-net
# --network 来指定容器要使用的网络
docker run --network=my-net -itd --name=container3 busybox
Docker 提供了网络驱动程序:
bridge
: 默认网络驱动程序,即所谓的桥接网络。他会在主机上创建一个名为 docker0 的虚拟网桥,主机上启动的 Docker 容器都默认连接到该虚拟网桥上,docker0 的 IP 地址为容器的默认网管。可以理解为通过路由器创建一个局域网来连接多个容器,为多个容器灵活配网,与主机隔离安全的同时也缺乏灵活性host
: 解除容器与 Docker 主机之间的网络隔离,直接使用主机的网络,直接接入主机的网络,主要缺点就是占用主机网络以及安全性比较差none
: 将容器与主机和其他容器完全隔离
Tips
通过 bridge 连接到同一个网络中的不同容器,可以直接使用容器名来进行通信,例如 Container1:Port
来与 Container1 的 Port 接口进行通信。
Tips
可以使用 ip add
看到一个 docker0 的虚拟网卡,他有自己的 ip 地址,通常是 127.17.0.1/16
Tips
实际上还有一种 Container 模式,他不需要创建 Network 使用 --net=container:NAME_or_ID
来让两个容器通信,不过局限性很大不常用。更多的是创建一个新的网桥来让多个容器通信。
连接到一个网络: --network | docker network connect
通过 --network <net_name>
来在创建(create run 都可以)容器的时候为容器指定网络。
如果容器已经存在则需要 docker network connect NETWORK CONTAINER
来为容器指定网络。
发布端口: -P/--publish-all | -p/--publish
默认情况下,当容器运行时是不会向主机公开任何端口的。这意味着无法监听容器中的任何端口。要想使容器的端口可以被主机访问,必须发布该端口:
-P/--publish-all
: 将所有公开的端口发布到主机,Docker 将每个公开的端口绑定到主机上的随机端口-p/--publish
: 允许将容器中的单个端口或端口范围显式映射到主机对应的端口
有几种设置方式:
设置示例 | 描述 |
---|---|
-p 8080:80 |
将容器中的 80 端口映射到主机上的 8080 端口 |
-p 8080:80/udp |
将容器中的 80 端口的 UDP 流量映射到主机上的 8080 端口 |
-p 127.0.0.1:8080:80 |
只允许本机 ip 来访问发布的 8080 端口 |
Tips
如果要使容器供其他容器访问,并不需要发布端口。可以通过将容器连接到同一个网络(通常是桥接网络)来彼此通信
网络特定设置
默认情况下,容器会自动从附加到的 Docker 网络中获取 IP 地址、主机名等,我们可以通过各种参数来修改它:
--ip/--ip6
: 为容器指定特定于网络的 IP 地址(注意要复合附加到的 Docker 网络)--hostname
: 指定主机名--dns
: 指定 DNS 服务器,默认容器与主机相同