在 Java 后端开发里,Docker 不是“虚拟机”,而是一种轻量级操作系统级虚拟化技术,俗称“容器”。
一句话:它把“你的 Java 应用 + JDK + 依赖”打成一个可移植、可重现、秒级启动的“集装箱”,无论开发、测试还是生产,只要机器上有 Docker 引擎,就能以完全一致的环境跑起来。
一、Docker 到底是什么
- 镜像(Image)
只读模板,类比“类”。例如openjdk:21-jdk-slim就是一个最小化的 JDK21 运行环境。 - 容器(Container)
镜像的一次运行实例,类比“对象”。容器=镜像+可写层+隔离的进程空间。 - 仓库(Registry)
存放镜像的地方,最常用的是 Docker Hub,企业里用 Harbor、阿里云 ACR 等私有仓库。
二、对 Java 后端有什么用
- 环境一致性
“在我机器上能跑”→“在任何机器上都能跑”。 - 快速横向扩展
镜像 100 MB 左右,秒级启动,K8s/ Swarm 一键水平扩容。 - 持续集成/持续部署(CI/CD)
GitLab CI、GitHub Actions、Jenkins 都能直接docker build→docker push→docker run,一条命令完成交付。 - 资源隔离 & 安全
利用 Linux Namespace/Cgroups,限制 CPU、内存、网络,避免“一个服务打爆整台机”。 - 多版本并存
同一台宿主机可同时跑 Java 8、11、17、21,互不影响。
三、怎么用(最简实战路线)
准备
安装 Docker Desktop(Win/Mac)或yum/apt install docker-ce(Linux)。
确认docker -v能输出版本。给 Spring Boot 项目加 Dockerfile(放在项目根目录)
# 多阶段构建:先编译,再运行 FROM maven:3.9-eclipse-temurin-21 AS build WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn -B package -DskipTests FROM eclipse-temurin:21-jre-alpine WORKDIR /app COPY --from=build /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app/app.jar"]- 构建镜像
docker build -t demo:1.0 .- 本地跑起来
docker run -d -p 8080:8080 --name demo demo:1.0浏览器访问http://localhost:8080/hello验证。
- 推到仓库(示例用阿里云 ACR)
docker tag demo:1.0 registry.cn-hangzhou.aliyuncs.com/你的命名空间/demo:1.0 docker push registry.cn-hangzhou.aliyuncs.com/你的命名空间/demo:1.0- 生产/测试机器拉下来就跑
docker pull registry.cn-hangzhou.aliyuncs.com/你的命名空间/demo:1.0 docker run -d --restart=always -p 8080:8080 demo:1.0四、常用配套命令速查
| 场景 | 命令 |
|---|---|
| 看日志 | docker logs -f demo |
| 进容器调试 | docker exec -it demo sh |
| 看资源 | docker stats |
| 一键清理 | docker system prune -f |
五、进阶方向
- docker-compose.yml 一次性起多个容器(MySQL+Redis+你的 Java 服务)。
- 使用 BuildKit 缓存 Maven 依赖,加速构建。
- 集成 Testcontainers 做 JUnit 测试,自动起真实 MySQL/Redis 容器。
- 上 Kubernetes,用 Helm 做版本化发布、灰度、回滚。
- 镜像安全扫描:Trivy、Snyk 检测 CVE。
总结
Docker 对 Java 后端就是“一次构建,到处运行”的终极方案:
开发阶段消除“环境不同”导致的 Bug;
交付阶段让“代码→镜像→容器”成为唯一制品;
运维阶段让“扩容=多跑几个容器”而不是“装机器装 JDK”。
掌握 Dockerfile + 镜像仓库 + docker run/compose,就迈过了容器化的门槛;再往后就是 K8s 与服务网格的星辰大海。