Skip to content

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 来显示所有网络:

Bash
$ 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 中可以自定义网络,他可以让多个容器连接到这个新建的网路中来实现彼此之间的通信(相当于创建了一个局域网环境)。

Bash
# -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 服务器,默认容器与主机相同

参考