Docker 入门教程:安装、镜像、容器、网络与持久化(含 Java 实战)
大约 3 分钟
Docker 入门教程:安装、镜像、容器、网络与持久化(含 Java 实战)
新手一屏速览
- 安装 Docker Desktop 并用
docker run hello-world验证 - 镜像是模板、容器是进程;构建镜像 → 运行容器 → 暴露端口/挂载卷
- 两个可复制运行的例子:单文件 Java 镜像、多阶段构建 Spring Boot
1. 安装与验证
安装 Docker Desktop(Windows/Mac),或 Linux 上安装 Docker 引擎。验证安装:
docker version
docker run --rm hello-world2. 示例一:最小 Java 程序打包为镜像(可直接复制)
创建文件 Hello.java:
/**
* 最小 Java 示例:打印一行文本。
*/
public class Hello {
/**
* 程序入口
* @param args 命令行参数
*/
public static void main(String[] args) {
System.out.println("Hello from Dockerized Java!");
}
}创建 Dockerfile(单阶段编译+运行):
FROM eclipse-temurin:21-jdk AS run
WORKDIR /app
COPY Hello.java .
RUN javac Hello.java
CMD ["java", "Hello"]构建与运行:
docker build -t java-hello:1 .
docker run --rm java-hello:13. 示例二:多阶段构建 Spring Boot 应用(可直接复制)
最近建一些几十个工作内推群,各大城市都有,群里目前已经收集了很多内推岗位,大厂、中厂、小厂、外包都有。 欢迎HR、开发、测试、运维和产品加入。

扫描下方微信,备注:网站+所在城市,即可拉你进工作内推群。

项目结构(最小可运行):
demo/
├─ pom.xml
└─ src/main/java/com/example/demo/
├─ DemoApplication.java
├─ web/HelloController.java
└─ web/ApiResponse.javapom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
</parent>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.example.demo.DemoApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
<description>最小可运行的 Spring Boot 示例</description>
</project>DemoApplication.java:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 应用启动入口。
*/
@SpringBootApplication
public class DemoApplication {
/**
* 启动 Spring Boot。
* @param args 命令行参数
*/
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}ApiResponse.java:
package com.example.demo.web;
/**
* 统一响应对象。
* @param <T> 数据类型
*/
public class ApiResponse<T> {
private boolean success;
private T data;
private String error;
public static <T> ApiResponse<T> ok(T data){
ApiResponse<T> r = new ApiResponse<>();
r.success = true; r.data = data; return r;
}
public static <T> ApiResponse<T> fail(String msg){
ApiResponse<T> r = new ApiResponse<>();
r.success = false; r.error = msg; return r;
}
public boolean isSuccess() { return success; }
public T getData() { return data; }
public String getError() { return error; }
}HelloController.java:
package com.example.demo.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 示例接口:返回问候语。
*/
@RestController
public class HelloController {
/**
* GET /api/hello
* @param name 姓名
* @return 统一响应
*/
@GetMapping("/api/hello")
public ApiResponse<String> hello(@RequestParam(defaultValue = "world") String name) {
return ApiResponse.ok("Hello, " + name);
}
}多阶段 Dockerfile:
FROM maven:3.9.6-eclipse-temurin-21 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn -q -e -DskipTests dependency:go-offline
COPY src ./src
RUN mvn -q -DskipTests package
FROM eclipse-temurin:21-jre AS run
WORKDIR /app
COPY --from=build /app/target/demo-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]构建与运行:
docker build -t demo-spring:0.0.1 .
docker run --rm -p 8080:8080 demo-spring:0.0.1访问:
curl http://localhost:8080/api/hello4. 常用命令与清理
docker images
docker ps -a
docker stop <container>
docker rm <container>
docker rmi <image>5. 常见问题排查
- 构建缓慢:首次拉取基础镜像较慢;使用本地镜像缓存加速
- 端口访问不到:确认容器端口与宿主映射一致(-p 8080:8080)
- 权限问题(Linux):给当前用户加入 docker 组,或命令前加 sudo
- JAR 找不到主类:检查
spring-boot-maven-plugin是否配置mainClass
