Docker 网络 Bridge Host Overlay

Docker网络是初学者最困惑的方面之一。为什么有些容器可以互相通信而其他的不行?为什么容器无法连接互联网?为什么映射的端口在主机上可以工作,但从另一个容器却不行?本指南涵盖每个Docker网络驱动程序,并提供实际示例,帮助您为每个场景选择合适的驱动程序。

Docker网络如何工作

Docker有独立于主机的网络堆栈。每个容器可以同时连接到多个网络。Docker通过网络驱动程序来管理这一点,这些驱动程序定义通信行为。

关键原则:同一网络上的容器可以使用容器名称直接通信(自动DNS)。不同网络上的容器必须使用端口映射或连接到共享网络。

Docker网络驱动程序类型

默认

Bridge

单个主机上的虚拟专用网络。同一组中的容器可以通信。最常用。

性能

Host

容器直接共享主机的网络堆栈。无NAT,最高吞吐量,但无隔离。

多主机

Overlay

连接多个主机上的容器。与Docker Swarm或Kubernetes配合使用。

高级

Macvlan

容器获得LAN上的真实IP - 显示为物理机。适合传统网络集成。

Bridge 网络 — 默认模式

当您在未指定网络的情况下运行容器时,Docker 会自动使用默认的 bridge 网络。但默认 bridge 不支持容器之间的 DNS 解析。建议改用用户自定义的 bridge 网络。

# Create a user-defined bridge network (recommended) docker network create my-app-net # Run containers on the same network docker run -d --name db --network my-app-net mysql:8 docker run -d --name app --network my-app-net myapp:latest # "app" can now reach "db" by name immediately # e.g. DB_HOST=db in environment variables

用户自定义 Bridge 的优势

# Create network with custom subnet docker network create \ --driver bridge \ --subnet 172.20.0.0/16 \ --gateway 172.20.0.1 \ production-net # List all networks docker network ls # Inspect network details docker network inspect my-app-net

Host 网络 — 最高性能

容器直接使用主机的网络接口,没有虚拟网络层,从而实现最低延迟和最高吞吐量。非常适合监控代理或网络密集型应用。

# Run container with host networking docker run -d --network host nginx # Nginx listens on port 80 directly on the host # No need for -p 80:80

注意:Host 网络仅在 Linux 上有效。在 Mac/Windows(Docker Desktop)上,由于底层仍有 VM 层,性能与 bridge 相近。

Overlay 网络 — 跨多主机通信

与 Docker Swarm 或 Kubernetes 配合使用,使不同节点上的容器如同在同一网络中通信。数据通过 VXLAN 协议进行封装。

# Initialize Swarm first docker swarm init # Create overlay network docker network create \ --driver overlay \ --attachable \ swarm-net # Deploy service in the overlay network docker service create \ --name webapp \ --network swarm-net \ --replicas 3 \ nginx

None 网络 — 完全隔离

容器没有任何网络接口(仅有 loopback)。适用于不需要网络的批处理任务,或需要最大程度隔离的场景。

# Run container with no network docker run --network none alpine sh

Docker 网络驱动对比

驱动适用场景DNS多主机性能
bridge默认、本地开发、单主机✅(用户自定义)❌良好
host高性能、监控主机 DNS❌最佳
overlaySwarm、多主机✅✅良好(VXLAN 开销)
macvlan传统网络、物理 IP❌❌非常好
none批处理、最大隔离❌❌N/A

Docker Compose 与网络

Docker Compose 会自动创建一个 bridge 网络。同一 Compose 文件中的所有服务默认共享该网络。

# docker-compose.yml services: web: image: nginx ports: - "80:80" networks: - frontend - backend db: image: mysql:8 networks: - backend # db is only on backend — web can reach it, outside cannot networks: frontend: backend: internal: true # internal: true — cuts off internet access for extra security

常用网络命令

# List all networks docker network ls # Inspect network (see connected containers) docker network inspect <network-name> # Connect container to an additional network at runtime docker network connect my-net my-container # Disconnect container from network docker network disconnect my-net my-container # Remove unused networks docker network prune

故障排查:容器无法通信

# Test connectivity between containers docker exec -it app ping db docker exec -it app curl http://db:8080/health

保护 VPS 上的 Docker 网络

正确的网络配置是加固 Docker VPS 安全的重要环节。遵循以下安全最佳实践,最大限度地减少攻击面:

# Restrict MySQL to localhost only docker run -d \ -p 127.0.0.1:3306:3306 \ --name db \ --network backend-net \ -e MYSQL_ROOT_PASSWORD=secret \ mysql:8 # Check which ports are listening on the host ss -tlnp | grep LISTEN # Inspect Docker-generated iptables rules sudo iptables -L DOCKER -n --line-numbers

Macvlan 网络 — 集成传统系统

当容器需要在局域网中拥有真实 IP(使其看起来像独立物理机)时,Macvlan 是最佳选择。常见使用场景包括:

# Identify your host's network interface first ip link show # look for eth0, ens3, or similar docker network create \ --driver macvlan \ --subnet=192.168.1.0/24 \ --gateway=192.168.1.1 \ -o parent=eth0 \ macvlan-net # Run a container with a real LAN IP address docker run -d \ --name legacy-app \ --network macvlan-net \ --ip 192.168.1.100 \ nginx

Macvlan 限制:由于 Linux 内核限制,主机无法直接与同一 Macvlan 网络上的容器通信。需要在主机上创建 Macvlan 子接口才能实现主机与容器之间的流量。

Docker 网络驱动选型参考

使用此快速参考表,为每种场景选择合适的网络驱动:

使用场景 驱动 原因
Web 应用 + 数据库部署在同一台 VPS 用户自定义 Bridge 自动 DNS,良好的隔离性
监控代理 Host 需要直接访问主机网络统计数据
跨多台 VPS 节点的微服务 Overlay 通过 Swarm 实现透明的跨节点通信
需要真实 LAN IP 的传统系统 Macvlan 容器在物理网络中获得真实 IP

使用 Docker Swarm Overlay 网络扩展规模

当单台 VPS 无法承载您的工作负载时,Docker Swarm 可让您将容器分布到多个节点上。Overlay 网络将它们透明地连接在一起,无论运行在哪台物理机上:

# Join a worker node to the Swarm (run on each worker) docker swarm join --token <TOKEN> <MANAGER-IP>:2377 # Check the status of all nodes (run on the manager) docker node ls # Scale a service up to 5 replicas docker service scale webapp=5 # Check service replica status docker service ps webapp

AsiaGB Docker 就绪型 VPS

AsiaGB VPS 开箱即用支持 Docker 和 Docker Compose,提供完整 root 权限,可按需配置网络。起价 500 泰铢/月。

查看 VPS 套餐