这篇文章把 Docker 按"你真的能用来部署项目"的方式讲清楚:
- 容器到底是什么,和虚拟机差在哪
- 镜像分层、写时复制为什么能让交付更快
- 网络/卷分别解决什么问题
- Dockerfile 怎么写才可维护
- 一个前后端 + MySQL 的项目如何容器化(思路级别)
1. 一句话理解 Docker
Docker 是一套基于容器的应用交付与运行方案:
- 镜像(Image):把应用与依赖打包成可分发的"交付物"
- 容器(Container):镜像运行后的实例(进程 + 隔离环境)
- 网络/卷:分别解决容器间通信与数据持久化
2. 为什么要用 Docker(它解决什么痛点)
你可以用下面这句话当博客开头,也能当面试回答:
- 解决"环境不一致":开发/测试/生产一致
- 解决"交付不标准":镜像即交付物,可回滚、可复现
- 解决"部署慢":启动容器比启动虚拟机快很多
- 提升"资源利用率":容器共享宿主机内核,开销更小
3. 容器 vs 虚拟机:差异本质
- 虚拟机:每个 VM 都有完整 OS 内核,启动慢、资源重
- 容器:共享宿主机内核,通过 namespace/cgroup 隔离进程、网络、文件系统,启动快、资源轻
所以你可以把容器理解成:
- "在同一台宿主机上跑的很多个隔离进程",但对应用来说像独立机器
4. 镜像 vs 容器:别背概念,背关系
- 镜像:只读模板(分层),相当于"应用快照"
- 容器:镜像运行起来的实例(镜像只读层 + 容器可写层)
容器删除后数据为什么没了?
- 因为容器可写层跟着容器生命周期走
- 要持久化就必须用 Volume / Bind Mount
5. Docker 为什么快(面试常问)
关键是三点:
- 共享内核:无需虚拟化整套 OS
- 镜像分层:复用层,拉取/构建更高效
- 写时复制:容器可写层轻量
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 镜像中,或
- 单独一个静态站容器
- 构建产物(dist)可以:
- 统一用 docker network 让服务互通
这样你能做到:
- 一条命令启动整套系统
- 环境可复制、可回滚
12. 面试 30 秒模板(可直接背)
- Docker 用镜像交付、用容器运行,解决环境一致性和部署标准化。
- 容器共享宿主机内核,启动快、资源开销小;镜像分层复用提高构建与分发效率。
- 落地时我最关注两点:网络(服务互通、端口映射)和卷(数据库/上传文件持久化)。
- Dockerfile 里区分 ENTRYPOINT 和 CMD,多阶段构建和
.dockerignore能显著减小镜像。