【Docker】(二)使用Dockerfile构建并发布一个SpringBoot服务

news2024/10/5 1:24:34

1.前言

在上一篇笔记 Docker基本概念与安装 中,我们已经获取到了一个Docker服务,并了解了Docker的基本组成及其各个组件的作用。
我们了解到,使用Docker的其中一个目的,是为了更加简单,方便的部署我们编写的服务,接下来,就以发布一个SpringBoot的服务为例,来学习部署服务需要是用到的API指令。

2.准备工作

首先,需要准备一个Springboot的项目,这里准备一个简单的 Hello World 工程:

@RestController
@RequestMapping("hello")
public class HelloController {

    @GetMapping("sayHello")
    public String sayHello(String name) {
        return "hello " + name;
    }
}

提供一个GET请求的接口,在请求参数中输入什么就返回什么,这里不过多的赘述。
接下来,需要使用MavenGradle打包工具,将这个服务打成jar包,我这里使用的是Gradle,打包完成之后在build目录中就可以找到一个可运行的jar包。

image.png

由于我的Docker是安装在虚拟机中的,所以我还需要将这个jar拷贝到我的虚拟机中完成Docker镜像的构建,如果Docker是直接安装在当前系统中的话,后续的操作在当前系统中就可以完成了。

此处使用Xftp将生成的jar包拷贝到了虚拟机的/user/hello-boot下,接下来的操作都在这里面完成。

image.png

3.Docker镜像构建

下一步就是将刚刚生成的jar包构建成可供Docker运行的image文件,这一步需要使用到两个知识点:

  • docker build指令
  • Dockerfile文件

3.1.docker build

docker build指令的作用,是解析Dockerfile文件中的的脚本,把可执行文件(如上面的jar包)打包到Docker镜像文件中,这个镜像文件可以在后续使用docker run时,按照Dockerfile文件中的脚本,执行相应的操作。简单的说,就是构建出docker的可执行文件。

先看构建语法:

docker build [OPTIONS] PATH | URL | -
  • [OPTIONS] 是执行build时的可选项,常用是有-t-f

    • -t:给构建的镜像打一个tag标签
    • -f:指定本次构建使用到的Dockerfile文件路径,默认值为Dockerfile

    其他先选项可以参考: docker build options

  • PATH 与 URL 是当前构建操作的context,它可以是一个文件路径(PATH),也可以是远程地址(URL),构建时需要引用的文件就应该放在context中,例如刚刚生成的jar包。


综上,可以进入jar包所在的文件目录,输入构建指令:

cd /usr/hello-boot/

docker build -t hello-boot:1.0.0 -f ./Dockerfile .

我们知道默认使用的就是当前路径下的Dockerfile,所以构建指令可以简化为:

docker build -t hello-boot:1.0.0 .

指令中最后那个.就是上述语法中的 PATH ,在这里的含义就是执行当前目录为构建的context

现在我们得到了一个完整的构建指令,但是仔细观察一下这个指令,会发现其中还缺少处理jar包的指令,思考一下,这个指令会在什么位置呢?

3.2.DockerFile

Dockerfile 是一个脚本文件,里面定义了context的各种操作指令,以生成SpringBoot镜像为例:

FROM openjdk:8-alpine3.9

MAINTAINER huizhiyimo

RUN mkdir -p /user/my-demo

