将您的 Java 应用程序 Docker 化
长按关注《Java学研大本营》,加入读者群,分享更多精彩 扫码关注《Java学研大本营》,加入读者群,分享更多精彩
随着每个人都转向 Kubernetes,知道如何对应用程序进行 Dockerize 是件好事。这是一个关于如何为 spring.io/guides 项目创建 Dockerfile、构建图像、将我们的图像推送到 dockerhub 以及在本地运行我们的容器化应用程序的小教程。
快速了解 Docker
为什么是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
厉害了,加油!
克隆示例 Java 应用程序
正如我在介绍中所说,我将克隆一个示例 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
关于 Docker 的另一种说法
在我开始向 Dockerfile 添加命令之前,让我向您简要介绍一下 Dockerfile 的作用。
首先,Dockerfile 总是以另一个称为“基础图像”的图像开始。这是我们镜像的构建块,示例包括 red hat 镜像或 Ubuntu 镜像。这个图像可以像你喜欢的那样胖或瘦,因为我们可以向这个图像添加东西或构建“层”。
因此,如果您从已安装 Java 的映像开始,我们就不必稍后在 Dockerfile 中安装 Java。如果您不从已安装的映像开始,那么我们将必须安装 Java。最后,这个 Dockerfile 将被用来构建另一个镜像。这个最终图像(添加了所有依赖项和您的应用程序)可以交付给那些想要运行您的应用程序的人。
构建 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 的第三个词
在这一点上,我希望您意识到 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 <container_id>
查看 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 <container-id> /bin/bash
。
最后,标记并推送 Image 到公共 Dockerhub
首先,列出图像并找到您构建的图像
$ 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
在 DockerHub 中找到您的镜像
登录后,您应该能够在 cloud.docker.com 上找到它,但 URL 模式似乎是:
https://cloud.docker.com/repository/docker//<image_name>
推荐书单
《项目驱动零起点学Java》
《项目驱动零起点学Java》共分 13 章,围绕 6 个项目和 258 个代码示例,分别介绍了走进Java 的世界、变量与数据类型、运算符、流程控制、方法、数组、面向对象、异常、常用类、集合、I/O流、多线程、网络编程相关内容。《项目驱动零起点学Java》总结了马士兵老师从事Java培训十余年来经受了市场检验的教研成果,通过6 个项目以及每章的示例和习题,可以帮助读者快速掌握Java 编程的语法以及算法实现。扫描每章提供的二维码可观看相应章节内容的视频讲解。
《项目驱动零起点学Java》贯穿6个完整项目,经过作者多年教学经验提炼而得,项目从小到大、从短到长,可以让读者在练习项目的过程中,快速掌握一系列知识点。
马士兵,马士兵教育创始人,毕业于清华大学,著名IT讲师,所讲课程广受欢迎,学生遍布全球大厂,擅长用简单的语言讲授复杂的问题,擅长项目驱动知识的综合学习。马士兵教育获得在线教育“名课堂”奖、“最受欢迎机构”奖。
赵珊珊,从事多年一线开发,曾为国税、地税税务系统工作。拥有7年一线教学经验,多年线上、线下教育的积累沉淀,培养学员数万名,讲解细致,脉络清晰。
链接: https://u.jd.com/XwJWF2r
精彩回顾
部署Spring Boot应用程序
Java Spring Boot 3.0.0 RC1 震撼登场!
长按关注《Java学研大本营》
长按二维码,加入Java读者群
扫码关注《Java学研大本营》,加入读者群,分享更多精彩