使用Java完成对Docker的指南入门,第1部分

如何管理和运行容器化的Java Spring Boot应用程序

Docker是一个用于在容器中打包,部署和运行应用程序的平台。它可以在支持该平台的任何系统上运行容器:开发人员的笔记本电脑,“本地”系统或云端无需修改的系统。Docker用于应用程序的图像是真正的跨平台。

Java 微服务是Docker的一个很好的目标。在容器中运行服务通过用于开发,测试和部署的公共目标平台来增强开发。容器也是迈向灵活且经济高效的云架构的第一步。

在本教程中,我们将打包一个Spring Boot应用程序,运行它,并查看用于管理图像和容器的不同命令。

Docker设置和安装

安装Docker

首先,首先安装此处的Docker桌面工具。下载适用于您的操作系统的正确安装程序,然后按照说明进

接下来,使用以下两个命令验证安装:

$ docker --version
Docker version 18.03.1-ce, build 9ee9f40
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9bb5a5d4561a: Pull complete
Digest: sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
....

第一个命令检查docker的版本。您的版本可能会有所不同,具体取决于您的平台。

Docker run hello-world 它听起来像什么 - 它运行一个名为hello-world的图像。

首先,它在本地系统上查找此图像。由于它不在那里,它从Docker Hub下载。然后它运行容器,它显示一条消息告诉我们一切正常,然后它说明了运行图像所需的过程。

Docker寻找hello-world图像的本地副本。由于它不存在,它去了Docker Hub并下载了最新的图像。图像完全下载后,它会在容器中运行hello-world

Spring Boot应用程序

为了使教程专注于Docker,我们将使用现有项目,本Spring教程对此进行了解释。它是一个管理员工记录的小型Web应用程序。

您可以使用以下命令行运行应用程序:

java -Dspring .profiles .active = default -jar target / spring-boot-ops.war

它在http:// localhost:8080 / springbootapp / employees中提供单页:

让我们在Docker中运行它。

构建并运行Docker应用程序

建立一个图像

创建具有Dockerfile图像其中列出了在软件包的组件和命令。

首先,创建文件

# Alpine Linux with OpenJDK JRE
FROM openjdk:8-jre-alpine
# copy WAR into image
COPY spring-boot-app-0.0.1-SNAPSHOT.war /app.war 
# run application with this command line 
CMD ["/usr/bin/java", "-jar", "-Dspring.profiles.active=default", "/app.war"]

DockerfilesDocker为构建映像而执行的命令列表。我们将仔细研究下面的这些命令。

在“干净”目录中构建映像是最佳实践,因为docker build的默认行为是将工作目录复制到映像。将此文件放在名为docker的项目顶部的新文件夹中。

您不能在Dockerfiles中使用相对路径,因此您需要修改pom.xml以将war文件放在目标目录中。

接下来,将输出目录属性添加到spring-boot-maven-plugin。

这将jar 作为构建目标的一部分复制到docker目录中。确保你的pom.xml插件部分中有这个块:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
            <configuration>
                <mainClass>com.stackify.Application</mainClass>
                <outputDirectory>${project.basedir}/docker</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

然后,构建图像:

$ docker build -t spring-boot-app:latest .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM openjdk:8-jre-alpine
8-jre-alpine: Pulling from library/openjdk
ff3a5c916c92: Pull complete
a8906544047d: Pull complete
a790ae7377b0: Pull complete
Digest: sha256:795d1c079217bdcbff740874b78ddea80d5df858b3999951a33871ee61de15ce
Status: Downloaded newer image for openjdk:8-jre-alpine
 ---> c529fb7782f9
Step 2/3 : COPY target/spring-boot-app-0.0.1-SNAPSHOT.war /app.war
 ---> d19bfa9fdfa7
Step 3/3 : CMD ["/usr/bin/java", "-jar", "-Dspring.profiles.active=default", "/app.war"]
 ---> Running in 04bf7e97079a
Removing intermediate container 04bf7e97079a
 ---> 04872b157605
Successfully built 04872b157605
Successfully tagged spring-boot-app:latest

我将介绍该文件的内容以及在初始映像运行后在构建期间发生的情况。

最后,您可以查看构建结果:

$ docker image ls
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
spring-boot-app            latest              04872b157605        28 seconds ago      128MB
openjdk                    8-jre-alpine        c529fb7782f9        3 days ago          82MB

Docker image ls列出我们系统上的图像。您的新映像在那里,名为spring-boot-app,如build命令中所指定。您还将看到OpenJDK的,码头工人作为构建过程的一部分创建的。

运行Docker容器

现在在容器中运行应用程序:

$ docker run -d  -p 8080:8080 spring-boot-app:latest
e9418201d112b15b94a489ab9995d966807a2171e844810567b110f2b9be01ec

将Web浏览器指向http:// localhost:8081 / springbootapp / employees,您将看到员工记录。

看看正在运行的是什么:

$ docker ps
IMAGE                             STATUS              PORTS                    NAMES
spring-boot-app:latest            Up 2 minutes        0.0.0.0:8080->8080/tcp   eloquent_varaham

Docker ps 显示主机上正在运行的容器。

我们看到容器正在运行!你有一个在Docker上运行的Spring Boot应用程序。

运行此容器的命令行有三个参数:

  • -d - 作为守护程序进程运行并从控制台分离。
  • -p - 将主机上的端口8080映射到容器中的端口8080。
  • spring-boot-app:最新名称:要运行的映像的标记。

Docker图像和容器

如果你再看一下上面的标题,你会看到你构建了一个图像,然后运行了一个容器。这个术语很重要。

集装箱

简而言之,Docker在容器中运行应用程序。请务必注意,这些容器不会运行,也不会运行虚拟机。它们在Linux上运行并相互共享主机系统的内核。非Linux平台(如macOS和Windows 10)上的实现使用Linux虚拟机来实现Docker运行时。

在容器内部,应用程序彼此隔离,并与底层基础架构隔离。每个容器都有一个虚拟文件系统,似乎有自己的内核。这简化了应用程序打包,应用程序的问题被隔离到容器中,保护了机器的其余部分。

图片

图像包含运行容器所需的一切。“Everything”不仅包括应用程序的代码和库,还包括操作系统。

让我们再看看我们的Dockerfile

# Alpine Linux with OpenJDK JRE
FROM openjdk:8-jre-alpine
# copy fat WAR
COPY spring-boot-app-0.0.1-SNAPSHOT.war /app.war
# runs application
CMD ["/usr/bin/java", "-jar", "-Dspring.profiles.active=default", "/app.war"]

第一行告诉docker从哪里开始建造; 来自openjdk:8-jre-alpine。这是在Alpine Linux上提供OpenJDK JRE的现有映像的名称。Alpine Linux为运行Java应用程序提供了轻量级,安全且快速的容器。

下一行将Web jar复制到映像文件系统的根目录。Dockerfile可以包含多个COPY指令,它可以用于复制整个文件树。

最后一行是将执行以启动容器的命令。CMD 接受构成命令行的字符串数组,类似于Runtime.exec。

构建此图像时,我们在构建输出中看到了这一点:

Status: Downloaded newer image for openjdk:8-jre-alpine

Docker将该图像作为构建的一部分进行检索,然后将其余文件应用于该图像。

您可以查看构建任何图像所采取的步骤列表:

