原文: https://howtodoinjava.com/library/docker-hello-world-example/

Docker 是用于将应用程序及其运行时环境打包在一起的开发人员工具,因此任何人都可以在任何其他计算机上部署和运行它们,而不会遇到运行时环境冲突。 它与虚拟机概念(虚拟化)非常相似,在虚拟机概念中,您可以获取 VM 映像并在任何支持的硬件上运行它。 VM 中的所有内部程序将按其原始打包的方式运行。

VM 和 docker 映像之间的区别是 docker 映像不打包整个虚拟操作系统。 就像开发人员计算机中的其他进程一样,它使用 OS 资源,仅打包应用程序,并且打包其特定于运行时的依赖项(容器化)。

Docker 的 Hello World 示例 - 图1

虚拟化 vs 容器化

Docker 允许用户发布 docker 映像并使用其他人在 Docker Hub 等存储库中发布的映像。

在本教程中,学习在 Windows 中在 Windows 中安装 Docker 容器,创建 Docker 映像部署 Docker 映像(作为一个简单的基于 spring boot 的微服务)。 开发人员机器。

Docker 安装

要在 Windows 7 计算机上安装 docker,请按照以下步骤操作:

为您的系统选择合适的 Docker 安装程序

在开始安装过程之前,我们需要了解适合您所使用 Windows 的确切 Docker 版本。 Docker 提供了以下两个版本的 Windows 发行版

我们将按照本文的 Docker 工具箱安装步骤进行操作。

下载 Docker 安装程序

我们首先需要从 https://download.docker.com/win/stable/DockerToolbox.exe 下载 Docker 工具箱发行版,然后按照本地工作站中的安装步骤进行操作。

启用硬件虚拟化技术

为了使 Docker 工具箱正常工作,我们需要确保您的 Windows 系统支持硬件虚拟化技术并且已启用虚拟化。 Docker 在此处提供了详细的步骤: https://docs.docker.com/toolbox/toolbox_install_windows/#step-1-check-your-version。 如果未启用此功能,则需要转到 BIOS 选项并启用“硬件虚拟化”。 对于不同型号的计算机,BIOS 有所不同,因此请按照官方指南启用它。

运行 Docker 安装程序

一旦下载了安装程序并启用了硬件虚拟化,就可以启动安装程序。 就像安装向导指导下的另一个基于 Windows 的简单安装过程一样。

验证您的安装

验证 docker 安装,请从“桌面”或“开始”菜单中打开 Docker Quickstart Terminal 快捷方式。 验证 Docker 提示即将到来,然后需要测试一些基本命令。 Docker 提示和示例 docker 命令将如下所示。

Docker 的 Hello World 示例 - 图2

Docker 安装验证

记下 Docker IP

现在,我们需要记下分配给该容器的 Docker IP。 我们将访问此 IP,以访问 Docker 内部安装的应用程序。 要从命令提示符处了解 IP,请使用命令docker-machine ip。 这是命令的示例输出。 请注意,此 IP 对于不同的 M / C 将有所不同。

Docker 的 Hello World 示例 - 图3

docker 机器 IP 输出

创建 Docker Windows 映像

我们将首先创建基于 Spring Boot 的 REST API,添加特定于 docker 的配置,然后创建 docker 映像。

创建 Spring REST 项目

开发一个简单的 hello world 微服务进行测试。 我们使用 Spring BootMaven 和 Eclipse 作为 IDE。 添加 REST 端点,以便将该应用程序部署到 Docker 之后,我们可以通过访问其余端点来对其进行测试。

  1. package com.example.howtodoinjava.hellodocker;
  2. import java.util.Date;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.web.bind.annotation.PathVariable;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. @SpringBootApplication
  9. public class HelloDockerApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(HelloDockerApplication.class, args);
  12. }
  13. }
  14. @RestController
  15. class HelloDockerRestController {
  16. @RequestMapping("/hello/{name}")
  17. public String helloDocker(@PathVariable(value = "name") String name) {
  18. String response = "Hello " + name + " Response received on : " + new Date();
  19. System.out.println(response);
  20. return response;
  21. }
  22. }

使用服务器端口信息更新resources/application.properties

  1. server.port = 9080

现在,通过将项目作为 Spring Boot 应用程序运行来测试此微服务。

添加 Docker 配置

现在在根目录中创建一个名为Dockerfile的文件,并将以下几行添加为 Docker 配置。

  1. FROM openjdk:8-jdk-alpine
  2. VOLUME /tmp
  3. ADD target/hello-docker-0.0.1-SNAPSHOT.jar hello-docker-app.jar
  4. ENV JAVA_OPTS=""
  5. ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /hello-docker-app.jar" ]

Docker 在创建映像时使用它。 基本上是在声明 Java 运行时信息和目标分发。 有关更多详细信息,请遵循 docker 构建器参考

添加 Maven Docker 插件

pom.xml文件中添加两个 maven 插件,以便我们在创建实例时可以使用与 Docker 相关的 maven 命令。 这些插件是dockerfile-maven-pluginmaven-dependency-plugin

