为什么需要 Docker 网络
容器之间默认互相隔离。容器与宿主机之间也有网络隔离。要对外提供服务,必须理解 Docker 的网络模型。 Docker 在宿主机上虚拟出多种网络。容器启动时接入其中一种。不同网络模式决定了容器的连通性、隔离级别和端口规则。四种网络模式对比
Docker 内置四种常用网络模式。用--network 参数指定。
host 模式下容器没有自己的 IP。容器监听的端口直接占用宿主机端口。
-p 端口映射在 host 模式下无效。默认 bridge 与用户自定义 bridge
Docker 安装后自带一个名为bridge 的默认网络。你也可以用 docker network create 创建自定义 bridge 网络。
两者有一个关键区别:内置 DNS。
- 默认
bridge网络没有容器名解析。容器之间只能用 IP 通信。 - 用户自定义 bridge 网络内置 DNS 服务器。容器可以用容器名或网络别名互相解析。
端口映射原理
bridge 模式下容器的 IP 只在宿主机内部可达。外部访问需要端口映射。-p 参数的格式是 宿主机端口:容器端口。Docker 通过 iptables 规则把流量转发进容器。
容器互联实战
下面演示两个容器在自定义网络中通过容器名互相 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 stop 或 docker rm 处理。
延伸阅读
- Docker 容器:容器的生命周期管理
- Docker 存储:数据持久化的三种方式
- Docker Compose:用 YAML 编排多容器网络
- Kubernetes 网络:跨主机网络与服务发现