蓝戒博客

  • 首页
  • 研发说
  • 架构论
  • 效能录
  • AI谈
  • 随笔集
智构苍穹
融合 AI、架构与工程实践,沉淀方法论,构建可持续的技术价值。
  1. 首页
  2. 研发说
  3. 正文

Docker 进阶(二):吃透 Docker 网络与数据卷(Volumes)

2026年1月15日 109点热度 0人点赞 0条评论

在上一篇 Docker 入门教程中,我们已经掌握了 镜像、容器、Dockerfile、基本运行命令。
但在真实项目中,Docker 的价值并不止于“把应用跑起来”。

当你开始遇到下面这些问题时,就说明你需要深入理解 Docker 网络和数据持久化:

  • 多个容器之间如何通信?
  • 为什么 localhost 在容器里访问不到另一个容器?
  • 容器删了,数据还能不能保留?
  • MySQL、Redis 这类有状态服务,怎么优雅地跑在 Docker 里?

这一篇,我们就系统性地解决这些问题。


一、Docker 网络:容器如何彼此通信?

1.1 为什么容器通信不是“理所当然”的?

在宿主机上,我们习惯了:

localhost:8080

但在 Docker 中:

  • 每个容器都有自己的网络命名空间
  • 每个容器都像一台“独立的小机器”

这意味着:

容器里的 localhost,指的是容器自己,而不是宿主机,更不是其他容器。


1.2 Docker 默认网络模型(bridge)

安装 Docker 后,默认会创建一个 bridge 网络。

Bash
docker network ls

你通常会看到:

  • bridge(默认桥接网络)
  • host
  • none

默认情况下:

Bash
docker run nginx

这个容器就会被挂载到 bridge 网络中。

bridge 网络的特点

  • 容器之间 可以通信
  • 但需要 IP 或显式端口映射
  • IP 可能会变化,不适合硬编码

1.3 查看容器网络信息

Bash
docker inspect <container_id>

你会看到类似:

JSON
"Networks": {
  "bridge": {
    "IPAddress": "172.17.0.2"
  }
}

你确实可以通过这个 IP 访问另一个容器,但这在生产环境是 非常不推荐的。


二、自定义 Docker 网络:让容器“按名字通信”

2.1 创建自定义网络

Bash
docker network create my-net

这是一个 用户自定义 bridge 网络,和默认 bridge 最大的区别是:

支持基于容器名的 DNS 解析


2.2 让容器加入同一个网络

Bash
docker run -d --name backend --network my-net node-app
docker run -d --name frontend --network my-net nginx

此时:

  • frontend 可以直接访问 http://backend:3000
  • 不需要关心 IP

这是 Docker 官方推荐的容器通信方式。


2.3 一个真实示例:前后端 + API

frontend  --->  http://api:8080
api       --->  mysql:3306

只要它们在同一个 Docker 网络中:

  • 容器名 = 域名
  • Docker 自动做 DNS 映射

三、Docker 的三种网络模式对比

网络模式特点适用场景
bridge默认隔离,需端口映射大多数场景
host与宿主机共用网络高性能、调试
none无网络安全/特殊容器

一般结论是:

90% 的项目,用自定义 bridge 网络即可


四、Docker 数据卷(Volumes):容器删了,数据怎么办?

4.1 为什么需要数据卷?

容器的文件系统是:

  • 临时的
  • 可随时销毁的
docker rm -f mysql

如果数据存在容器里:

数据会直接消失 💥

这对数据库来说是不可接受的。


4.2 Docker 提供了哪几种数据持久化方式?

方式描述是否推荐
VolumeDocker 管理的存储⭐⭐⭐⭐⭐
Bind Mount挂载宿主机目录⭐⭐⭐
tmpfs内存存储⭐

五、Volume:最推荐的方式

5.1 创建 Volume

Bash
docker volume create my-data

Bash
docker volume ls

5.2 使用 Volume 启动容器

Bash
docker run -d \
  --name mysql \
  -v my-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql:8

此时:

  • 数据写入 /var/lib/mysql
  • 实际存储在 Docker 管理的 Volume 中
  • 容器删除,数据仍然存在

