Skip to content

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

类型说明适合场景
volumeDocker 管理的数据卷数据库、Redis 等持久化
bind mount挂载宿主机指定目录开发调试、配置文件挂载

volume 示例:

bash
docker volume create mysql-data
docker run -d -v mysql-data:/var/lib/mysql mysql:8.0

bind 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 才会删除数据卷。

使用建议

  1. 有状态服务必须挂载数据卷。
  2. 多容器通信使用自定义网络。
  3. 不要在容器内长期保存重要数据。
  4. 日志、配置、数据目录要明确挂载策略。
  5. 清理 Docker 资源前先确认 volume 是否仍有用。

深入学习

学习方向深度知识点学完应能解决的问题
网络Docker 网络底层原理能画出容器到容器、容器到外网、宿主机端口到容器的报文路径,并区分 DNS、拒绝、超时、MTU 和防火墙问题
存储Docker 存储挂载与数据生命周期能选择可写层、Volume、Bind Mount 或 tmpfs,解释挂载覆盖和权限问题,并设计数据库备份、恢复与演练
运行时Docker 容器运行底层原理能解释 namespace、cgroup、OverlayFS、PID 1 和容器生命周期
诊断Docker 容器信息与生产诊断能从 inspect、stats、logs、events、网络和挂载信息还原容器真实运行状态