leftso 3469 0 2018-04-19 20:31:22

文章位置:左搜> 编程技术> 正文

前言

    在本文中,您将学习如何构建用于运行Spring引导应用程序的Docker镜像。我首先给你一个docker的简要概念,然后我们将为我们的spring启动应用程序创建一个docker镜像,并在本地运行它。最后,我们会将码头图像推送到docker 中心库。
 

快速介绍Docker

Docker是一个软件平台,它使开发人员能够借助容器在任何地方开发,发布和运行应用程序。

现在什么是容器,码头工人用容器解决什么问题?

好吧,让我们通过提出几个问题来理解。以下任何一种情况对您而言都很熟悉?

  • “它在我的机器上运行!!”
  • “我认为你的Tomcat版本已经过时了!
  • “我不想在运行应用程序之前安装10个不同的库和工具。难道它不能以包装形式提供它需要的所有库和工具吗?“
  • “我们有用不同的语言,工具,系统库和环境编写的应用程序。我们可以在同一个基础架构上独立运行它们吗?“

我敢打赌他们中的一些人。

Docker通过为应用程序创建一个轻量级的独立可执行程序包来解决这些问题,该程序包包括运行代码,运行时,库,工具,环境和配置所需的一切。

这些独立的可执行程序包称为码头图像。而一个正在运行的Docker镜像实例称为码头容器

现在,这些容器图像可以在任何环境中的任何地方共享,发货和运行。无论他们运行的环境如何,他们的表现都完全一样。

docker简介

而且,您可以在同一个基础架构上运行多个完全不同配置的容器。所有容器都是完全隔离的,彼此独立运行。

很酷,不是吗?那么,让我们现在学习如何在Docker容器中运行Spring Boot应用程序。但在此之前,请继续在您的平台上安装Docker社区版

使用Docker的Spring Boot:Docker化Spring Boot应用程序

1.将应用程序下载到Dockerize

在本文中,我们将dockerize一个基于web套接字的群组聊天应用程序,这个应用程序是用spring引导的。

 

2.使用Dockerfile定义Docker镜像

转到应用程序的根目录并创建一个名为的新文件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的每一行来理解细节。

  • FROM:泊坞窗图像可以使用Docker注册表中可用的其他图像作为其基础或父图像。在上面的例子中,我们使用openjdk:8-jdk-alpine图像作为我们的基础图像。这是一个使用Alpine Linux的非常轻量级的OpenJDK 8运行时映像。(它非常适合小型Java微服务。)
  • LABEL:该LABEL指令用于向图像添加元数据。在上面的Dockerfile中,我们maintainer通过LABEL指令添加了一些关于图像的信息。
  • VOLUME:卷是一种机制,用于在主机操作系统上保留容器生成的数据,并使用容器共享主机操作系统中的目录。
  • VOLUME指令使用指定的路径在容器上创建一个安装点。运行容器时,可以指定给定安装点将映射到的Hot OS上的目录。之后,容器写入挂载路径的任何内容都将写入主机操作系统上的映射目录。
  • 卷最常见的用例之一是将容器生成的日志文件存储在主机操作系统上。例如,假设您的应用程序将日志文件写入某个位置/var/log/app.log
  • 您可以在Dockerfile中安装一个VOLUME带有路径的路径/var/log,然后在运行该容器时指定该安装点将映射到的主机操作系统上的目录。之后,您将能够从主机操作系统上的映射目录访问日志。
  • 在上面Dockerfile,我们创建了一个带有路径的挂载点,/tmp因为这是默认情况下Spring引导应用程序为Tomcat创建工作目录的地方。尽管这个spring引导应用程序并不需要它,因为谁在乎tomcat目录。但是如果你想存储诸如tomcat访问日志等东西,那么VOLUMES非常有用。
  • 您可以从官方文档中了解更多关于卷的信息
  • EXPOSE:顾名思义,这条指令允许你将某个端口暴露给外部世界。
  • ARGARG指令定义了一个默认值的变量。您可以通过在构建时传递它来覆盖该变量的默认值。
  • ARG <name>[=<default value>]
  • 一旦定义,该变量可以被其后的指令使用。
  • ADD:该ADD指令用于将新文件和目录复制到泊坞窗图像。
  • 入口点:这是配置应用程序在容器内执行的方式。
 

3.构建Docker镜像

现在我们已经定义了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镜像。

4.运行docker镜像

一旦你有一个docker镜像,你可以使用docker run像这样的命令来运行它-

$ docker run -p 5000:8080 spring-boot-websocket-chat-demo

在该run命令中,我们指定8080容器上的端口应映射到5000主机操作系统上的端口。

一旦应用程序启动,您应该可以访问它。http://localhost:5000

容器在前台运行,按下CTRL + C会停止它。现在让我们看看如何在后台运行容器。

在分离模式下在后台运行Docker镜像。

您可以使用命令中的-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

5.将docker镜像推送到docker hub中心库

现在让我们将码头图像推送到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/

6.从docker集线器中拉出镜像并运行它

将图像发布到Docker集线器后,任何人都可以拉出该镜像并在其环境中运行它。输入以下命令以拉出并运行我们刚刚推送到docker中心的计算机上的映像 -

$ docker run -p 5000:8080 callicoder/spring-boot-websocket-chat-demo:0.0.1-SNAPSHOT

如果该docker run命令在本地不可用,则该命令将从Docker集线器中提取图像,然后运行它。

您看到与其他人分享您的镜像是多么容易。人们不需要安装任何软件来运行你的应用程序。他们只需要将镜像拖放到docker上即可运行。

使用dockerfile-maven-plugin自动化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_FILEDockerfile 添加了指令吗?这里传递的参数将覆盖该值。

这里是你如何使用docker-file-maven插件构建docker镜像-

$ mvn package dockerfile:build

上面的命令首先以jar文件的形式打包应用程序,然后构建docker镜像。

最后,您可以使用dockerfile:push命令将docker映像推送到docker注册表-

$ mvn dockerfile:push

现在,它进一步自动化,我们已经注册dockerfile:builddockerfile:push目标落实到install使用Maven构建生命周期阶段<executions>的标签。

所以每当你运行mvn install时,buildpush目标dockerfile-maven-plugin执行,你的搬运工图像建成并推向泊坞窗枢纽。

dockerfile-maven-plugin使用存储在任何配置文件中的认证信息~/.dockercfg~/.docker/config.json到泊坞窗图像推送到码头工人的个人资料。这些配置文件是通过登录docker时创建的docker login

您也可以在maven settings.xmlpom.xml文件中指定验证细节。查看该插件官方自述文件以获取更多信息。

总结

我们在本文中停靠的应用程序非常简单。它不使用任何数据库或与其他服务进行通信。

附件中含上述spring boot项目下载