前言

Docker 会的人很多,但真正搞懂「Docker 网络」的人不多。
容器能不能互通?为什么端口映射了还是访问不到?跨主机网络怎么打通?

1. Docker 网络的核心认知(记住这 3 句话就够)

  • 容器网络是隔离的(用 namespace 实现)

  • 容器的网线是虚拟 veth 对接宿主机

  • 真正干活的是 docker 的网络驱动(bridge/host/overlay/macvlan)

理解这三句话,Docker 网络就通了一半。


2. 四大网络模式(一个比一个关键)

① bridge(默认)— 90% 的项目都在用

  • 容器独立 IP

  • NAT 转发访问外部

  • 容器同网络内可互通

docker network create mynetdocker run -d --network mynet nginx

适用:所有单机部署。


② host — 性能最强,隔离最弱

  • 直接使用宿主机网络堆栈

  • 没有端口映射(因为本来就同一个网卡)

docker run --net host -d service

适用:高性能、需要宿主硬件、测速类服务。


③ none — 纯隔离,不给你网络

适合:安全测试、自定义网络。


④ overlay — 跨主机通信的灵魂

  • Docker Swarm 的核心

  • 多主机容器像在同一个局域网

docker network create -d overlay app-net

适合:分布式服务、微服务集群。


3. 进阶驱动(你迟早会用)

macvlan

  • 让容器拥有独立 MAC + 和宿主机一个网段

  • 企业内网、硬件授权场景非常常用
    (例如:某些授权系统必须绑定 MAC)

ipvlan

  • 类似 macvlan,但更轻量
    适合大量容器的部署场景。


4. Docker 网络必会命令(10 秒记住)​​​​​​​

docker network ls# 查看网络docker network inspect bridge      # 查看详情docker network create mynet        # 创建网络docker network connect mynet web   # 把容器加入网络docker network disconnect mynet webdocker network rm mynet            # 删除网络

最常用的排查命令:​​​​​​​

docker exec -it web ping dbdocker exec -it web curl http://db:8080

5. Docker Compose 网络(你一定会用到)​​​​​​​

services:  web:    image: nginx    networks:      - front  api:    image: api    networks:      - front      - back  db:    image: mysql    networks:      - backnetworks:  front:  back:

前后端隔离、分层清晰。


6. 常见踩坑(90% 都是这些)

❌ 1. 容器互 ping 不通?

不是一个网络。

❌ 2. 映射端口不生效?

使用了 --net host

❌ 3. overlay 不通?

节点之间端口没放通。

❌ 4. DNS 解析慢?

宿主机 DNS 被劫持,建议指定 --dns


7. 最佳实践

  • 永远使用自定义网络,不要依赖默认 bridge

  • 跨主机尽量用 overlay / flannel / calico

  • 性能敏感服务用 host 网络

  • 企业内网、需要真实 IP → 用 macvlan

  • 容器名就是 DNS,无需写死 IP

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