Docker 网络模式

容器默认相互隔离,要互通或对外提供服务,必须借助网络。Docker 提供 bridge、host、container、none 四种网络模式,理解它们才能设计出正确的访问关系。

四种模式总览

四种网络模式示意 docker run 用 --network 指定模式,不写时默认是 bridge:

模式网络情况适用场景
bridge(默认)容器接入虚拟网桥,各有独立 IP,可互访单机多容器互访、-p 端口映射对外
host容器直接使用宿主机网络栈,没有独立 IP追求网络性能、不想做端口映射
container与指定容器共享同一网络栈抓包排查、伴生(sidecar)容器
none关闭网络,仅保留回环接口离线计算、高安全隔离

默认网络

安装 Docker 后自带三个默认网络,用 docker network ls 查看:

docker network ls
# 输出:NETWORK ID     NAME      DRIVER    SCOPE
#       ...            bridge    bridge    local
#       ...            host      host      local
#       ...            none      null      local

默认 bridge:容器互访

默认 bridge 互访与端口映射 不加 --network 的容器都挂在默认 bridge 上,彼此可用 IP 互通;容器 IP 用 docker inspect 查询:

docker run -d --name web1 nginx:alpine
docker run -d --name web2 nginx:alpine
docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' web1
# 输出:172.17.0.2
docker exec web2 ping -c 1 172.17.0.2    # web2 用 IP 访问 web1
# 输出:64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.2 ms

注意:默认 bridge 不支持用容器名做 DNS 解析。想用 web1 这样的名字互访,需要自定义网络(下一章),它能自动解析容器名。

host 模式:端口直通

--network host 下容器与宿主机共用网络栈,服务直接监听宿主机端口,-p 会被忽略:

docker run -d --network host --name web nginx:alpine
curl http://localhost:80    # 容器内 nginx 直接占用了宿主机的 80 端口

container 模式:共享网络栈

--network container:<容器名> 让新容器与目标容器共用同一份网络栈(IP 相同),彼此可用 localhost 访问:

docker run -d --name main nginx:alpine
docker run --rm --network container:main alpine:3.20 wget -qO- http://localhost
# 输出:<!DOCTYPE html> ... nginx 欢迎页(经由 main 的网络栈访问)

小结

四种模式一句话记忆:bridge 是默认虚拟网桥、配 -p 对外服务;host 直通宿主机网络性能最好;container 与指定容器共享网络栈;none 完全离线。要更灵活的名字互访与隔离,接着看自定义网络。

笔记加载中…