Docker网络与数据卷
容器运行后最重要的两个问题是:容器之间怎么通信,容器数据怎么保存。Docker 网络解决通信问题,数据卷解决持久化问题。
本页负责建立网络和数据卷的整体概念。要深入理解 Network Namespace、veth、Linux bridge、Docker DNS、SNAT、端口发布和网络故障定位,请阅读 Docker 网络底层原理;要学习容器可写层、Volume、Bind Mount、tmpfs、UID/GID、SELinux、备份恢复和 RPO/RTO,请阅读 Docker 存储挂载与数据生命周期。
Docker网络
常见网络模式:
| 模式 | 说明 |
|---|---|
| bridge | 默认桥接网络,最常用 |
| host | 直接使用宿主机网络 |
| none | 不配置网络 |
| overlay | 跨主机容器网络,常用于集群 |
bridge网络流程
mermaid
flowchart TD
A[容器A] --> B[docker0网桥]
C[容器B] --> B
B --> D[宿主机网络]
D --> E[外部网络]容器之间如果在同一个自定义 bridge 网络中,可以通过容器名或服务名访问。
常用命令
bash
docker network ls
docker network create app-net
docker network inspect app-net
docker network rm app-net运行容器时指定网络:
bash
docker run -d --name redis --network app-net redis:7数据卷
容器文件系统是临时的,容器删除后数据会丢失。数据卷用于把重要数据保存到容器外。
mermaid
flowchart TD
A[容器] --> B[volume挂载点]
B --> C[宿主机Docker数据目录]volume和bind mount
| 类型 | 说明 | 适合场景 |
|---|---|---|
| volume | Docker 管理的数据卷 | 数据库、Redis 等持久化 |
| bind mount | 挂载宿主机指定目录 | 开发调试、配置文件挂载 |
volume 示例:
bash
docker volume create mysql-data
docker run -d -v mysql-data:/var/lib/mysql mysql:8.0bind mount 示例:
bash
docker run -d -v D:/logs:/app/logs demo-app:1.0数据卷操作
bash
docker volume ls
docker volume inspect mysql-data
docker volume rm mysql-data常见问题
容器内访问localhost为什么不对
容器内的 localhost 指的是容器自己,不是宿主机,也不是其他容器。容器间访问要使用容器名、服务名或宿主机地址。
删除容器会删除volume吗
默认不会。执行 docker compose down -v 或手动删除 volume 才会删除数据卷。
使用建议
- 有状态服务必须挂载数据卷。
- 多容器通信使用自定义网络。
- 不要在容器内长期保存重要数据。
- 日志、配置、数据目录要明确挂载策略。
- 清理 Docker 资源前先确认 volume 是否仍有用。
深入学习
| 学习方向 | 深度知识点 | 学完应能解决的问题 |
|---|---|---|
| 网络 | Docker 网络底层原理 | 能画出容器到容器、容器到外网、宿主机端口到容器的报文路径,并区分 DNS、拒绝、超时、MTU 和防火墙问题 |
| 存储 | Docker 存储挂载与数据生命周期 | 能选择可写层、Volume、Bind Mount 或 tmpfs,解释挂载覆盖和权限问题,并设计数据库备份、恢复与演练 |
| 运行时 | Docker 容器运行底层原理 | 能解释 namespace、cgroup、OverlayFS、PID 1 和容器生命周期 |
| 诊断 | Docker 容器信息与生产诊断 | 能从 inspect、stats、logs、events、网络和挂载信息还原容器真实运行状态 |