COPY ./*.jar /user/my-demo

WORKDIR /user/my-demo

EXPOSE 8080

ENTRYPOINT java -Xms256m -Xmx256m -jar -Dspring.profiles.active=${SPRING_PROFILES_ACTIVE} *.jar
  • FROM:指定基础镜像,也就是当前需要构建的镜像是哪一个镜像的基础上做构建的,当前指定在openjdk:8-alpine3.9上构建。
  • MAINTAINER:作者信息,类似于@author
  • RUN:在容器中运行指令,此处是创建文件夹 /user/my-demo
  • COPY:将宿主机context中的jar,复制到容器中的/user/my-demo
  • WORKDIR:指定容器中的工作目录,类似于cd /user/my-demo
  • EXPOSE:应用程序暴露的默认端口
  • ENTRYPOINT:应用程序切入点,在启动容器时运行,在这里定义启动SpringBoot服务

Docker的镜像是像集装箱那样一层一层往上搭建的,通过 FROM 指令可以实现下图的分层效果:

image.png

FROM后面的镜像会先从本地的镜像仓库中寻找,如果本地没有就会从 DockerHub 中寻找,此处的openjdk:8-alpine3.9是一个带有Java运行环境的轻量级服务器,在DockerHub中找到这个镜像,打开IMAGE LAYERS就能大概知道这个镜像会怎么运行,如下图红框中的内容。

image.png

显然,通过这个镜像我们就可以得到一个Java的运行环境,以此为基础来运行SpringBoot的服务就是顺理成章的事情了。

3.3.镜像构建

将编写好的DockerFile与jar包放在同一目录下,执行构建指令:

image.png

docker build -t hello-boot:1.0.0 .

image.png

提示构建成功,此时再运行查看镜像的指令,就可以看到刚才通过FROM下载的openjdk镜像与hello-boot镜像:

docker images

1668948951822.png

如果构建的镜像有问题,可以通过删除镜像指令删掉再重新构建:

docker rmi [name:tag]
docker rmi hello-boot:1.0.0

4.运行镜像

通过docker run指令可以将镜像运行起来:

docker run -d -p 8080:8080 -e SPRING_PROFILES_ACTIVE=test --restart=always --name=hello-1 hello-boot:1.0.0
  • -d: 后台运行程序
  • -p:指定端口映射,左边的是宿主机端口,右边的是容器中的应用端口,与-d可以合并为-dp
  • -e: 指定环境变量,此处是指定profiles为test(在Dockerfile的ENTRYPOINT中定义的变量)
  • –restart=always:启动docker容器时,自动运行
  • –name:指定运行容器的名称
  • hello-boot:1.0.0:指定镜像名称与tag标签

运行起来之后,可以通过docker ps查看:

image.png

此时容器已经正常启动了,通过curl指令来测试一下是否启动成功:

curl "http://127.0.0.1:8080/hello/sayHello?name=zhangsan"

image.png

至此,SpringBoot服务就通过Docker发布成功了,如果想停止这个服务,可以使用下面的指令:

# 停止容器,hello-1为容器名
docker stop hello-1
# 删除容器
docker rm hello -1

注:如果项目迭代到了下一个版本,要发布新的服务,就需要执行上面的两个指令删除旧的容器,再通过新构建的镜像来运行新的容器。

5.指令参考

Docker的运行指令可以参考 官方指令教程

6.结语

本篇通过打包、构建镜像、运行容器、停止容器、删除容器的过程,学习了Docker的基本指令:

  • docker build:构建镜像
  • docker images:查看本地镜像
  • docker rmi:删除镜像
  • docker run:运行容器
  • docker ps:查看容器
  • docker stop:停止容器
  • docker rm:删除容器

一些思考
本篇描述的Docker使用方式,相对于传统的服务发布方式并没有太大的优势,不管是发布新服务,还是对服务进行扩展都需要按照流程重新构建镜像。
这是由于没有做到镜像的共享与复用导致的,在后续的笔记中,会接受如何通过远程镜像仓库来复用镜像来提升部署的效率。

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

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

相关文章

Typora下载和Markdown基础语法

本章内容如下: Typoar笔记下载资源及主题设置Markdown语法使用的基本方法 这篇博客一开始是为了教女朋友如何使用Typora和Markdown语法写的笔记,Markdown语法的内容不太全,只涉及基础使用。 文章目录Typora下载与主题设置Typora主题设置修改图…

在线考试答题系统的五大功能,你知道多少?

在线考试答题系统-五大功能,你知道多少?-在线考试答题系统优势:在线考试答题系统具有高度的可扩展性,高效灵活、功能强大。考试用户随时随地就可通过网络登录在线考试答题系统,参加在线报名、在线练习、在线考试、在线…

嵌入式开发中为什么选择C语言?它有哪些特点?

众所周知,C语言在嵌入式开发中占据着十分重要的地位,为什么嵌入式开发要选择C语言?嵌入式开发的方向可以分为单片机开发、Linx应用开发和现场可编辑逻辑门阵列(FPGA)开发,不同于传统开发模式,操作系统是嵌入…

Nepnep x CatCTF Writeup

Web: 题目名称 ez_js 直接查看网页源代码,查看game.js,进入该目录即可得到flag Reverse: 题目名称 The cat did it 点进来看到一个看着很复杂的图像,离开的概率我猜是0% MD5加密,第一个即为flag Misc&am…

给在校学生的科普文:数字芯片后端工程师的日常

芯片后端设计,看似只是将网表中的晶体管摆放好。但并不是如同砖头砌墙那样简单粗暴。它是一门兼具形式美和工程实践需求的技术。形式美,直接来源于功能内容和需求,在后端设计的环节中,数以万计的标准单元如散乱的点点繁星&#xf…

2022年度穿戴设备行业分析:智能手表销额增长25%,智能手环销量下滑

当前,随着社会经济的发展与居民可支配收入的提高,居民的购买力逐渐增强,我国智能穿戴设备行业也得以快速发展。同时,随着相关技术的不断开发,我国智能穿戴设备行业的技术水平也持续提高。根据数据显示,智能…

软考中级数据库系统工程师好考吗?

数据库还好的,每年五月份考试,通过率20-30%。 数据库系统工程师,主要考核内容:数据库系统基本概念及关系理论;常用的大型数据库管理系统的应用技术;数据库应用系统的设计方法和开发过程;数据库系…

【C++修炼之路】12. stack queue类

每一个不曾起舞的日子都是对生命的辜负 stack&&queue一. stack的介绍和使用1. stack的介绍2. stack的使用二. stack的模拟实现三. queue的介绍和使用1. queue的介绍2. queue的使用四. queue的模拟实现五. deque的介绍和使用1. deque的介绍2. deque的使用3. deque的缺陷…

东方通无法加载程序jar包中的js

东方通中间件使用龙芯适配程序问题描述:东方通无法加载程序jar包中的js排查过程:根据以往经验确保东方通处于最新版本,确认版本为最新的检查容器配置,确认无误在东方通tongweb/bin/external.vmoption 里把-DWebModuleOnly参数值改…

Qt扫盲-QSS定制Qt Widget控件

QSS定制Qt Widget控件概述一、盒子模型二、子控件概述 在使用样式表时,每个部件都被视为具有四个同心矩形的盒子:外边距矩形、边界矩形、内边距矩形和内容矩形。 其实即是每一个继承至 QWidget 都支持的,这个和 前端的 CSS 里面的 盒子模型有些区别但是…

哪吒S亮相广州车展,定位B级燃油车颠覆者

2022年收官,哪吒汽车宣布全年交付152073台,其中: •哪吒U 51021台; •哪吒V 98847台; •哪吒S 2003台(12月首月交付)。与此同时,在年末的广州车展,哪吒汽车携全系车型参展…

Elastic-Job分布式任务调度(2):Elastic-Job快速入门

1 环境搭建 1.1 版本要求 JDK要求1.7及以上版本 Maven要求3.0.4及以上版本 zookeeper要求采用3.4.6及以上版本 1.2 Zookeeper安装&运行 自行查看我的zookeeper专题 ZooKeeper(3):ZooKeeper集群环境搭建_不死鸟.亚历山大.狼崽子的博客-CSDN博客 1.3 创建maven工程 创建…

Python代理IP的使用和代理池的设置

熟悉python的人都知道为了python的正常请求,维持数据的稳定获取,都会用到代理IP。代理IP不仅可以用来规避IP在单位时间的请求次数,还可以借助代理来隐藏真实的IP,避免出现“IP请求过于频繁”,“403”等报错。今天就带大…

甲方安全之仿真钓鱼演练(邮件+网站钓鱼)

文章目录一、简介1.1 前言1.2 整体思路1.3 演练所需1.4 各邮件厂商日群发上限二、钓鱼平台搭建及配置2.1 gophish平台搭建2.2 收件目标配置(User & Groups)2.3 发信邮箱配置(Sending Profiles)2.4 邮件模版配置(Em…

Windows下socket网络编程,C++,Email的客户端程序(支持邮件基于SMTP的发送和POP3的接收)

阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量。文章设置为仅粉丝可见,是因为写博客确实花了不少精力。不用担心你关注我而我却不关注你,因为我是个诚信互关的人!&…

linux--管道

这里写自定义目录标题基本概念管道特征编写模型有名管道模型示例demowrite.cread.c结果无名管道基本概念 进程间存在天然的壁垒,进程间通信(Interperocess Communication,IPC)是指二个或者多个进程之间进行数据交换的过程 管道特征 管道是进程间通讯的一种常用方法。管道分为…

MyISAM 引擎和 InnoDB 引擎中索引存储的区别

一、MyISAM 引擎下的索引 MyISAM 存储引擎不支持行级锁,只有表级锁;不支持事务,也不支持外键,主要面向 OLAP 应用,是 MySQL 数据库5.5.8 版本之前默认的存储引擎,MyISAM 适用于不需要关心事务,…

实时即未来,大数据项目车联网之原始数据实时ETL任务HBase调优【九】

1. 原始数据实时ETL任务HBase调优 1.1 数据写入hbase优化 上一节写入数据,一条条数据put到表中,对于大量数据的写入,效率极低,因此针对此项进行优化 使用hbase客户端写缓存进行批量写入数据到hbase中 hbase客户端写缓存对象:BufferedMutator hbase的每一次put操作写入数据…

CSS权威指南(二)选择符

1.样式的基本规则 CSS的一个核心优势就是可以为文档中某种种类的元素全部应用相同的样式规则。CSS样式便于修改和编辑,而且能应用到指定的所有文本元素上。 (1)元素选择符 即直接使用元素的名称进行选择,类似于p{ font-size:10px…

Lc.152 乘积最大子数组

题目链接1 前言翻译成大白话:就是找一个数组,其连续子数组的乘积最大值。2 算法思路:一般求最值的问题首选动态规划。这道题与[LC.53 最大子序和]很类似。我们假设状态转移方程为:它表示以第 i 个元素结尾乘积最大子数组的乘积可是在这里&…