Docker 入门别只会 run:镜像、容器、卷、网络 4 个核心概念一次讲透

Docker 入门别只会 run:镜像、容器、卷、网络 4 个核心概念一次讲透 视觉笔记

Docker 最容易让新手迷糊的地方,不是命令太多,而是几个核心概念长得太像:镜像像安装包,容器像运行中的实例,卷负责持久化,网络负责互联。如果这四个概念没理顺,命令背得再熟,也很容易在实际项目里犯低级错误。

步骤 1:先把镜像和容器分开理解

你可以把镜像理解成“静态模板”,容器理解成“运行中的实例”。镜像不会自己跑,容器必须基于镜像启动。

1.1 镜像是什么

  • 它是只读模板,包含应用运行所需的文件与环境
  • 通常由 Dockerfile 构建出来,也可以直接从仓库拉取
  • 同一个镜像可以启动多个容器实例

1.2 容器是什么

  • 它是镜像运行后的进程级隔离环境
  • 有自己的文件系统视图、网络命名空间、进程空间
  • 删掉容器,不代表镜像没了;删掉镜像,也不等于已运行容器立刻消失

步骤 2:理解数据卷——为什么‘重启后数据没了’常常不是 Bug

容器默认适合跑无状态进程。容器内部临时写入的数据,如果不挂载卷,删容器时通常会一起消失。

2.1 什么数据该放卷里

  • 数据库文件
  • 上传文件、日志、缓存目录
  • 需要跨容器重建仍保留的数据

2.2 卷和 bind mount 的区别

Volume 更偏 Docker 自己管理;bind mount 直接映射主机目录,更直观,开发时很常用。前者更利于迁移和管理,后者更适合本地调试和代码热更新。

步骤 3:理解网络——容器之间为什么能互相找到

Docker 默认会给容器接入网络。很多人只记得端口映射,却忽略了容器间通信本身也需要网络模型。

3.1 端口映射解决的是‘宿主机到容器’

当你把主机 8080 映射到容器 80,本质是让外部通过宿主机端口访问容器服务。

3.2 自定义网络解决的是‘容器到容器’

同一网络内的容器通常可以按容器名互相访问,这对 Web + DB、API + Redis 这类组合非常重要。用 Compose 时,这种体验尤其顺手。

步骤 4:理解镜像构建——为什么 Dockerfile 不只是‘把命令写进去’

Dockerfile 的目标不是“把所有安装步骤照搬进来”,而是构建一个可复用、可缓存、可部署的运行环境。

4.1 构建时要关注层缓存

  • 变更频繁的步骤尽量放后面
  • 依赖安装与代码复制顺序会影响构建速度
  • 减少无意义文件进入构建上下文

4.2 运行时镜像要尽量小

镜像越小,拉取越快、攻击面越小、部署越轻。多阶段构建是常见优化手段:前一阶段编译,后一阶段只保留运行产物。

要点清单(Docker 初学者最该记住的)

  • 镜像是模板,容器是运行实例,不要混用这两个词
  • 容器删除后,未持久化的数据通常会一起消失
  • 端口映射是对外访问,自定义网络是容器互联
  • Dockerfile 要为缓存、体积与可复用性设计
  • 开发环境与生产环境的挂载和构建策略可以不同

常见问题 FAQ

1)我删了容器,为什么数据库数据没了?

因为你没有把数据库目录挂到卷或宿主机目录。容器内部文件系统默认不等于持久化存储。

2)为什么容器里服务明明启动了,外面却访问不到?

常见原因是端口没映射、服务只监听了容器内的回环地址、宿主机防火墙限制,或映射端口写反了。

3)用 Docker 就一定比直接装在宿主机更快吗?

不一定。Docker 的优势主要是环境一致性、隔离与交付便利,不是所有场景都以“更快”作为第一收益。

4)开发时应该用 volume 还是 bind mount?

本地开发通常 bind mount 更直观,代码改完立刻生效;生产环境更常用 volume 或镜像内置产物,减少对宿主机目录结构的依赖。

上一篇 把 Windows 电脑当服务器:端口转发、DDNS、内网穿透与安全加固一套讲清