将您的 Java 应用程序 Docker 化
长按关注《Java学研大本营》,加入读者群,分享更多精彩 扫码关注《Java学研大本营》,加入读者群,分享更多精彩
随着每个人都转向 Kubernetes,知道如何对应用程序进行 Dockerize 是件好事。这是一个关于如何为 spring.io/guides 项目创建 Dockerfile、构建图像、将我们的图像推送到 dockerhub 以及在本地运行我们的容器化应用程序的小教程。

为什么是Docker?它解决了“它在我的机器上运行”的问题。你提供的不是罐子、战争等等——而是“图像”。
所有人都需要在他们的机器上运行你的“图像”是安装了 Docker。
这太棒了,因为以前的标准是交付工件,这意味着依赖于环境设置和安装的依赖项。但是现在,所有这些都以您的形象呈现!“它在我的机器上运行”现在已经不再是什么了。
我在 Mac 上工作,所以我将简要介绍一下我是如何设置的。如果您正在从事其他工作,那么这一切都非常适合谷歌。
首先,在https://cloud.docker.com/上创建一个帐户。导航到存储库部分。它当然是空的,但请注意这是我们将推送图像的地方。
然后我按照docker 网站上的说明安装 docker for mac。这很简单,但是你会得到一个像下面这样的鲸鱼:

看!左边的鲸鱼
无论如何,单击 whale 并使用您在 cloud.docker.com 上注册时创建的相同凭据登录。
接下来,通过在终端中使用以下命令检查运行来确保已安装 docker:
- $ docker --version
- Docker version 18.09.0-ce, build 4d60db4
厉害了,加油!
正如我在介绍中所说,我将克隆一个示例 spring.io/guides 应用程序。然后,我将构建 Dockerfile 以对这个 Java 应用程序进行 Docker 化。
继续并克隆“使用 Spring MVC 提供 Web 内容”项目:
git clone https://github.com/spring-guides/gs-serving-web-content.git
spring 指南中有几个项目隐藏在您克隆的内容中。请导航到已完成的项目并在此目录中添加一个名为Dockerfile
- cd ./complete
- touch Dockerfile
我也很高兴看到我用tree。 您的当前目录现在应该如下所示。
- .
- ├── Dockerfile
- ├── README.md
- ├── mvnw
- ├── mvnw.cmd
- ├── pom.xml
- └── src
- ├── main
- │ ├── java
- │ │ └── hello
- │ │ ├── Application.java
- │ │ └── GreetingController.java
- │ └── resources
- │ ├── static
- │ │ └── index.html
- │ └── templates
- │ └── greeting.html
- └── test
- └── java
- └── hello
- └── ApplicationTest.java
在我开始向 Dockerfile 添加命令之前,让我向您简要介绍一下 Dockerfile 的作用。
首先,Dockerfile 总是以另一个称为“基础图像”的图像开始。这是我们镜像的构建块,示例包括 red hat 镜像或 Ubuntu 镜像。这个图像可以像你喜欢的那样胖或瘦,因为我们可以向这个图像添加东西或构建“层”。
因此,如果您从已安装 Java 的映像开始,我们就不必稍后在 Dockerfile 中安装 Java。如果您不从已安装的映像开始,那么我们将必须安装 Java。最后,这个 Dockerfile 将被用来构建另一个镜像。这个最终图像(添加了所有依赖项和您的应用程序)可以交付给那些想要运行您的应用程序的人。
就像我刚才说的,我们必须选择一个图像作为开始。我将从 Ubuntu 开始。要制作我们的基本映像 Ubuntu,请添加以下行:
FROM ubuntu:latest
最新消息是什么?图片有标签。它们通常是版本,但“最新”将在 DockerHub 中拉取最新发布的 ubuntu 镜像。什么是 DockerHub?可供您使用的图像公共注册表!
现在我们需要安装一个依赖项,jre(在任何机器上运行 java 应用程序都需要它)。Dockerfiles 有一个RUN我们可以使用的命令,就像我们从命令行在 ubuntu 机器上安装 jre 一样。
- RUN \
- # Update
- apt-get update -y && \
- # Install Java
- apt-get install default-jre -y
太棒了,现在我们的图像已经安装了 java。
现在,我们的 jar 文件在哪里?如果你还记得我们的项目结构,我们在本地有一个 java 应用程序。让我们用mvn clean install. 这应该构建您的 java 应用程序并将 jar 放在您的./target/gs-serving-web-content-0.1.0.jar目录中。
现在我们知道jar我们的 Dockerfile 的相对路径,我们可以使用 Docker的ADD命令。
ADD ./target/gs-serving-web-content-0.1.0.jar spring-mvc-example.jar
此命令将本地./target/gs-serving-web-content-0.1.0.jar工件添加为spring-mvc-example.jar.
当我们的应用程序运行时,它在端口上运行8080。让我们使用 docker的EXPOSE命令打开那个端口。
EXPOSE 8080
最后,让我们运行罐子!使用docker的CMD命令运行我们的 jar。
CMD java -jar spring-mvc-example.jar
总之,您的 Dockerfile 应该如下所示:
- # Pull base image.
- FROM ubuntu:latest
-
- RUN \
- # Update
- apt-get update -y && \
- # Install Java
- apt-get install default-jre -y
-
- ADD ./target/gs-serving-web-content-0.1.0.jar spring-mvc-example.jar
-
- EXPOSE 8080
-
- CMD java -jar spring-mvc-example.jar
在这一点上,我希望您意识到 docker 的好处,因为我们可以控制运行应用程序的机器。
以前,我们会传递一个jar文件,并希望 jar 找到一个配置正确的地方。
我们现在可以使用它Dockerfile来生成一个image可以在任何支持 Docker 的环境中提供一致行为的工具。
我会重申,我们需要在此时构建我们的 jar。如果您尚未构建 java 项目,请立即构建:
- java -version
- mvn --version
- mvn clean install
要使用名称构建图像spring-mvc-sample-image:
- $ docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- spring-mvc-sample-image latest 8fa27ad00edd 34 minutes ago 540MB
现在,让我们调出一个sample-mvc-sample-container基于您的图像调用的容器spring-mvc-sample-image。
docker run -t -p 8080:8080 --name sample-mvc-sample-container spring-mvc-sample-image
您可以添加-d到 docker run 命令以在后台运行容器。但是,如果您运行上面的命令(使用-t),您会发现自己在容器中(并看到 Spring 应用程序日志)。使用 -t,您应该会看到表明应用程序正确启动的日志。使用 -d,您将可以使用命令docker ps -a来查找您的容器并docker logs 查看 Spring 应用程序日志。
用ctrl + c退出容器。现在命令docker ps -a。
- $ docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 736f9cdc1499 spring-mvc-sample-image "/bin/sh -c 'java -j…" 2 hours ago Up 2 hours 8080/tcp sample-mvc-sample-container
这是你的容器!启动并运行。就在那儿,您有一台运行 Java 应用程序的 ubuntu 机器。如果你想回到运行你的 java 应用程序的容器中,命令docker exec -it 。
首先,列出图像并找到您构建的图像
- $ docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- spring-mvc-sample-image latest 8fa27ad00edd 34 minutes ago 540MB
接下来,通过获取图像 ID(8fa27ad00edd)并使用您的 docker 用户名和您选择的名称标记图像来标记图像。我的 docker 用户名是gsweene2,我用它标记的名称是gsweene2/spring-mvc-sample-image:0.1。docker 标签由 name和 version组成,由 : 分隔。
docker tag 8fa27ad00edd gsweene2/spring-mvc-sample-image:0.1
最后,推!使用与标记图像相同的名称,例如gsweene2/spring-mvc-sample-image:0.1.
docker push gsweene2/spring-mvc-sample-image:0.1
登录后,您应该能够在 cloud.docker.com 上找到它,但 URL 模式似乎是:
https://cloud.docker.com/repository/docker//