5.3 验证数据是否持久化

Bash
docker rm -f mysql
docker run -d \
  --name mysql2 \
  -v my-data:/var/lib/mysql \
  mysql:8

👉 数据仍然存在


六、Bind Mount:直接挂宿主机目录

Bash
docker run -d \
  -v /data/mysql:/var/lib/mysql \
  mysql:8

优点:

  • 数据可直接在宿主机查看
  • 适合本地开发、调试

缺点:

  • 与宿主机路径强耦合
  • 跨平台一致性差

七、网络 + Volume 的组合:真实项目标准姿势

以 Node.js + MySQL 为例:

Bash
docker network create app-net
docker volume create mysql-data

Bash
docker run -d \
  --name mysql \
  --network app-net \
  -v mysql-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql:8

Bash
docker run -d \
  --name api \
  --network app-net \
  -e DB_HOST=mysql \
  node-api

你会发现:

  • 网络负责 通信
  • Volume 负责 数据安全
  • 容器本身可以随意销毁、重建

这正是 Docker 的核心设计哲学。


八、这一篇你应该真正掌握的东西

如果你已经理解并能回答下面问题,说明你真的“进阶”了:

  • 为什么容器里访问不了 localhost?
  • Docker 是如何通过容器名通信的?
  • Volume 和 Bind Mount 的本质区别是什么?
  • 为什么数据库一定要用 Volume?

标签: Docker bridge 网络 Docker Volume Docker 容器通信 Docker 数据卷 Docker 网络
最后更新:2026年1月15日

cywcd

我始终相信,技术不仅是解决问题的工具,更是推动思维进化和创造价值的方式。从研发到架构,追求极致效能;在随笔中沉淀思考,于 AI 中对话未来。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

cywcd

我始终相信,技术不仅是解决问题的工具,更是推动思维进化和创造价值的方式。从研发到架构,追求极致效能;在随笔中沉淀思考,于 AI 中对话未来。

最新 热点 随机
最新 热点 随机
一人指挥 AI 程序员军团:OpenAI:Codex App 来了,开发效率或将提升 10 倍 AI 开始雇佣人类?RentAHuman 爆火背后:一场关于「AI 代理经济」的真实实验 大模型巅峰对决:GPT-5.4 Pro 横空出世,Gemini 3.1、Grok 4.2、Claude Opus 4.6 谁才是最强 AI? AI 编程神器 Qoder 专业版免费体验攻略 + QoderWork 全面解析 OpenClaw 太费 Token 的终极解决方案(可省 90%+) Agent 生态分裂:OpenClaw 之外,OpenFang 给出另一条路
基于 Monaco Editor 的 Web Component 智能提示实践Skills Desktop 完全指南:从认识到实践,打造你的 AI 技能中枢不只是聊天机器人:Composio,让 AI 真正“动手干活”AI 智能体框架选型:主流方案对比与建议ChatDev:把 AI 组织成“团队”,帮你把事做完的多智能体平台Codex 国内如何使用与安装?一篇真正能跑通的完整教程
让程序员跳槽的非钱原因有哪些? Nitro v3 + Vite:从快速启动到多平台部署的高效全栈方案 JS 获取浏览器窗口大小全解 WebAssembly(WASM)技术全景解析:从浏览器加速到云原生基石 js异步编程的解决方案全解析 Html2canvas实现网页截图应用
最近评论
渔夫 发布于 4 个月前(11月05日) 学到了,感谢博主分享
沙拉小王子 发布于 8 年前(11月30日) 适合vue入门者学习,赞一个
沙拉小王子 发布于 8 年前(11月30日) 适合vue入门者学习,赞一个
cywcd 发布于 9 年前(04月27日) 请参考一下这篇文章http://www.jianshu.com/p/fa4460e75cd8
cywcd 发布于 9 年前(04月27日) 请参考一下这篇文章http://www.jianshu.com/p/fa4460e75cd8

COPYRIGHT © 2025 蓝戒博客_智构苍穹-专注于大前端领域技术生态. ALL RIGHTS RESERVED.

京ICP备12026697号-2