sprngboot应用docker化
点击「蓝色微信名」可快速关注
在本文中,我们将学习如何将springboot应用docker化,我们使用Maven基于springboot应用构建docker镜像,并从docker镜像中运行springboot应用程序。
1
创建springboot应用
创建springboot应用,并编写简单请求处理器:
@RestController @Slf4j public class IndexController { @GetMapping("/hello") public String hello() { log.info("print log ,string={}","hello"); return "hello"; } }
使用以下maven命令从项目根目录运行应用程序:
mvn spring-boot:run
使用命令行发送请求:
curl -X GET http://localhost:8080/hello
可以看到响应:
2
springboot应用docker化
上一步中我们已经创建了一个springboot应用,下一步是将其docker化,首先要安装docker,请遵循官方docker安装指南,此处不做赘述,我们将使用dockerfile构建镜像,制作一个应用程序的docker镜像可以方便的在内部服务器或者云服务器部署和扩展。
2.1:使用dockerfile构建镜像
docker是通过读取dockerfile中的指令来构建镜像,dockerfile是一个文本文件,包含构建镜像的命令,通过使用docker build命令,我们可以执行包含在dockerfile中的镜像构建指令。dockerfile的格式大致如下:
#comment INSTRUCTION arguments
指令中大小写不敏感,但是通常使用大写字母来区分指令和参数,从而提高可读性。在我们的案例中,dockerfile内容大致如下:
FROM java:8-jdk-alpine COPY ./target/demo39-docker-1.0-SNAPSHOT.jar /usr/app/ WORKDIR /usr/app ENTRYPOINT [“java”,”-jar”,”demo39-docker-1.0-SNAPSHOT.jar”]
下面是dockerfile中命令的描述。
dockerfile必须以“from”指令开头。我们使用这个关键字来指示Docker使用我们正在构建的基础镜像。后面是一个或多个参数,用于声明dockerfile中使用的参数。我们可以从头开始创建Docker镜像,或者使用Docker Hub中现有的映像。在我们的示例中,我们使用带有“8JDK-alpple”标签的“Java”镜像。该镜像是基于Java的 alpine Linux镜像,使用基于alpine的镜像的主要优点是增强了容器的安全性并减小了容器的大小,JDK的版本是8。
2.2:构建镜像
要创建docker映像,我们需要.jar文件。要生成JAR文件,需要运行:
mvn -U clean package
jar包构建成功后,将会在target目录下生成demo39-docker-1.0-SNAPSHOT.jar文件,然后我们可以使用docker build构建docker镜像,从包含dockerfile的目录中运行以下命令:
docker build -t sample-app .
-t 参数指定docker镜像的名称,`.`指定dockerfile的位置(当前目录)。生成的镜像存储在本地Docker注册表中,并用名称“sample-app”标记。
下面是构建过程的屏幕截图:
我们可以使用以下命令检查镜像是否存在:
docker images
我们可以使用docker run命令运行docker images。如我们所知,它隔离了每个容器,并且有一个环境,我们需要映射宿主机-8080的端口和容器-8080的端口,指定为-p 8080:8080参数来运行我们的应用程序。
docker run --rm -it -p 8080:8080 sample-app
要检查我们的springboot应用程序是否在Docker容器中运行,我们可以通过浏览器发送请求:http://localhost:8080/hello
至此,我们成功地使用dockerfile构建了docker镜像。
2.3:基于maven将springboot应用docker化
我们了解了如何编写一个简单的dockerfile,以及如何使用docker build命令构建我们的应用程序。但是,在使用本机构建方法的项目中可能会遇到一些问题:首先,在创建docker文件时,我们需要提供版本和jar名称。随着应用程序的发展,版本不断更新,在Docker文件中更新这一版本的开销也随之增加。这是早期方法中出现的一个问题。
前一种方法的另一个开销是,要运行docker命令,我们需要在终端中运行它,并且需要手动执行它。如果dockerfile是作为maven生命周期的一部分在内部创建的,允许我们在集成过程中构建图像,就可以避免这种开销。有一些maven插件随时可用,我们可以在pom.xml中进行配置,以便在内部创建dockerfile。然后,根据生成的dockerfile构建镜像。因此,我们避免了在终端中手动运行构建命令的开销。
比较常用的就是com.spotify/docker-maven-plugin maven插件,可以在我们的应用程序中使用。将这个插件包含在pom.xml文件中。我们的pom.xml如下所示:
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName> <dockerDirectory>${basedir}/</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
然后执行命令:
mvn package docker:build
检查是否成功生成镜像:
docker images
使用docker run --rm -it -p 8080:8080 springboot-demo39-docker命令运行镜像,并尝试在浏览器中访问http://localhost:8080/hello并且可以看到正确结果
注意
我们必须确保停止以前运行的使用端口8080的容器,以避免出现错误。我们使用以下命令来了解正在运行的容器:
docker ps
如果端口已经被占用,我们可以使用docker stop <CONTAINER ID> 或者 docker rm -f .命令关闭容器或者强制删除运行中的容器。
总结
在本文中,我们学习了对springboot应用程序进行docker化,并且了解了如何使用两种常用的方法使用Docker文件将我们的springboot应用程序构建成docker镜像,一种是基于dockerfile和原生docker命令,另一种方法使用Maven插件来构建Docker镜像。docker容器运行后,从请求发起到容器中应用程序接收处理的链路大致如下:
本文分享自 PersistentCoder 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!