《项目驱动零起点学Java》共分 13 章,围绕 6 个项目和 258 个代码示例,分别介绍了走进Java 的世界、变量与数据类型、运算符、流程控制、方法、数组、面向对象、异常、常用类、集合、I/O流、多线程、网络编程相关内容。《项目驱动零起点学Java》总结了马士兵老师从事Java培训十余年来经受了市场检验的教研成果,通过6 个项目以及每章的示例和习题,可以帮助读者快速掌握Java 编程的语法以及算法实现。扫描每章提供的二维码可观看相应章节内容的视频讲解。
《项目驱动零起点学Java》贯穿6个完整项目,经过作者多年教学经验提炼而得,项目从小到大、从短到长,可以让读者在练习项目的过程中,快速掌握一系列知识点。
马士兵,马士兵教育创始人,毕业于清华大学,著名IT讲师,所讲课程广受欢迎,学生遍布全球大厂,擅长用简单的语言讲授复杂的问题,擅长项目驱动知识的综合学习。马士兵教育获得在线教育“名课堂”奖、“最受欢迎机构”奖。
赵珊珊,从事多年一线开发,曾为国税、地税税务系统工作。拥有7年一线教学经验,多年线上、线下教育的积累沉淀,培养学员数万名,讲解细致,脉络清晰。
链接: https://u.jd.com/XwJWF2r
精彩回顾
长按关注《Java学研大本营》
长按二维码,加入Java读者群
扫码关注《Java学研大本营》,加入读者群,分享更多精彩