如何创建Spring Boot Docker镜像

240 阅读2分钟

如何创建Spring Boot Docker镜像

[Docker]是一个容器引擎,它使在分布式服务器上捆绑、运送和分发应用程序成为可能。

前提条件

  1. 在你的电脑上安装了[Java Development Kit 11]或更新版本。
  2. 确保[Docker]已经安装在你的电脑上。

项目设置

我们将把我们在这里创建的应用程序捆绑和容器化。该应用程序允许我们通过REST API对Todo项目执行CRUD功能。

要检查JDK 是否在你的电脑上正确安装和配置,请执行下面的命令。

$ java --version
java 15.0.2 2021-01-19

执行下面的命令,为该项目创建一个工作目录。

$ mkdir todo
$ cd todo

在上面创建的目录中,执行下面的命令,将项目克隆到你的电脑上。

$ git clone https://github.com/paulodhiambo/springbootcrud.git

执行下面的命令,移动到项目文件夹中。

$ cd springbootcrud

运行应用程序,以验证项目的设置是否正确,应用程序的运行是否没有错误。

$ gradle build

项目结构如下图所示。

└── springbootcrud         # < project root package
    ├── src
    │   ├── main
    │   ├── test
    ├── build.gradle
    ├── gradlew
    ├── Dockerfile # Dockerfile where we write all the container build instructions
    └── gradlew.bat    
    └── settings.gradle

创建一个Docker文件

Dockerfile是一个纯文本文件,包含构建Docker镜像的指令。一个Dockerfile包含以下指令。

  • FROM:指令设置容器所依据的镜像。
  • RUN:在容器中执行命令。
  • COPY:在容器中从文件系统中创建一个文件副本。
  • CMD:设置容器内的可执行命令。

在项目的根文件夹中创建一个Dockerfile

在上面创建的Dockerfile ,添加下面的代码片段。

FROM openjdk:8-jdk-alpine
RUN addgroup -S springdocker && adduser -S springdocker -G springdocker
USER springdocker:springdocker
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
  • FROM openjdk:8-jdk-alpine 设置创建Docker容器的基础镜像。
  • RUN addgroup -S springdocker && adduser -S springdocker -G springdocker 为容器添加一个用户配置文件。
  • USER springdocker:springdocker 设置容器中的用户,使其能够以管理员身份在容器中执行命令。
  • ARG JAR_FILE=target/*.jar 将由 命令生成的 的路径设置为 变量。gradle build jar ARG_FILE
  • COPY ${JAR_FILE} app.jar 将运行 命令后创建的 文件复制到 docker 容器内的 文件。gradle build jar app.jar
  • ENTRYPOINT ["java","-jar","/app.jar"] 表示该容器有一个可执行文件。

构建Docker镜像

要从我们上面创建的Dockerfile中构建一个Docker镜像,请执行下面的命令。

$ docker build --build-arg JAR_FILE=build/libs/\*.jar -t spring-boot-docker:latest .
  • --build-arg JAR_FILE=build/libs/\*.jar 设置运行 命令所生成的 文件的路径。gradle build jar
  • -t 设置镜像的标签。
  • . 表示 在当前目录中。Dockerfile

执行下面的命令,列出你电脑上所有可用的Docker镜像。

$ docker image ls
REPOSITORY    TAG            IMAGE ID       CREATED         SIZE
spring-boot-docker               latest              b7a1056c3eb2   31 minutes ago   143MB
springio/gs-spring-boot-docker   latest              b7a1056c3eb2   31 minutes ago   143MB
<none>                           <none>              4f8c8633df3e   2 days ago       105MB
latest                           latest              6c802830c996   4 weeks ago      414MB

从上面的列表中,我们看到了我们已经创建的spring-boot-docker 镜像。

创建和运行Docker容器

执行下面的命令,从我们上面创建的Docker镜像中创建一个Docker容器。

$ docker run --name spring-boot-docker -d -p 8080:8080 spring-boot-docker:latest
  • --name flag设置Docker容器的名称。
  • -d flag使镜像在后台运行。
  • -p 8080:8080 将Docker容器中的8080端口映射到localhost的8080端口。
  • spring-boot-docker:latest 指定构建Docker容器的镜像。

执行下面的命令,列出所有运行中的Docker容器。

$ docker container ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED       STATUS       PORTS                        NAMES
792fce534e3a   spring-boot-docker   "java -jar /app.jar"   31 minutes ago   Up 31 minutes   0.0.0.0:8080->8080/tcp   spring-boot-docker
  1. 访问8080端口的localhost ,确认spring-boot-crud 应用程序是否在容器中运行。

Docker Hub image

将Docker镜像推送至Docker Hub

Docker Hub image

Docker Hub是一个Docker容器镜像的在线存储库。Docker Hub存储Docker容器,同时也使与其他开发者分享Docker镜像更加容易。

创建账户后,登录Docker Hub,创建一个仓库,名称为spring-boot-crud ,描述为Spring Boot Docker Image

执行下面的命令,将Docker镜像推送到我们在Docker Hub中创建的仓库。

$ docker login

$ docker tag spring-boot-docker:latest <username>/spring-boot-docker:latest

$ docker push <username>/spring-boot-docker:latest
  • docker login 命令可以在命令行上验证你的Docker Hub账户,从而使推送Docker镜像到Docker Hub成为可能。
  • docker tag spring-boot-docker: latest <username>/spring-boot-docker: latest 这个命令修改了我们本地Docker镜像的标签,包括Docker Hub的用户名。
  • docker push <username>/spring-boot-docker: latest 将镜像推送到我们之前创建的Docker Hub仓库。

注意:用你的实际Docker Hub用户名替换<username>

总结

Docker是一个很好的工具,用于构建和打包具有必要依赖性的应用程序,以便在本地和生产中运行它们。Docker playground是一个基于浏览器的环境,你可以用它来测试各种Docker命令,而不用在你的电脑上安装Docker。