Docker是一个用于在容器中打包,部署和运行应用程序的平台。它可以在支持该平台的任何系统上运行容器:开发人员的笔记本电脑,“本地”系统或云端无需修改的系统。Docker用于应用程序的图像是真正的跨平台。
Java 微服务是Docker的一个很好的目标。在容器中运行服务通过用于开发,测试和部署的公共目标平台来增强开发。容器也是迈向灵活且经济高效的云架构的第一步。
在本教程中,我们将打包一个Spring Boot应用程序,运行它,并查看用于管理图像和容器的不同命令。
首先,首先安装此处的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。
为了使教程专注于Docker,我们将使用现有项目,本Spring教程对此进行了解释。它是一个管理员工记录的小型Web应用程序。
您可以使用以下命令行运行应用程序:
java -Dspring .profiles .active = default -jar target / spring-boot-ops.war
它在http:// localhost:8080 / springbootapp / employees中提供单页:
让我们在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"]
Dockerfiles是Docker为构建映像而执行的命令列表。我们将仔细研究下面的这些命令。
在“干净”目录中构建映像是最佳实践,因为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 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。如果你再看一下上面的标题,你会看到你构建了一个图像,然后运行了一个容器。这个术语很重要。
简而言之,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》
译者:February
不代表云加社区观点,更多详情请查看原文链接
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。