从安装Docker到将Spring Boot推送到DockerHub
初次见面。我是Docker土香的Docker酱♡
虽然我对Docker的使用方法不太了解,
但我打算边使用边理解,
所以我正在按照Spring文档的指南“使用Docker进行Spring Boot开发”进行操作,
但有些地方我遇到了困难,所以我留下了步骤记录><
如果你有兴趣,可以参考一下指南。
环境
・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/
如果教程已经完成并成功注册,那就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
如果遇到不能使用「./gradlew」的错误,那是因为路径错误了,请返回到Gradle所在的位置。
例如:cd C:\Users\ユーザー名\gs-spring-boot-docker\initial
将代码推送到DockerHub。
你可以通过docker images命令来查看创建的镜像列表。
你可以使用docker push 用户名/spring-boot-docker命令来推送镜像。
顺便说一下,你可以使用docker rmi命令删除镜像。
要删除镜像,您可以使用镜像ID或镜像名称。
– docker rmi -f 7d9495d03763
– docker rmi -f spring-boot-docker
结束了哟!!
如果我有任何错误,请指出来。