Docker 从原理到项目落地(镜像 / 容器 / 网络 / 卷 / Dockerfile)

这篇文章把 Docker 按"你真的能用来部署项目"的方式讲清楚:

  • 容器到底是什么,和虚拟机差在哪
  • 镜像分层、写时复制为什么能让交付更快
  • 网络/卷分别解决什么问题
  • Dockerfile 怎么写才可维护
  • 一个前后端 + MySQL 的项目如何容器化(思路级别)

1. 一句话理解 Docker

Docker 是一套基于容器的应用交付与运行方案:

  • 镜像(Image):把应用与依赖打包成可分发的"交付物"
  • 容器(Container):镜像运行后的实例(进程 + 隔离环境)
  • 网络/卷:分别解决容器间通信与数据持久化

2. 为什么要用 Docker(它解决什么痛点)

你可以用下面这句话当博客开头,也能当面试回答:

  • 解决"环境不一致":开发/测试/生产一致
  • 解决"交付不标准":镜像即交付物,可回滚、可复现
  • 解决"部署慢":启动容器比启动虚拟机快很多
  • 提升"资源利用率":容器共享宿主机内核,开销更小

3. 容器 vs 虚拟机:差异本质

  • 虚拟机:每个 VM 都有完整 OS 内核,启动慢、资源重
  • 容器:共享宿主机内核,通过 namespace/cgroup 隔离进程、网络、文件系统,启动快、资源轻

所以你可以把容器理解成:

  • "在同一台宿主机上跑的很多个隔离进程",但对应用来说像独立机器

4. 镜像 vs 容器:别背概念,背关系

  • 镜像:只读模板(分层),相当于"应用快照"
  • 容器:镜像运行起来的实例(镜像只读层 + 容器可写层)

容器删除后数据为什么没了?

  • 因为容器可写层跟着容器生命周期走
  • 要持久化就必须用 Volume / Bind Mount

5. Docker 为什么快(面试常问)

关键是三点:

  1. 共享内核:无需虚拟化整套 OS
  2. 镜像分层:复用层,拉取/构建更高效
  3. 写时复制:容器可写层轻量

6. Docker 三大核心对象

  • Image:构建与分发
  • Container:运行实例
  • Registry:镜像仓库(DockerHub/私有仓库)

配套两类基础设施:

  • Network:容器间通信
  • Volume:持久化

7. 网络:bridge/host/none/overlay 怎么选

最常用的是 bridge(默认)

  • 容器在私网,通过端口映射对外
  • 自定义 bridge 网络支持容器间用名称互通(内置 DNS)

其他模式:

  • host:容器与宿主共享网络栈,性能好但隔离弱
  • none:无网络
  • overlay:跨主机网络(Swarm/K8s)

项目落地建议:

  • 单机部署:bridge + 端口映射
  • 多机集群:交给 K8s/Swarm 的 overlay

8. Volume:容器化落地的关键

你容器化项目时最容易踩坑的点,就是"数据库数据怎么留住"。

  • 容器删掉会丢数据
  • 用 Volume 把数据挂到宿主机/由 Docker 管理

对比:

  • Volume:Docker 管理,跨容器复用更方便
  • Bind Mount:直接挂宿主机目录,灵活但更依赖宿主机路径

9. Dockerfile:CMD vs ENTRYPOINT(必考点)

  • ENTRYPOINT:固定入口程序
  • CMD :默认参数/默认命令,容易被 docker run 覆盖

常见搭配(Java 项目):

dockerfile 复制代码
ENTRYPOINT ["java","-jar","app.jar"]
CMD ["--spring.profiles.active=prod"]

10. 镜像瘦身:真的有用的 4 个技巧

  • 选小基础镜像:alpine / distroless(注意兼容性)
  • .dockerignore:排除 node_modules/target/logs
  • 清理缓存与构建产物
  • 多阶段构建:构建阶段带工具,运行阶段只保留产物

11. 一个前后端分离项目如何容器化(思路级别)

以"前端 Vue + 后端 Spring Boot + MySQL"为例:

  • MySQL:
    • 容器运行
    • 挂 Volume 持久化数据
  • 后端:
    • Dockerfile 打包 jar
    • 通过环境变量/配置指定数据库连接
  • 前端:
    • 构建产物(dist)可以:
      • 放到 Nginx 镜像中,或
      • 单独一个静态站容器
  • 统一用 docker network 让服务互通

这样你能做到:

  • 一条命令启动整套系统
  • 环境可复制、可回滚

12. 面试 30 秒模板(可直接背)

  • Docker 用镜像交付、用容器运行,解决环境一致性和部署标准化。
  • 容器共享宿主机内核,启动快、资源开销小;镜像分层复用提高构建与分发效率。
  • 落地时我最关注两点:网络(服务互通、端口映射)和卷(数据库/上传文件持久化)。
  • Dockerfile 里区分 ENTRYPOINT 和 CMD,多阶段构建和 .dockerignore 能显著减小镜像。
相关推荐
zhen242 小时前
K8s Service
云原生·容器·kubernetes
janthinasnail2 小时前
Docker镜像源加速器
docker·docker镜像源
眼镜哥(with glasses)3 小时前
网络技术三级考试综合题笔记整理(第二题、第三题)
网络·笔记·智能路由器
Johnstons3 小时前
读懂 TCP 标志位:网络运维中的“信号灯”
运维·网络·tcp/ip
半壶清水3 小时前
[软考网规考点笔记]-数据通信基础之差错控制编码技术
网络·笔记·网络协议·tcp/ip
坚定的共产主义生产设备永不宕机3 小时前
网络层协议(IPV4报头)
运维·服务器·网络
我爱学习好爱好爱4 小时前
Kubernetes 1.29集群上部署Java网站项目
java·容器·kubernetes
执笔为剑4 小时前
1.2、docker环境部署
运维·docker·容器
王燕龙(大卫)4 小时前
通过文心快码,2小时完成一周的工作量
服务器·网络·tcp/ip