7Docker 深度探索

Docker 网络

网络模型详解

bridgehostoverlay

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第7章:Docker网络(Docker Networking)

一、导读

1.1 本章学习目标

容器网络是 Docker 的核心能力。本章讲解四种网络模式、自定义网络、DNS 解析、网络隔离。

本章的核心学习目标包括:

  • 掌握四种网络模式:bridge、host、none、overlay。
  • 理解自定义 bridge 网络:DNS 解析、更好的隔离。
  • 配置端口映射:-p 参数。
  • 实现网络隔离:不同网络的容器无法互通。

1.2 为什么本章如此重要

网络是容器间通信的基础。理解 Docker 网络模型,你才能正确配置服务发现、网络隔离、端口映射。

1.3 核心问题引导

bridge 网络如何工作?容器如何通信?

自定义 bridge 网络和默认 bridge 有什么区别?

host 网络模式有什么优缺点?

overlay 网络如何实现跨主机通信?


二、核心概念详解

2.1 网络模式

bridge(默认)

bash
# 默认 bridge 网络
docker run -d --name web nginx
docker run -d --name api myapi
# web 和 api 通过 IP 通信,不支持 DNS 解析

# 自定义 bridge 网络
docker network create mynet
docker run -d --name web --network mynet nginx
docker run -d --name api --network mynet myapi
# api 可以用 "web" 作为主机名访问 nginx

host

bash
docker run -d --network host nginx
# 容器直接使用宿主机网络,无网络隔离
# 不需要 -p 端口映射

none

bash
docker run -d --network none nginx
# 容器没有网络接口,完全隔离

overlay

bash
# 用于 Docker Swarm 或 Kubernetes
# 跨主机的容器通信
docker network create -d overlay mynet

2.2 自定义网络

bash
# 创建网络
docker network create --driver bridge mynet

# 查看网络
docker network ls
docker network inspect mynet

# 连接/断开容器
docker network connect mynet container1
docker network disconnect mynet container1

2.3 端口映射

bash
# 映射单个端口
docker run -d -p 8080:80 nginx

# 映射多个端口
docker run -d -p 8080:80 -p 8443:443 nginx

# 映射端口范围
docker run -d -p 8000-8010:8000-8010 myapp

# 随机端口
docker run -d -p 80 nginx
docker port <container>

2.4 网络隔离

yaml
# Compose 中的网络隔离
services:
  frontend:
    networks: [public]
  backend:
    networks: [public, private]
  database:
    networks: [private]  # 只有 backend 能访问

networks:
  public:
    driver: bridge
  private:
    driver: bridge
    internal: true  # 不能访问外网

三、实战案例

3.1 多网络隔离

bash
# 创建两个网络
docker network create frontend-net
docker network create backend-net --internal

# 运行容器
docker run -d --name web --network frontend-net nginx
docker run -d --name api --network frontend-net --network backend-net myapi
docker run -d --name db --network backend-net postgres

# web 可以访问 api,但不能访问 db
# api 可以访问 web 和 db
# db 只能被 api 访问

四、本章小结

bridge:默认模式,自定义网络支持 DNS。

host:直接使用宿主机网络,无隔离。

none:完全隔离。

overlay:跨主机通信。

网络隔离:不同网络的容器无法互通。


五、思考与练习

思考题

自定义 bridge 网络为什么支持 DNS 解析?

host 模式有什么安全风险?

internal 网络有什么作用?

练习题

创建自定义网络,验证 DNS 解析。

创建隔离网络,验证容器无法互通。

将容器连接到多个网络。

7/8Dock
0%