从0到1构建springboot web应用镜像并使用容器部署

news2024/11/18 15:40:04

文章目录

      • 一、生成镜像的两种方法
        • 1.1、使用commit生成镜像
          • 1.1.1、拉取Centos基础镜像
          • 1.1.2、启动Centos容器并安装Go
          • 1.1.3、commit生成新镜像
          • 1.1.4、使用新镜像验证Golang环境
        • 1.2、使用Dockerfile生成镜像
      • 二、基于Dockerfile生成一个springboot镜像
        • 2.1、准备springboot应用jar包
        • 2.2、编写Dockerfile
      • 三、运行容器服务,验证镜像的可用性

我们知道Docker三大概念:镜像、容器、仓库,其中镜像是容器运行的基础,我们一般来说的开发流程是从Docker Hub获取基础镜像,基于基础镜像进行一定的定制化开发(例如将应用程序放到镜像中),产生新的镜像,基于这个新的镜像启动容器,从而运行应用程序。

所以如何将一个应用程序生成一个镜像是非常关键的,本文以生成一个springboot镜像为例,展示如何生成一个镜像,以及基于这个镜像运行容器。

一、生成镜像的两种方法

Docker镜像的制作一般有两种方法,一种基于dockerfile配置文件,使用docker build进行,这是最推荐的正宗的镜像制作方法;第二种是通过使用docker commit这样的命令,手动将修改后的内容生成新的镜像。

1.1、使用commit生成镜像

这种方式不太适合大规模的镜像生成,一是对于镜像的构建内容无法回溯,二是操作效率比较低,但是在某些临时情况下却也有其方便之处,特别是开发测试时,如果临时需要安装一些新的软件,可以快捷生成新的镜像。

这里以生成一个自带Golang的镜像为例,演示如何使用commit生成镜像。

1.1.1、拉取Centos基础镜像

首先我们需要拉去一个Centos的基础镜像,Golang的安装将基于这个基础镜像进行操作。

搜索centos镜像:

[root@node1 ~]# docker search centos
INDEX       NAME                                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/centos                                       DEPRECATED; The official build of CentOS.       7529      [OK]
docker.io   docker.io/kasmweb/centos-7-desktop                     CentOS 7 desktop for Kasm Workspaces            33
docker.io   docker.io/couchbase/centos7-systemd                    centos7-systemd images with additional deb...   7                    [OK]

拉取STARS数量最高的官方镜像

[root@node1 ~]# docker pull centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for docker.io/centos:latest
1.1.2、启动Centos容器并安装Go
[root@node1 ~]# docker run -it centos /bin/bash
[root@311c53f54f2f /]#
[root@311c53f54f2f /]# go version
bash: go: command not found

这里证明基础的centos里面是没有golang的。

使用yum安装golang,发现如下错误提示

[root@311c53f54f2f /]# yum install go
Failed to set locale, defaulting to C.UTF-8
CentOS Linux 8 - AppStream                                                                                            71  B/s |  38  B     00:00
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist

这是因为yum源的问题,执行以下命令可以解决:

[root@311c53f54f2f yum.repos.d]# sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
[root@311c53f54f2f yum.repos.d]# sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
[root@311c53f54f2f yum.repos.d]# yum clean all
Failed to set locale, defaulting to C.UTF-8
0 files removed
[root@311c53f54f2f yum.repos.d]# yum makecache
Failed to set locale, defaulting to C.UTF-8
CentOS Linux 8 - AppStream                                                                                           2.6 MB/s | 8.4 MB     00:03
CentOS Linux 8 - BaseOS                                                                                              2.0 MB/s | 4.6 MB     00:02
CentOS Linux 8 - Extras                                                                                              7.7 kB/s |  10 kB     00:01
Metadata cache created.

正常成功安装golang

[root@311c53f54f2f yum.repos.d]# yum install go
[root@311c53f54f2f yum.repos.d]# go version
go version go1.16.12 linux/amd64
1.1.3、commit生成新镜像

首先使用docker ps查看当前的容器container id,这里是311c53f54f2f

