在本文中,您将学习如何构建用于运行Spring引导应用程序的Docker镜像。我首先给你一个docker的简要概念,然后我们将为我们的spring启动应用程序创建一个docker镜像,并在本地运行它。最后,我们会将码头图像推送到docker 中心库。
Docker是一个软件平台,它使开发人员能够借助容器在任何地方开发,发布和运行应用程序。
现在什么是容器,码头工人用容器解决什么问题?
好吧,让我们通过提出几个问题来理解。以下任何一种情况对您而言都很熟悉?
我敢打赌他们中的一些人。
Docker通过为应用程序创建一个轻量级的独立可执行程序包来解决这些问题,该程序包包括运行代码,运行时,库,工具,环境和配置所需的一切。
这些独立的可执行程序包称为码头图像。而一个正在运行的Docker镜像实例称为码头容器。
现在,这些容器图像可以在任何环境中的任何地方共享,发货和运行。无论他们运行的环境如何,他们的表现都完全一样。
而且,您可以在同一个基础架构上运行多个完全不同配置的容器。所有容器都是完全隔离的,彼此独立运行。
很酷,不是吗?那么,让我们现在学习如何在Docker容器中运行Spring Boot应用程序。但在此之前,请继续在您的平台上安装Docker社区版。
在本文中,我们将dockerize一个基于web套接字的群组聊天应用程序,这个应用程序是用spring引导的。
转到应用程序的根目录并创建一个名为的新文件Dockerfile
。
$ cd spring-boot-websocket-chat-demo
$ touch Dockerfile
Dockerfile是我们定义Docker镜像并指定运行应用程序所需的所有配置的地方。以下是我们的Spring boot应用程序的Dockerfile -
# Start with a base image containing Java runtime
FROM openjdk:8-jdk-alpine
# Add Maintainer Info
LABEL maintainer="xxx@gmail.com"
# Add a volume pointing to /tmp
VOLUME /tmp
# Make port 8080 available to the world outside this container
EXPOSE 8080
# The application's jar file
ARG JAR_FILE=target/websocket-demo-0.0.1-SNAPSHOT.jar
# Add the application's jar to the container
ADD ${JAR_FILE} websocket-demo.jar
# Run the jar file
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/websocket-demo.jar"]
Dockerfile非常简单且具有声明性。让我们通过Dockerfile的每一行来理解细节。
openjdk:8-jdk-alpine
图像作为我们的基础图像。这是一个使用Alpine Linux的非常轻量级的OpenJDK 8运行时映像。(它非常适合小型Java微服务。)LABEL
指令用于向图像添加元数据。在上面的Dockerfile中,我们maintainer
通过LABEL
指令添加了一些关于图像的信息。VOLUME
指令使用指定的路径在容器上创建一个安装点。运行容器时,可以指定给定安装点将映射到的Hot OS上的目录。之后,容器写入挂载路径的任何内容都将写入主机操作系统上的映射目录。/var/log/app.log
。VOLUME
带有路径的路径/var/log
,然后在运行该容器时指定该安装点将映射到的主机操作系统上的目录。之后,您将能够从主机操作系统上的映射目录访问日志。Dockerfile
,我们创建了一个带有路径的挂载点,/tmp
因为这是默认情况下Spring引导应用程序为Tomcat创建工作目录的地方。尽管这个spring引导应用程序并不需要它,因为谁在乎tomcat目录。但是如果你想存储诸如tomcat访问日志等东西,那么VOLUMES非常有用。ARG
指令定义了一个默认值的变量。您可以通过在构建时传递它来覆盖该变量的默认值。ARG <name>[=<default value>]
ADD
指令用于将新文件和目录复制到泊坞窗图像。
现在我们已经定义了Dockerfile
,让我们为我们的应用程序构建一个docker镜像。从项目的根目录键入以下命令来构建docker 镜像 -
$ docker build -t spring-boot-websocket-chat-demo .
您可以使用以下命令查看系统上所有泊docker 镜像的列表 -
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
spring-boot-websocket-chat-demo latest 30ad8958ac67 22 hours ago 126MB
openjdk 8-jdk-alpine 224765a6bdbe 3 months ago 102MB
这应该显示我们新建的docker镜像。
一旦你有一个docker镜像,你可以使用docker run
像这样的命令来运行它-
$ docker run -p 5000:8080 spring-boot-websocket-chat-demo
在该run
命令中,我们指定8080
容器上的端口应映射到5000
主机操作系统上的端口。
一旦应用程序启动,您应该可以访问它。http://localhost:5000
容器在前台运行,按下CTRL + C
会停止它。现在让我们看看如何在后台运行容器。
您可以使用命令中的-d
选项在docker run
后台运行容器 -
$ docker run -d -p 5000:8080 spring-boot-websocket-chat-demo
1c3528715862a8a8efb712c85bc8ab61f3419c04eb6dc613af76c89846d316e0
上述命令在后台启动容器并为您提供容器ID。您可以使用以下命令查看系统中运行的所有容器的列表 -
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c3528715862 spring-boot-websocket-chat-demo "java -Djava.securit…" About a minute ago Up About a minute 8080/tcp, 0.0.0.0:4000->80/tcp vigorous_stallman
现在让我们将码头图像推送到docker中央库,以便其他人可以下载并使用我们的镜像。
用您的Docker ID登录
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (callicoder): callicoder
Password:
Login Succeeded
标记镜像
要将本地图像推送到docker注册中心,您需要将本地图像与docker注册中心的存储库相关联。docker注册表上的存储库的表示法是username/repository:tag
。
要标记图像,我们使用docker tag
命令 -
$ docker tag image username/repository:tag
例如,以下是我们如何标记Spring boot应用程序的本地映像 -
$ docker tag spring-boot-websocket-chat-demo callicoder/spring-boot-websocket-chat-demo:0.0.1-SNAPSHOT
请确保callicoder
在上述命令中将我的用户名替换为docker id。
标记完成后,您可以键入docker image ls
终端以查看新标记的图像 -
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
callicoder/spring-boot-websocket-chat-demo 0.0.1-SNAPSHOT 30ad8958ac67 23 hours ago 126MB
spring-boot-websocket-chat-demo latest 30ad8958ac67 23 hours ago 126MB
openjdk 8-jdk-alpine 224765a6bdbe 3 months ago 102MB
将图像推送到docker集线器
最后,docker push
像这样使用该命令将标记的图像推送到docker集线器 -
$ docker push callicoder/spring-boot-websocket-chat-demo:0.0.1-SNAPSHOT
再次,不要忘记callicoder
用您的码头ID 替换用户名。
就这样!镜像现在发布在码头集线器的以下链接 - https://hub.docker.com/r/callicoder/spring-boot-websocket-chat-demo/
将图像发布到Docker集线器后,任何人都可以拉出该镜像并在其环境中运行它。输入以下命令以拉出并运行我们刚刚推送到docker中心的计算机上的映像 -
$ docker run -p 5000:8080 callicoder/spring-boot-websocket-chat-demo:0.0.1-SNAPSHOT
如果该docker run
命令在本地不可用,则该命令将从Docker集线器中提取图像,然后运行它。
您看到与其他人分享您的镜像是多么容易。人们不需要安装任何软件来运行你的应用程序。他们只需要将镜像拖放到docker上即可运行。
您可以自动执行从Docker镜像构建到docker集线器发布的所有功能dockerfile-maven-plugin
。
pom.xml
使用以下配置将插件添加到文件中 -
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<!-- replace `callicoder` with your docker id-->
<repository>callicoder/spring-boot-websocket-chat-demo</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
<executions>
<execution>
<id>default</id>
<phase>install</phase>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
</plugin>
插件的配置包括远程存储库名称和存储库标签。请使用元素中的callicoder
泊坞窗ID 替换用户名<repository>
。
我们也在元素中传递JAR_FILE
参数<buildArgs>
。记得我们已经向ARG JAR_FILE
Dockerfile 添加了指令吗?这里传递的参数将覆盖该值。
这里是你如何使用docker-file-maven
插件构建docker镜像-
$ mvn package dockerfile:build
上面的命令首先以jar文件的形式打包应用程序,然后构建docker镜像。
最后,您可以使用dockerfile:push
命令将docker映像推送到docker注册表-
$ mvn dockerfile:push
现在,它进一步自动化,我们已经注册dockerfile:build
和dockerfile:push
目标落实到install
使用Maven构建生命周期阶段<executions>
的标签。
所以每当你运行mvn install
时,build
和push
目标dockerfile-maven-plugin
执行,你的搬运工图像建成并推向泊坞窗枢纽。
在dockerfile-maven-plugin
使用存储在任何配置文件中的认证信息~/.dockercfg
或~/.docker/config.json
到泊坞窗图像推送到码头工人的个人资料。这些配置文件是通过登录docker时创建的docker login
。
您也可以在maven settings.xml
或pom.xml
文件中指定验证细节。查看该插件的官方自述文件以获取更多信息。
我们在本文中停靠的应用程序非常简单。它不使用任何数据库或与其他服务进行通信。
附件中含上述spring boot项目下载
https://www.leftso.com/article/415.html