Skip to main content

为什么需要 Docker 网络

容器之间默认互相隔离。容器与宿主机之间也有网络隔离。要对外提供服务,必须理解 Docker 的网络模型。 Docker 在宿主机上虚拟出多种网络。容器启动时接入其中一种。不同网络模式决定了容器的连通性、隔离级别和端口规则。

四种网络模式对比

Docker 内置四种常用网络模式。用 --network 参数指定。
host 模式下容器没有自己的 IP。容器监听的端口直接占用宿主机端口。-p 端口映射在 host 模式下无效。

默认 bridge 与用户自定义 bridge

Docker 安装后自带一个名为 bridge 的默认网络。你也可以用 docker network create 创建自定义 bridge 网络。 两者有一个关键区别:内置 DNS
  • 默认 bridge 网络没有容器名解析。容器之间只能用 IP 通信。
  • 用户自定义 bridge 网络内置 DNS 服务器。容器可以用容器名或网络别名互相解析。
生产环境永远使用自定义 bridge 网络。容器重启后 IP 会变,容器名解析不受影响。

端口映射原理

bridge 模式下容器的 IP 只在宿主机内部可达。外部访问需要端口映射。 -p 参数的格式是 宿主机端口:容器端口。Docker 通过 iptables 规则把流量转发进容器。
-p 8080:80 默认绑定 0.0.0.0,对所有网卡开放。内网服务建议绑定 127.0.0.1 或内网地址。

容器互联实战

下面演示两个容器在自定义网络中通过容器名互相 ping 通。
1

创建自定义网络

2

启动两个容器接入该网络

3

用容器名互相访问

4

验证 DNS 解析

一个容器可以同时接入多个网络。运行中的容器可以用 docker network connect 动态加网。

docker network 命令速查

跨主机网络

单机的 bridge 网络只在一台宿主机内有效。跨主机通信需要 overlay 网络。overlay 网络是 Docker Swarm 的基础,生产环境更常见的方案是 Kubernetes 的网络模型。

常见端口冲突处理

启动时报错 port is already allocated,说明宿主机端口被占用。
冲突也可能来自旧容器。先 docker ps -a 找到占端口的旧容器,再 docker stopdocker rm 处理。

延伸阅读