云计算正当时!将你的Java项目容器化

news2024/11/26 16:42:00

将您的 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 标签由 nameversion组成,由 : 分隔。

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学研大本营》,加入读者群,分享更多精彩

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IPv6转换难点分析之一:国家监测指标-中科三方

从IPv4过渡到IPv6就像是“打破一个旧世界&#xff0c;创建一个新世界”&#xff0c;注定要经历一个长期的过程&#xff0c;但终究会实现。 一、IPv6过渡转换的障碍 目前互联网上还是以IPv4设备为主&#xff0c;不可能迅速过渡到IPv6&#xff0c;这主要受制于以下几个方面: &…

Nat. Mach. Intell2021 | MolCLR+:基于GNN的分子表征对比学习

原文标题&#xff1a;Molecular Contrastive Learning of Representations via Graph Neural Networks 代码&#xff1a;https://github.com/yuyangw/MolCLR 一、问题提出 首先&#xff0c;分子信息难以完全表示。例如&#xff0c;基于字符串的表示&#xff0c;如SMILES和SE…

未来展望:Starday供应链火力全开,为跨境电商再添动力!

2022年末将至&#xff0c;回顾这“命途多舛”的一年&#xff0c;也是令人非常唏嘘。近日&#xff0c;联合国发布《2022年年中世界经济形势与展望》报告&#xff0c;该报告指出正处于疫情恢复期的全球经济可能又到了一场新危机的边缘。据相关统计显示&#xff0c;2022年相比于20…

HttpServlet学习中的常见问题(个人珍藏笔记)

目录 一、HttpServlet 1.1核心方法 1.2、面试&#xff1a;谈谈Servlet的生命周期 二、HttpServletRequest 2.1、核心方法 2.2、如何获取请求头 三、HttpServletResponse 3.1核心方法 四、setCharacterEncoding和setContentType区别&#xff1f; 五、Json格式的转换问题…

串行通讯协议,只需要一文就可以给你讲懂

前言 最近在做一个通过ESP8266和STM32通讯从而实现远程控制&#xff0c;中间需要用到串口来发送报文&#xff0c;通过报文来实现两者之间的通讯。 今天刚好趁着这个机会来给大家讲解一下串行通讯&#xff0c;希望能给大家以后的学习提供一些思路。 串行通讯介绍 串口通信线…

磨金石教育摄影干货分享|怎样拍出唯美有内涵的“中国风”照片

之前有网友私聊我&#xff0c;说这两年很多人都在拍中国元素的照片&#xff0c;他们的照片不仅仅是对古建筑简单的拍摄&#xff0c;照片的内容拥有丰富的文化内涵。想问我这样的照片应该怎么拍才能达到有内涵的水平。 其实这个问题确实有一定的难度&#xff0c;每个人都有自己…

腾格尔成影视圈的香饽饽,十月天传媒正式邀请演唱主题曲

俗话说&#xff1a;姜还是老的辣&#xff0c;酒还是陈酿好。这句话用到音乐人腾格尔身上&#xff0c;就再贴切不过了。说起音乐人腾格尔&#xff0c;这位来自草原的雄鹰和苍狼&#xff0c;有很多部音乐作品&#xff0c;都被歌迷朋友们一直传唱。 如今的腾格尔老师&#xff0c;已…

六.初阶指针

前言&#xff1a;大家好哇&#xff01;今天带大家认识下C语言中的指针&#xff0c;指针的用法等&#xff0c;希望对大家有所帮助&#xff01; 目录 一.指针是什么 1.指针是什么&#xff1f; 2.如何理解指针变量 二.指针和指针的类型 1.指针类型 2.指针类型的意义 &#x…

http 跨域资源共享详解

http 跨域资源共享详解 由于浏览器同源策略限制&#xff0c;会导致出现跨域问题。而跨域资源共享&#xff08;CORS&#xff09;可以突破浏览的同源策略的限制&#xff0c;不过需要服务端配合设置相应的响应头&#xff0c;从而使跨源数据传输得以安全进行。 跨域资源共享新增了…

进销存软件对中小型企业管理有什么作用?

