Docker 网络模式深度解析

Docker 网络看着简单,实际上有几种模式,用错了会踩坑。这篇讲清楚。

网络模式

| 模式 | 用途 |

|------|------|

| bridge(默认) | 单机容器互联 |

| host | 跳过 Docker 网络层 |

| overlay | 多机 Docker Swarm |

| none | 无网络 |

bridge(最常用)

默认网络,容器分配独立 IP:

docker network ls

NETWORK ID NAME DRIVER

abc123 bridge bridge

def456 host host

ghi789 none none

容器间通过 IP 通信:

docker run -d --name web nginx

docker run -d --name api nginx

web 访问 api: curl http://api:80

自定义 bridge

比默认的好在哪:

- DNS 自动解析(容器名=域名)

- 网络隔离(不同 bridge 不通)

docker network create mynet

docker run -d --network mynet --name web nginx

docker run -d --network mynet --name api nginx

web 访问 api 不用 IP,直接 curl api

host 模式

容器直接用宿主机网络:

docker run --network host nginx

优点:性能最好(少一层 NAT)。

缺点:端口直接占宿主机,容易冲突。

适合:性能敏感、不需要隔离的服务。

port mapping(最常用方式)

docker run -p 8080:80 nginx

宿主机 8080 → 容器 80

格式:宿主机端口:容器端口

多端口

docker run -p 8080:80 -p 8443:443 nginx

指定 IP

docker run -p 127.0.0.1:8080:80 nginx

只有本机能访问

跨主机通信

默认情况下,不同宿主机的容器不通。

方案一:Overlay 网络(Swarm)

Docker Swarm 模式:

docker swarm init

docker network create -d overlay myoverlay

方案二:Macvlan

给容器分配宿主机同网段 IP:

docker network create -d macvlan \

--subnet=192.168.1.0/24 \

--gateway=192.168.1.1 \

-o parent=eth0 macnet

docker run --network macnet --ip 192.168.1.100 nginx

容器直接有独立 IP,像真机一样。

我的用法

内部通信(bridge)

services:

halo:

networks:

- app

mysql:

networks:

- app

networks:

app:

driver: bridge

对外服务(port mapping)

services:

openresty:

ports:

- "80:80"

- "443:443"

敏感服务(不暴露)

services:

mysql:

# 不写 ports,只在内部网络

networks:

- app

踩坑记录

坑 1:容器间不通

不同 network 的容器不通。加上 --network 或放到同一个 network。

坑 2:端口冲突

两个容器抢同一个端口。改映射:

docker run -p 8081:80  # 换一个

坑 3:DNS 不解析

默认 bridge 没有内置 DNS。用自定义 bridge:

docker network create mynet

容器名自动解析

总结

- bridge:默认,单机互联

- host:高性能,无隔离

- overlay:多机 Swarm

- macvlan:容器有独立 IP

- port mapping:对外暴露服务

记住原则:对内用 bridge,对外用 port mapping。