蓝戒博客

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

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

2026年1月15日 47点热度 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 中对话未来。

最新 热点 随机
最新 热点 随机
前端开发 TanStack 化:从“框架思维”到“能力组合”的工程演进 Docker 进阶(七):容器化体系设计总结与生产落地经验复盘 Docker 进阶(六):生产环境中的 Docker 安全、监控与日志体系 Docker 进阶(五):Docker + CI/CD —— 从代码提交到自动部署 Docker 进阶(四):使用 Docker Swarm 与 Kubernetes 实现容器编排 Docker 进阶(三):深入理解镜像层(Layer)与缓存机制
Workbox:可直接用于生产环境的 Service Worker 利器快速构建项目文档网站:主流文档站点工具选型与对比DiceBear:30+ 风格、完全可定制的开源头像生成解决方案ES2015 → ES2025:JavaScript 十年演进全景回顾与核心 API 总结ECMAScript 2025(ES16)深度解析20 个现代 JavaScript API 深度盘点
css清除浮动方法及优缺点解析 架构评估方法 ATAM:系统性洞察架构质量的利器 全面理解js变量提升、作用域链 Three.js 3D 可视化项目实战:从快速启动到性能优化全攻略 CSS命名规范—BEM思想 CSS-in-JS 的进化之路:Vanilla Extract 与 Stitches 深度解析
最近评论
渔夫 发布于 3 个月前(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