进销存软件对中小型企业管理有什么作用&#xff1f; 01 更加有序 库存不乱单据不乱价格不乱 使用进销存软件可以把这些都记录下来&#xff0c;有条不紊&#xff0c;出现什么问题也有据可查&#xff0c;不像纸质单据&#xff0c;会丢会坏&#xff0c;乱成一团。 02 能打印正式…

[Spring Cloud] Hystrix通过配置文件统一设置参数/与OpenFeign结合使用

✨✨个人主页:沫洺的主页 &#x1f4da;&#x1f4da;系列专栏: &#x1f4d6; JavaWeb专栏&#x1f4d6; JavaSE专栏 &#x1f4d6; Java基础专栏&#x1f4d6;vue3专栏 &#x1f4d6;MyBatis专栏&#x1f4d6;Spring专栏&#x1f4d6;SpringMVC专栏&#x1f4d6;SpringBoot专…

网站favion.ico图标

Favicon.ico一般用于作为缩略的网站标志&#xff0c;它显示在浏览器的地址栏或者标签上。 目前主要的浏览器都支持favicon.ico图标 一 制作favicon图标 1 把品优购图标切成png图片 2 把png图片转换为ico图标&#xff0c;这需要借助第三方转换网站&#xff0c;例如&#xff1…

刷题经验分享(一)

文章目录删除公共字符&#xff1a;组队竞赛&#xff1a;删除公共字符&#xff1a; 第一题&#xff1a;删除公共字符 方法一&#xff1a; 思路&#xff1a; 1.将第二个字符串的字符都映射到一个hashtable数组中&#xff0c;用来判断一个字符在这个字符串。 2. 判断一个字符在第…

140.深度学习分布式计算框架-3

140.1 Horovod Horovod是 Uber 开源的又一个深度学习工具&#xff0c;它的发展吸取了 Facebook「一小时训练 ImageNet 论文」与百度 Ring Allreduce 的优点&#xff0c;可为用户实现分布式训练提供帮助。Horovod 支持通过用于高性能并行计算的低层次接口 – 消息传递接口 (MPI…

Vue脚手架环境中简单使用MarkDown(只入门)

目录 入门 高级使用 入门 1 所在终端输入 npm install vue-meditor 2 复制以下代码 先新建一个组件 <template><div><MavonEditor v-model"myMarkDownData"/><button click"submit">提交</button></div> </te…

vue配置

首先安装node.js 在cmd node -v查看 然后 cmd命令行执行 : npm install -g vue/cli // 加-g是安装到全局 安装vue cli 安装vue cli 1 看一下 这是在cmd输入的内容,参考第一条链接 在vscode中怎么配置他? 文件-打开文件夹,选择一个文件夹 这里是firstvue 在下面新建文件夹…

可变长子网划分

目录 IP地址 子网划分 可变长子网划分 IP地址 在学习子网划分之前应该先清楚什么是IP地址和IP地址的类型 IP 地址的格式0网络地址主机地址10网络地址 主机地址 110网络地址主机地址1110组播地址11110保留 A 1.0.0.0~127.255.255.255 B 128.0.0.0~191.255.255…

C++编程进阶

目录 new运算符 new关键字的使用案例 C的引用 C中引用案例 引用的注意事项 引用做函数参数 引用做函数的返回值 前言&#xff1a; 具体案例 引用的本质 常量引用 常量引用原理 经典案例 函数的提高 函数的默认参数 注意&#xff1a; 具体案例 函数的占位参数…

已解决:树莓派外接硬盘 usb 或者sata 导致wifi无法链接 无线网卡无法使用问题

我的环境是树莓派4b 买了一个有硬盘的盒子 看上图的连接方式&#xff0c;是占用了树莓派的一个usb3.1进行了sata的转接&#xff0c;实现挂载硬盘。 但是我发现&#xff0c;安装系统开机之后&#xff0c;可以看到有硬盘接入&#xff0c;但是无法连wifi&#xff0c;如果拔掉硬盘…

G. SlavicG‘s Favorite Problem(树的遍历DFS,BFS均可)

Problem - G - Codeforces 给你一棵有n个顶点的加权树。回顾一下&#xff0c;树是一个没有任何循环的连接图。加权树是一棵树&#xff0c;其中每条边都有一定的权重。这棵树是无定向的&#xff0c;它没有根。 由于树让你感到厌烦&#xff0c;你决定挑战自己&#xff0c;在给定…