从安装Docker到将Spring Boot推送到DockerHub

初次见面。我是Docker土香的Docker酱♡
虽然我对Docker的使用方法不太了解,
但我打算边使用边理解,
所以我正在按照Spring文档的指南“使用Docker进行Spring Boot开发”进行操作,
但有些地方我遇到了困难,所以我留下了步骤记录><
如果你有兴趣,可以参考一下指南。

image.png

环境

・Windows 10 专业版

前提条件

要在 Windows 10 上使用 Docker,就需要”Hyper-V”功能。
需要 Windows 10 Professional 或更高版本,并且不支持 Windows 10 Home。

启用Hyper-V。

打开控制面板,选择程序和功能,然后选择左侧的[启用或关闭Windows功能],选中[Hyper-V],点击[确定]。请重新启动Windows。

安装 Docker

为了使用它,需要先注册一个Docker ID。
• https://hub.docker.com/

image.png

如果教程已经完成并成功注册,那就OK了。

春季启动

準備的事项

    • ファイル編集用にテキストエディターまたは IDE →メモ帳でおk

 

    • JDK 1.8 以降 →コマンドプロンプトで「jar」と打って使用方法が表示されたらおk インストール方法

Gradle 4+ →インストールサイト

请在 PowerShell 中输入以下代码。
①git clone https://github.com/spring-guides/gs-spring-boot-docker.git
②cd gs-spring-boot-docker/initial

如果你想要显示「Hello Docker World」,请将以下内容替换为 src/main/java/hello/Application.java。

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class Application {

  @RequestMapping("/")
  public String home() {
    return "Hello Docker World";
  }

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

}

我要运行gradlew build。
在Spring的指南中,建议输入以下内容,但是在PowerShell中会出现错误。
./gradlew build && java -jar build/libs/gs-spring-boot-docker-0.1.0.jar

発生場所 行:1 文字:17
+ ./gradlew build && java -jar build/libs/gs-spring-boot-docker-0.1.0.j ...
+                 ~~
トークン '&&' は、このバージョンでは有効なステートメント区切りではありません。
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : InvalidEndOfLine

把「&&」改成「;」就会成功。./gradlew build ; java -jar build/libs/gs-spring-boot-docker-0.1.0.jar

当你连接到8080端口并且能够显示出”Hello Docker World”时,就表示一切正常。
点击这个链接→ http://localhost:8080/

容器化

路径:~/gs-spring-boot-docker/initial/下创建一个Dockerfile。
这是创建后续Docker镜像所需的。
不要加文件扩展名。
有①到③三种模式可选。
如果是第一次尝试,建议从①开始逐步加深理解。
如果觉得麻烦,只尝试①也可以,或者也可以直接使用优化过的③模式。

基本

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

我是在JDK8的基础上运行的。
我把JAR文件命名为”app.jar”并放入容器中,
然后通过ENTRYPOINT来执行。

使用PowerShell运行以下命令来创建镜像:
docker build –build-arg JAR_FILE=build/libs/*.jar -t springio/gs-spring-boot-docker .
虽然显示了”docker build [OPTION]需要至少一个参数~”的消息导致无法构建,但在重新启动终端后再次输入命令就成功了。
成功后会显示如下的镜像:

Sending build context to Docker daemon  21.11MB
Step  : FROM openjdk:8-jdk-alpine
 ---> 
Step  : ARG JAR_FILE=target/*.jar
 ---> Using cache
 ---> 
Step 5/6 : COPY ${JAR_FILE} app.jar
COPY failed: no source files were specified

②安全性提升版

听说现在的安全性有问题,所以我打算将应用程序配置为以非root用户身份运行。

FROM openjdk:8-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

创建镜像
docker build -t springio/gs-spring-boot-docker .

运行以下命令可以确认用户名:
docker run -p 8080:8080 springio/gs-spring-boot-docker

在应用程序的启动日志中,您可以确认用户的用户名(请注意第一个 INFO 日志中的 “开发者”)。

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.1.RELEASE)

2020-04-23 07:29:41.729  INFO 1 --- [           main] hello.Application  
...

Performance improvements version.

接下来,我们将充分利用Spring Boot fat的特性来提高性能,并继续进行重写。

使用Spring Boot的fat jar文件可以明确分离依赖关系和应用程序资源,并利用这一事实来提升性能。

FROM openjdk:8-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","hello.Application"]

下面是Spring指南中的代码,建议使用PowerShell来执行,但是会出现错误。
在PowerShell中,使用此代码将会报错。请注意。

式の終わりの ')' が存在しません。
発生場所 行:1 文字:30
+ mkdir -p build/dependency && (cd build/dependency; jar -xf ../libs/*. ...
+                              ~~~~~~~~~~~~~~~~~~~~
式は、パイプラインの最初の要素としてのみ許可されます。
発生場所 行:1 文字:73
+ ... r -p build/dependency && (cd build/dependency; jar -xf ../libs/*.jar)
+                                                                         ~
式またはステートメントのトークン ')' を使用できません。

我好像不能使用括号。在Mac上有没有问题呢?我找了很久,但找不到替代或启用括号的方法。仔细看发现,可以将括号外的处理分开。
①mkdir -p build/dependency
②cd .\build\dependency\
③jar -xf ../libs/*.jar
在dependency目录下,创建了包含BOOT-INF/lib和应用程序类的BOOT-INF/classes目录。

使用Gradle创建Docker镜像。

我会使用Gradle创建Docker镜像。
请在命名空间中输入Docker用户名。
(顺便说一下,个人镜像需要命名空间,而官方镜像则不需要。)
你可以自由决定仓库名称。
这次我们将仓库名称设为”spring-boot-docker”。
./gradlew bootBuildImage –imageName=命名空间/spring-boot-docker

image.png

如果遇到不能使用「./gradlew」的错误,那是因为路径错误了,请返回到Gradle所在的位置。
例如:cd C:\Users\ユーザー名\gs-spring-boot-docker\initial

image.png

将代码推送到DockerHub。

你可以通过docker images命令来查看创建的镜像列表。
你可以使用docker push 用户名/spring-boot-docker命令来推送镜像。

顺便说一下,你可以使用docker rmi命令删除镜像。
要删除镜像,您可以使用镜像ID或镜像名称。
– docker rmi -f 7d9495d03763
– docker rmi -f spring-boot-docker

image.png

结束了哟!!

如果我有任何错误,请指出来。

广告
将在 10 秒后关闭
bannerAds