Docker入门

Docker 是一个开源的应用容器引擎,基于Go语言 并遵从 Apache2.0 协议开源。

docker核心概念

  • 镜像 (Image): 应用程序的打包文件。它包含了所有运行应用所需的代码、运行时环境、依赖项和配置。它是一个静态模板。
  • 容器 (Container): 镜像的可运行实例。当你运行 docker run 时,Docker 会从镜像中启动一个进程,并为其分配资源,使其成为一个活生生的、正在运行的实例。

docker常用命令

镜像管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#从Docker Hub 或其他镜像仓库拉取镜像到本地。
docker pull <image_name>:<tag>
示例:docker pull nginx:latest

#根据当前目录下的 Dockerfile 构建一个新的镜像,注意不要忘记最后的 .
docker build -t <image_name><tag> .
示例:docker build -t my-app:v1 .

#列出所有本地镜像。
docker images

#删除指定的镜像。如果镜像正在被容器使用,你需要先删除容器。
docker rmi <image_name/image_id>:<tag>
示例:docker rmi my-app:v1

#清理所有未被使用的镜像,包括无标签的“悬空”镜像。
docker image prune -a

容器管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#它会创建一个新的容器并运行它。
docker run -d -p <host_port>:<container_port> --name <container_name> <image_name>:<tag>
-d:在后台运行容器。
-p:将主机的端口映射到容器的端口,第一个参数为主机端口,第二个为容器端口。
--name:为容器指定一个易于识别的名称。
示例:docker run -d -p 80:80 --name my-nginx nginx:latest

#查看正在运行的容器。
docker ps
#查看所有容器(包括停止的)。
docker -a

#停止容器。
docker stop <container_id/name>
#启动停止的容器。
docker start <container_id/name>

#删除容器。
docker rm <container_id/name>

#查看容器的日志输出。
docker logs <container_id/name>

#进入正在运行的容器,并启动一个交互式的 Bash shell。
docker exec -it <container_id/name> bash

#清理所有已停止的容器。
docker container prune

构建docker镜像

如今将 Spring Boot 应用打包成 Docker 镜像已经成为一种标准实践。然而,直接将应用打包到镜像中,可能会导致镜像体积过于庞大。这时,多阶段构建(Multi-stage build)就成了我们的救星。它能帮助我们创建体积更小、更安全的生产环境镜像。

  1. 首先,在你的项目根目录中创建一个名为 Dockerfile 的文件。我们将它分为两个阶段来完成镜像构建。
  2. 编写dockerfile文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 阶段1 编译和打包项目
FROM maven:3.9-amazoncorretto-17 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

# 阶段2:构建最终运行镜像
FROM openjdk:17-jdk-slim
# 暴露应用端口(提供文档和网络配置信息)
# 向外界声明这个容器内部有一个服务正在监听 EXPOSE 后指定的端口。
EXPOSE 8123
WORKDIR /app
COPY --from=build /app/target/zx-picture-backend-0.0.1-SNAPSHOT.jar zx-picture-backend-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java", "-jar", "zx-picture-backend-0.0.1-SNAPSHOT.jar"]

这里来解释一下各个参数的作用

我们都知道镜像包含了运行时环境、依赖项和配置

FROM 表示一个阶段(也就是构建当前运行环境)。docker的构建是分阶段的。且最后只会保存最后一个阶段的文件。可以有效的减少构建的体积

第一阶段:

  • FROM maven:3.9-amazoncorretto-17 AS build: 定义了第一个构建阶段,我们使用了一个包含 Maven 和 JDK 的镜像作为基础,并将其命名为 build
  • WORKDIR /app: 设置容器中的工作目录为 /app
  • COPY pom.xml .COPY src ./src: 这两条指令负责将我们本地的源代码和配置文件复制到容器中。第一个参数为当前dockerfile文件所在的目录,第二个参数为容器中的工作目录。 这个.相当于当前docker的工作目录/app
  • RUN mvn clean package -DskipTests: 在容器中执行 Maven 打包命令,生成可运行的 JAR 包。这里我们使用 -DskipTests 跳过单元测试,以节省构建时间。

第二阶段:

  1. FROM openjdk:17-jre-slim: 因为前面我们已经构建了jar包。这里我们可以不再使用庞大的 JDK 镜像,而是使用一个仅包含 Java 运行时环境(JRE)的精简镜像。这能显著减小最终镜像的体积。

    EXPOSE 8123: 这个指令向外界声明容器中的服务正在监听 8123 端口。但是请注意,这只是一个文档声明。

    COPY --from=build ...: 这是多阶段构建的精髓。我们使用 --from=build 参数,只将第一阶段生成的最终 JAR 包复制过来,而不是整个庞大的编译环境。

    ENTRYPOINT [...]: 定义了容器启动时要执行的命令。

通过这种多阶段构建的方式,我们最终得到的镜像将非常小巧,只包含必要的运行时环境和我们打包好的 JAR 文件

运行docker容器

构建完镜像之后,我们就可以通过 docker run 命令来启动容器了。

1. 查看构建好的镜像

首先,使用 docker images 命令来确认你的镜像是否构建成功。

1
docker images

2. 运行容器

现在,使用 docker run 命令来启动你的 Spring Boot 应用容器。

1
docker run -d -p 8123:8123 --name my-spring-app --rm zx-picture-backend
  • -d:在后台模式下运行容器。不占用终端
  • -p <宿主机端口>:<容器端口>:将宿主机的端口映射到容器内的端口。
  • --name <容器名>:为容器指定一个名称。
  • --rm:当容器停止时,自动删除容器。

3. 验证容器是否正常运行

构建完成后,你可以使用 docker ps 命令来查看正在运行的容器。查看是否有刚刚创建的容器。

1
docker ps

如果你的springboot有接口文档测试工具 可以通过能否打开接口文档以查看是否成功运行。

最后更新于 2025-09-16