我们使用了构建项目所需的最少配置。

  1. <plugin>
  2. <groupId>com.spotify</groupId>
  3. <artifactId>dockerfile-maven-plugin</artifactId>
  4. <version>1.3.4</version>
  5. <configuration>
  6. <repository>${docker.image.prefix}/${project.artifactId}</repository>
  7. </configuration>
  8. </plugin>
  9. <plugin>
  10. <groupId>org.apache.maven.plugins</groupId>
  11. <artifactId>maven-dependency-plugin</artifactId>
  12. <executions>
  13. <execution>
  14. <id>unpack</id>
  15. <phase>package</phase>
  16. <goals>
  17. <goal>unpack</goal>
  18. </goals>
  19. <configuration>
  20. <artifactItems>
  21. <artifactItem>
  22. <groupId>${project.groupId}</groupId>
  23. <artifactId>${project.artifactId}</artifactId>
  24. <version>${project.version}</version>
  25. </artifactItem>
  26. </artifactItems>
  27. </configuration>
  28. </execution>
  29. </executions>
  30. </plugin>

创建 Docker 映像

现在使用 maven 命令mvn clean install dockerfile:build创建 docker 镜像。

Docker 的 Hello World 示例 - 图4

从 Docker 终端构建 Docker 映像

请确保在构建映像时本地应用程序未运行,在这种情况下,您可能会遇到 maven 构建失败的情况,因为在干净的步骤中,由于 Java 进程正在使用 jar,因此它将无法删除目标文件夹。

这是 Maven 输出日志在其中构建映像的最后几行。

  1. [INFO] Image will be built as hello-howtodoinjava/hello-docker:latest
  2. [INFO]
  3. [INFO] Step 1/5 : FROM openjdk:8-jdk-alpine
  4. [INFO] Pulling from library/openjdk
  5. [INFO] Digest: sha256:2b1f15e04904dd44a2667a07e34c628ac4b239f92f413b587538f801a0a57c88
  6. [INFO] Status: Image is up to date for openjdk:8-jdk-alpine
  7. [INFO] ---> 478bf389b75b
  8. [INFO] Step 2/5 : VOLUME /tmp
  9. [INFO] ---> Using cache
  10. [INFO] ---> f4f6473b3c25
  11. [INFO] Step 3/5 : ADD target/hello-docker-0.0.1-SNAPSHOT.jar hello-docker-app.jar
  12. [INFO] ---> ce7491518508
  13. [INFO] Removing intermediate container c74867501651
  14. [INFO] Step 4/5 : ENV JAVA_OPTS ""
  15. [INFO] ---> Running in f7cd27710bf3
  16. [INFO] ---> 086226135205
  17. [INFO] Removing intermediate container f7cd27710bf3
  18. [INFO] Step 5/5 : ENTRYPOINT sh -c java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /hello-docker-app.jar
  19. [INFO] ---> Running in 9ef14a442715
  20. [INFO] ---> bf14919a32e2
  21. [INFO] Removing intermediate container 9ef14a442715
  22. [INFO] Successfully built bf14919a32e2
  23. [INFO] Successfully tagged hello-howtodoinjava/hello-docker:latest
  24. [INFO]
  25. [INFO] Detected build of image with id bf14919a32e2
  26. [INFO] Building jar: F:\Study\Technical Writings\docker\hello-docker\target\hello-docker-0.0.1-SNAPSHOT-docker-info.jar
  27. [INFO] Successfully built hello-howtodoinjava/hello-docker:latest
  28. [INFO] ------------------------------------------------------------------------
  29. [INFO] BUILD SUCCESS
  30. [INFO] ------------------------------------------------------------------------

部署并运行 Docker 映像

因此,我们创建了 Docker 映像(即hello-docker-0.0.1-SNAPSHOT-docker-info.jar)。 我们还在本地计算机上运行了一个已安装的 docker 容器。

现在,要在已安装的 Docker 容器中运行 docker 映像,我们将使用以下命令。

  1. docker run -p 8080:9080 -t hello-howtodoinjava/hello-docker --name hello-docker-image

在这里,选项-p 8080:9080很重要。 它表示将端口8080暴露为内部端口9080。 请记住,我们的应用程序正在 Docker 映像内的端口9080中运行,我们将从 Docker 容器外部的端口8080中对其进行访问。

现在,使用 URL http://192.168.99.100:8080/hello/sajal访问该应用程序。 请注意,浏览器输出与localhost上独立 REST API 的输出相同。

Docker 的 Hello World 示例 - 图5

Docker Localhost 输出

停止 Docker 容器

我们可以在终端中通过命令docker ps列出所有 docker 容器,并且可以使用命令docker stop <name>

Docker 的 Hello World 示例 - 图6

停止 Docker 容器

总结

我们学会了在 Windows OS 中安装 Docker。 我们还学习了使用一个 REST 端点创建一个 spring boot 项目并为其构建 Docker 映像。 然后,我们学习了在 docker 容器中运行 docker 镜像,并在 docker 镜像中测试了 REST 端点。

Docker 是一个非常酷的工具,可以解决非常老的开发人员问题,“它可以在我的本地计算机上工作”。 现在,如果您的计算机可以正常运行,那么您当然也可以在其他计算机上运行它。

下载源码

学习愉快!