容器是什么
物理机、虚拟机、容器对比;为何需要容器。
容器是什么
这一课你将能做到
- 用一张表说清物理机、虚拟机、容器在「内核、启动速度、体量、隔离粒度」上的差异
- 用 Java「类与对象」的类比,准确讲清镜像与容器的关系
- 说出你的 Spring Boot + MySQL + Redis 项目为什么值得容器化,以及容器化不解决什么
为什么要学
先看三个真实场景:
场景一:你本地 JDK 21、MySQL 8.0、Redis 7,代码跑得好好的;测试服务器是 JDK 17、MySQL 5.7、Redis 5,启动直接报 UnsupportedClassVersionError。场景二:新同事入职装环境,装了一下午,最后卡在一个 Redis 配置文件上。场景三:上线部署,运维在服务器上手动传 jar、改配置、敲启动脚本,每一步都靠人肉,改一处错一处。
三个问题的共同根源是:应用和它的运行环境是分开的。JDK 版本、系统库、时区、目录结构,全靠人记、靠文档、靠运气。
容器做的事,就是把「应用 + 它依赖的运行时」打成一个标准化的、可搬运的交付单元——镜像。开发、测试、生产跑的是同一份镜像,环境不一致从根源上消失。
对 Java 后端工程师来说,容器是部署上岗证:面试必问、生产在用、CI/CD 依赖它。这一课不装环境、不敲部署命令,只打概念地基——后面 11 课的所有操作都建立在「镜像、容器、隔离」这三个词的准确理解上。
先建立图像
物理机: [硬件] → [OS] → [你的进程们]
一切共享,互相干扰
虚拟机: [硬件] → [OS] → [Hypervisor] → [Guest OS + 你的进程]
每台 VM 自带一整套操作系统,重
容器: [硬件] → [OS] → [容器引擎] → [进程 A | 进程 B | 进程 C]
共享内核,进程级隔离,轻
本站技术栈容器化后的部署图(后面课程会亲手搭出来):
浏览器 / 客户端
│
▼
Spring Boot 容器 (:8080) ← jar + JRE 钉死在镜像里
│ │
▼ ▼
MySQL 容器 Redis 容器
(:3306) (:6379)
│ │
└─ 数据落在数据卷(volume),容器删了数据还在
用你已有的 Java 知识类比:
// 镜像 Image ≈ 类(Class):只读模板,定义"这个进程怎么跑"
// 容器 Container ≈ 对象(Object):由类创建的运行实例,可同时存在多个
Image springBootImage = ...; // docker pull / docker build 得到
Container app1 = springBootImage.newInstance(); // docker run → 容器 1
Container app2 = springBootImage.newInstance(); // 同一镜像再跑一个,互不干扰
| 维度 | 物理机 | 虚拟机 | 容器 |
|---|---|---|---|
| 内核 | 自有 | 每台 VM 自带 Guest OS 内核 | 共享宿主机内核 |
| 启动 | 分钟级 | 分钟级 | 秒级 |
| 体量 | — | 常见 GB 级 | 常见 MB~几百 MB |
| 隔离粒度 | 无 | 整机级(最强) | 进程级(够用,但不是绝对安全边界) |
人话:虚拟机是「每层楼独立装修水电再住人」;容器是「同一栋楼里每人一个房间,共用水电管道(内核),但门锁(namespace)各归各」。
跟着做
本课不要求已安装 Docker,重点是建立概念 + 亲手确认事实。
步骤 1:写下你当前的部署痛点
打开笔记回答三个问题: