前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Java完成对Docker的指南入门,第1部分

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

作者头像
February
修改2018-11-23 14:17:05
1.2K0
修改2018-11-23 14:17:05
举报
文章被收录于专栏:技术翻译技术翻译

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

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

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

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

Docker设置和安装

安装Docker

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

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

代码语言:javascript
复制
$ 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应用程序。

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

代码语言:javascript
复制
java -Dspring .profiles .active = default -jar target / spring-boot-ops.war

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

让我们在Docker中运行它。

构建并运行Docker应用程序

建立一个图像

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

首先,创建文件

代码语言:javascript
复制
# 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插件部分中有这个块:

代码语言:javascript
复制
<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>

然后,构建图像:

代码语言:javascript
复制
$ 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

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

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

代码语言:javascript
复制
$ 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容器

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

代码语言:javascript
复制
$ docker run -d  -p 8080:8080 spring-boot-app:latest
e9418201d112b15b94a489ab9995d966807a2171e844810567b110f2b9be01ec

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

看看正在运行的是什么:

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
# 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。

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

代码语言:javascript
复制
Status: Downloaded newer image for openjdk:8-jre-alpine

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

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

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
 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

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

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何管理和运行容器化的Java Spring Boot应用程序
  • Docker设置和安装
    • 安装Docker
      • Spring Boot应用程序
      • 构建并运行Docker应用程序
        • 建立一个图像
          • 运行Docker容器
          • Docker图像和容器
            • 集装箱
              • 图片
              相关产品与服务
              容器镜像服务
              容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档