[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
311c53f54f2f        centos              "/bin/bash"         13 minutes ago      Up 13 minutes

使用docker commit命令生成新的镜像

[root@node1 ~]# docker commit -a "lucas" -m "install golang" 311c53f54f2f centos-go:v1
sha256:019ab02d451defb75e2ee03948289ed008036ba7ec8a355cae28bdf7fbce07d2

再次使用docker image可以看到我们生成的centos-go的新镜像。

[root@node1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos-go           v1                  019ab02d451d        2 minutes ago       805 MB
docker.io/busybox   latest              bab98d58e29e        8 days ago          4.86 MB
docker.io/nginx     latest              904b8cb13b93        13 days ago         142 MB
docker.io/centos    latest              5d0da3dc9764        18 months ago       231 MB
1.1.4、使用新镜像验证Golang环境
[root@node1 ~]# docker run -it centos-go:v1 /bin/bash
[root@daff0519f2ca /]# go version
go version go1.16.12 linux/amd64

1.2、使用Dockerfile生成镜像

Dockerfile是一个包含Docker镜像构建指令的文本文件,用于自动化Docker镜像的构建过程。Dockerfile通过一系列指令来描述镜像的构建过程,包括基础镜像、依赖安装、文件拷贝、环境变量配置、启动命令等。Dockerfile的语法是类似于Shell脚本的语言。

Dockerfile由4个部分组成:基础镜像信息、维护者信息、镜像操作指令和容器启动指令。Dockerfile中的注释以#开头,可以用于描述指令的作用或者提供其他注释信息。

以下是一些常见的Dockerfile命令:

  1. FROM:指定基础镜像,例如FROM ubuntu:latest,FROM指令必须是除了注释意外的第一条指令,后续紧跟维护者信息指令。
  2. MAINTAINER:指定维护者的信息,例如MAINTAINER lucas
  3. RUN:在镜像中运行命令,例如RUN apt-get update && apt-get install -y nginx
  4. CMD:指定容器启动时要运行的命令,例如CMD [“nginx”, “-g”, “daemon off;”]。
  5. EXPOSE:声明容器要监听的端口,例如EXPOSE 80
  6. ENV:设置环境变量,例如ENV NODE_ENV production
  7. ADD:将文件复制到镜像中,例如ADD app.js /app.js
  8. COPY:将文件复制到镜像中,例如COPY app.js /app.js
  9. WORKDIR:设置工作目录,例如WORKDIR /app
  10. USER:设置容器启动时要使用的用户,例如USER nginx
  11. VOLUME:声明容器数据卷,例如VOLUME /data
  12. ENTRYPOINT:指定容器启动时要运行的命令,例如ENTRYPOINT ["nginx", "-g", "daemon off;"]

这些命令是常用的,但Dockerfile还有其他命令可以使用。可以查看Docker官方文档以获取更多信息。

完成了dockerfile的配置以后,使用docker build就可以构建镜像了。docker build命令可以通过指定不同的参数来自定义构建过程。例如,你可以使用--no-cache选项来强制Docker在构建镜像时不使用缓存,或者使用--build-arg选项来传递构建时需要的环境变量。可以通过docker build --help命令查看所有可用的选项。

二、基于Dockerfile生成一个springboot镜像

这里我们演示一下如何使用dockerfile构建一个springboot web应用镜像,并使用docker启动容器。

2.1、准备springboot应用jar包

我们准备一个基于springboot开发的应用服务,这个服务开放8080端口,访问是返回一个用户的姓名信息。

为了方便,可以使用spring initializr 在线生成demo代码,在demo代码的基础上开发一个controller返回一个User对象的name信息,由于这块代码比较简单,这里就不详述过程了。

代码完成以后使用mvn clean package进行打包,这里打包成功以后生成了demo-0.0.1-SNAPSHOT.jar,我们使用java -jar demo-0.0.1-SNAPSHOT.jar就可以运行这个应用程序。

2.2、编写Dockerfile

在项目根目录下创建一个名为Dockerfile的文件,并在其中添加以下内容:

FROM openjdk:18-jdk-alpine
MAINTAINER lucas
COPY target/demo-0.0.1-SNAPSHOT.jar /usr/app/
WORKDIR /usr/app
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "demo-0.0.1-SNAPSHOT.jar"]

在上面的Dockerfile中,FROM指令指定了基础镜像为openjdk:18-jdk-alpineCOPY指令将构建好的可执行jar包复制到容器中,WORKDIR指令设置工作目录为/usr/appEXPOSE指令指定了容器运行的端口为8080ENTRYPOINT指令指定了容器启动时要执行的命令为java -jar demo-0.0.1-SNAPSHOT.jar

在终端中进入项目根目录,然后执行以下命令构建镜像:

docker build -t demo:latest .

其中,-t参数指定了镜像的名称和版本号,.参数指定了Dockerfile所在的目录。

[root@node1 docker]# docker build -t demo:latest .
Sending build context to Docker daemon 51.05 MB
Step 1/6 : FROM openjdk:18-jdk-alpine
 ---> c89120dcca4c
Step 2/6 : MAINTAINER lucas
 ---> Running in 3d0ae6d2a813
 ---> 085b9066ca7b
Removing intermediate container 3d0ae6d2a813
Step 3/6 : COPY target/demo-0.0.1-SNAPSHOT.jar /usr/app/
 ---> c5c77f80f179
Removing intermediate container 00228e4b0aed
Step 4/6 : WORKDIR /usr/app
 ---> bdb555e3fb18
Removing intermediate container 35682266f140
Step 5/6 : EXPOSE 8080
 ---> Running in 499d9888fa01
 ---> 0fca023e8f23
Removing intermediate container 499d9888fa01
Step 6/6 : ENTRYPOINT java -jar demo-0.0.1-SNAPSHOT.jar
 ---> Running in 661fdaafa31d
 ---> 61e80950d665
Removing intermediate container 661fdaafa31d
Successfully built 61e80950d665

可以看到构建成功,使用docker images 可以查看到构建成功的镜像。

三、运行容器服务,验证镜像的可用性

以上步骤已经使用docker build生成了镜像,接下来就可以使用这个镜像启动容器,启动后会自动启动应用程序。

在终端中执行以下命令启动容器:

docker run -d -p 8080:8080 demo:latest

其中,-d参数指定了容器在后台运行,-p参数指定了容器的端口映射,demo:latest参数指定了要运行的镜像名称和版本号。

访问对应的web服务进行访问验证,结果如下:

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

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

相关文章

Vue父子组件传值

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、Vue父子传值的方法二、方法详解1.props / $emit2.$parent / children3.$ref总结前言 例如:Vue的学习是路阻且艰的,这是一个系列文章…

微信小程序 | 人脸识别的最终解决方案

📌个人主页:个人主页 ​🧀 推荐专栏:小程序开发成神之路 --(这是一个为想要入门和进阶小程序开发专门开启的精品专栏!从个人到商业的全套开发教程,实打实的干货分享,确定不来看看? &…

Cookie 和 Session的区别

文章目录时间:2023年3月23日第一:什么是 Cookie 和 Session ?什么是 Cookie什么是 Session第二:Cookie 和 Session 有什么不同?第三:为什么需要 Cookie 和 Session,他们有什么关联?第四&#x…

【Java基础】一个Java文件可以有多个类(外部类、内部类)

目录一、在一个Java文件中定义多个类(外部类)1.问题描述及解答2.总结二、在一个Java文件定义多个类(内部类)1.成员内部类和匿名内部类1.1 成员内部类1.2 匿名内部类2.深入理解内部类3.内部类的使用场景和好处一、在一个Java文件中…

小米商城官网(登录页,首页,详情页,我的购物车页,我的订单页,确认订单页)HTML+CSS+JS

文章目录前言一、登录页二、首页三、我的购物车页四、我的订单页五、确认订单页六、详情页七、整体结构和效果图总结前言 仿小米商城官网项目是本人实训内容,实训老师带着做的首页和登录页,本人在此基础上加入了我的购物车页,我的订单页&…

vue兼容ie11(@babel/polyfill、core-js@3两种方式)

Babel介绍: Babel是一个JavaScript编译器,主要用于将ECMAScript 2015代码转换为当前和旧浏览器或环境中向后兼容的JavaScript版本。要是通过核心依赖core-js2,主要是通过核心依赖core-js2来完成对应浏览器不支持的新的全局和实例api的添加 …

Vue2 实现图片的拖拽、缩放、旋转

本文是基于vue2 实现图片的拖拽、旋转、鼠标滚动放大缩小等功能。 效果图 分步骤实现 在这里看下 拖拽、旋转、缩放的几个方法 1.获取图片的实际宽高 getImgSize(url) {return new Promise((resolve, reject) > {let imgObj new Image();imgObj.src url;imgObj.onload…

插槽(slot)的基本使用

插槽(slot)的基本使用 一、插槽的作用 在开发中,我们会经常封装一个个可复用的组件: 前面我们会通过props传递给组件一些数据,让组件来进行展示; 但是为了让这个组件具备更强的通用性,我们不能…

Ubuntu搭建web站点并发布公网访问【内网穿透】

文章目录前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名前言 网:我们通常说的是互联网;站…

Vue3中使用vant(踩坑日记....)

我照着视频中老师教的方式去使用vant(和官网教程一样),发现样式根本不起作用(想截个图来着,但是vite热更新太厉害了,找不到了哈哈哈),然后又反复看了视频一遍,检查自己插件啥的而又没有安装好&a…

【TypeScript基础】TypeScript之常用类型(上)

前言 博主主页👉🏻蜡笔雏田学代码 专栏链接👉🏻【TypeScript专栏】 上篇文章大概了解了一下TypeScript,👉🏻详细内容请阅读【TypeScript介绍】一文带你初步了解TypeScript 今天开始学习学习Type…

html实现用户注册页面(生日实现年月日的三级联动)

注册页面 期待效果如下&#xff1a; 初始代码实现&#xff1a; <!DOCTYPE html> <html> <head><title>注册页面</title> </head> <body> <!-- 表单&#xff0c;用于提交按钮&#xff0c;隐式提交 --> <form action"…

后台管理系统 - 页面布局设计

前端的中后台管理系统相比于其他普通项目&#xff0c;从开发设计的角度来说有几点比较特殊&#xff1a; 一个是权限设计&#xff0c;具体实现可参考&#xff1a;传送门。一个是页面布局的设计&#xff0c;也是本文要说的。一个好的页面布局设计&#xff0c;无论是对于页面结构…

Java Web实现登录注册(超详细附代码)

Java Web实现登录注册&#xff08;超详细附代码&#xff09; 文章目录Java Web实现登录注册&#xff08;超详细附代码&#xff09;1.前言2.登录注册设计流程3.注册的数据流程4.登录的数据流程5.部分代码的展示5.1注册5.2登录6.总结1.前言 相信刚学Javaweb的小伙伴第一个接触的…

30个极致实用的谷歌浏览器插件,让你开发事半功倍

浏览器是开发人员最强大的工具。99% 的人不会 100% 地利用他们的浏览器。这里有 30 个浏览器扩展&#xff0c;如果你能合理充分利用将大大提升你的开发效率。1. WhatFont"WhatFont"&#xff0c;是一款帮助用户快速识别网页中字体信息的工具。当你在浏览网页时&#x…

vue|axios发送post请求详解

axios发送Post请求 首先我们要知道发送一个请求体的时候我们要明确发送的类型是什么&#xff0c;常见的类型有三种 form-dataapplication/jsonapplication/x-www-form-urlencoded 以上三种类型是进行数据传输的数据类型&#xff0c;我们知道在js代码中的对象都不是以上的三种…

react实现路由跳转

react通过路由实现页面跳转&#xff1a; ​ 函数式路由(withRouter)使用原生js方法实现路由功能。 ​ eg&#xff1a;export default withRouter(Home) Home是组件名称。 示例&#xff1a;class Home extends Component{<button onClick{this.goForward}>下一级</bu…

猿创征文|【C++游戏引擎Easy2D】炫酷动画来这学,位移动画构造函数让节点执行动画

&#x1f9db;‍♂️iecne个人主页&#xff1a;&#xff1a;iecne的学习日志 &#x1f4a1;每天关注iecne的作品&#xff0c;一起进步 &#x1f4aa;学C必看iecne 本文专栏&#xff1a;【C游戏引擎】. &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; ✨前…

from origin ‘null‘ has been blocked by CORS policy: Cross origin requests are only supported for ...

跨源资源请求问题解决方案 问题描述&#xff1a;当我们在vsCode中使用 open in brower插件打开html文件文件时&#xff0c;就会报错 xxx已被CORS策略阻止&#xff0c;引入的资源还会失效。 解决办法1 :Live Server插件 在vsCode的插件市场中搜索并安装Live Server插件&#x…

Axios

Axios是Ajax的一个框架&#xff0c;简化Ajax操作 一、基本操作 Axios执行Ajax的操作&#xff1a; 1. 添加axios的js文件 <script language"JavaScript" src"script/axios.min.js"></script> 2.1 客户端向服务端异步发送普通参数值 格式&am…