$ docker history spring-boot-app:latest
IMAGE               CREATED BY                                      SIZE  
fb9139a8c8b8        /bin/sh -c #(nop)  CMD ["/usr/bin/java" "-ja...   0B
d19bfa9fdfa7        /bin/sh -c #(nop) COPY file:f4a155b9ed7a8924...   46.2MB
c529fb7782f9        /bin/sh -c set -x  && apk add --no-cache   o...   77.8MB
<missing>           /bin/sh -c #(nop)  ENV JAVA_ALPINE_VERSION=8...   0B
<missing>           /bin/sh -c #(nop)  ENV JAVA_VERSION=8u151       0B
<missing>           /bin/sh -c #(nop)  ENV PATH=/usr/local/sbin:...   0B
<missing>           /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/lib/jv...   0B
<missing>           /bin/sh -c {   echo '#!/bin/sh';   echo 'set...   87B
<missing>           /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B
<missing>           /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
<missing>           /bin/sh -c #(nop) ADD file:093f0723fa46f6cdb...   4.15MB

此输出是图像列表。最后八个“丢失”了它们的图像ID,因为它们不在您的系统中。

然而,前三名确实有ID。这些图像的“created by”列显示了我们构建中的哪个步骤创建了它们:

  • CMD -来自Dockerfile的指令
  • COPY -将我们的jar复制到图像中。
  • apk -安装openjre软件包的Alpine Linux软件包工具 。

运行docker history -no-trunc spring-boot-app:latest 以提供完整的命令。输出太宽,无法在此显示。

再次查看docker image ls

 docker image ls
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
spring-boot-app            latest              fb9139a8c8b8        12 hours ago        128MB
openjdk                    8-jre-alpine        c529fb7782f9        4 days ago          82MB

有两个图像:你的和openjdk。他们的ID与我们历史上第一和第三张图像的ID相匹配。第二张图像是中间阶段,不存在。

Openjdk仍然存在于您的系统中,而spring-boot-app作为一组差异存在于基本映像中。Docker将图像和容器作为图层进行管理,从而节省内存和磁盘空间。

原文标题《A Start to Finish Guide to Docker With Java, Part 1》

作者:Eugen Paraschiv

译者:February

不代表云加社区观点,更多详情请查看原文链接

原文链接:https://dzone.com/articles/a-start-to-finish-guide-to-docker-with-java

原文作者:Eugen Paraschiv

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java 源码分析

Docker 入门

2576
来自专栏从零学习云计算

kubernetes学习记录(3)——集群外部访问Pod或Service

学习阅读的书籍为《kubernetes权威指南:从Docker到Kubernetes实践全接触》,书中有不少地方讲的比较模糊,故在此做下学习过程中的梳理。 Po...

3950
来自专栏圣杰的专栏

.NET Core容器化@Docker

温馨提示:本文适合动手演练,效果更佳。 ?  1. 引言 我们知道. NET Core最大的特性之一就是跨平台,而对于跨平台,似乎大家印象中就是可以在非Wi...

3017
来自专栏编程坑太多

『中级篇』docker 使用bind Mounting实战(36)

PS:通过这个例子我想到了,我做java开发的可以吧对应的tomcat里面的webapp下的关联容器外部,容器内就跑tomcat 连接容器外的文件app 就可以...

1024
来自专栏史上最简单的Spring Cloud教程

史上最简单的SpringCloud教程 | 第十一篇: docker部署spring cloud项目

一、docker简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地...

4666
来自专栏Hongten

python开发_tarfile_文档归档压缩|解压缩

如果在你计算机的c:\\test目录下面没有temp目录,系统会自动创建该目录:c:\\test\\temp

1002
来自专栏漫漫全栈路

Docker 初次见面

Docker没有官方中文文档(至少目前为止没有,2018/1/1),所以只能通过搜索引擎加上我自己的了解来说一下。

4318
来自专栏云计算教程系列

如何在Ubuntu 14.04上安装和使用Docker Compose

Docker是一个很棒的工具,但要真正充分发挥其潜力,最好是应用程序的每个组件都在自己的容器中运行。对于具有大量组件的复杂应用程序,编排所有容器以一起启动和关闭...

4121
来自专栏耕耘实录

Docker初体验,创建并导出第一个本地镜像

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

1383
来自专栏我的小碗汤

搭建个私有docker镜像仓库

但是这个私有仓不能满足我们的需求,生产线上万一该私有仓服务器故障,其他服务器也无法接管。再者,也没有页面可以便于管理。

5873

扫码关注云+社区

领取腾讯云代金券