Dockerfile - 基于 SpringBoot 项目自定义镜像(项目上线全过程)

 

目录

一、Dockerfile 自定义项目镜像

1.1、创建 SpringBoot 项目并编写

1.2、打包项目(jar)

1.3、编写 Dockerfile 文件,构建镜像

1.4、运行镜像并测试


一、Dockerfile 自定义项目镜像


1.1、创建 SpringBoot 项目并编写

a)简介:就是一个对 用户表 简单的增删改查的 SpringBoot 项目.

b)接口:采用 restful 风格

这里简单回顾以下 restful 风格接口规范

  • 原则: GET(查询)、POST(添加)、PUT(全字段更新)、PATCH(部分字段更新)、DELETE(删除)
  • 使用复数名词: user -> users、 car -> cars
  • 请求和响应指定: request: @RequestBody; response: @ResponseBody
  • 资源唯一标识需要通过路径传参,例如 id
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PutMapping("id")public String updateUser(@PathVariable("id") Integer id, @RequestBody User user) {user.setId(id);userService.update(user);return "ok";}@GetMapping("/{id}")public User getUser(@PathVariable("id") Integer id) {return userService.queryById(id);}@PostMappingpublic String addUser(@RequestBody User user) {userService.insert(user);return "ok";}@DeleteMapping("/{id}")public String delUser(@PathVariable("id") Integer id) {userService.deleteById(id);return "ok";}@GetMappingpublic List<User> getUserList() {return userService.queryAll();}}

c)配置文件:我们重点关注 服务器端口号 和 mysql 连接 ip 地址

server:port: 8081spring:datasource:url: jdbc:mysql://mysql:3306/demo?characterEncoding=utf8&useSSL=falseusername: rootpassword: 1111driver-class-name: com.mysql.cj.jdbc.Driver# 时间处理jackson:date-format: yyyy-MM-ddtime-zone: GMT+8# mybatis xml save path
mybatis:mapper-locations: classpath:mapper/*Mapper.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

Ps:由于将来会将 springboot 项目和 mysql 配置到同一个自定义的 docker 网络下,因此 mysql 的 url 配置中的 ip 就使用容器名称即可.

1.2、打包项目(jar)

a)打包完毕后,根据以下目录找到包地址

或者在 target 的目录下也能看到

b)在云服务器上创建一个工作目录,用来存放 jar包 和 Dockerfile文件,将 jar 包从主机移到远端服务器.

[root@VM-8-17-centos apps]# ls
ssm-docker-0.0.1-SNAPSHOT.jar
[root@VM-8-17-centos apps]# pwd
/root/cyk/apps
[root@VM-8-17-centos apps]# 

1.3、编写 Dockerfile 文件,构建镜像

a)选取 openjdk1.8 镜像作为根基(open 表示开源的意思)

在 dockerhub 官网搜索 openjdk,找到对应的版本

找到 8-jdk

可以看到有下载命令,将 openjdk:8-jdk 写到 FROM 后面,表示以此镜像为基础进行开发.

b)编写 Dockerfile 文件

FROM openjdk:8-jdk
ENV BASE_PATH=/cyk/apps
WORKDIR $BASE_PATH
# 将宿主机上的 ssm-docker-0.0.1-SNAPSHOT.jar 移动到 /cyk/apps 目录下并改名为 apps.jar
ADD ssm-docker-0.0.1-SNAPSHOT.jar $BASE_PATH/apps.jar
EXPOSE 8081
ENTRYPOINT ["java", "-jar"]
CMD ["apps.jar"]

c)将 Dockerfile 文件移动到云服务器的工作目录( /cyk/apps )

[root@VM-8-17-centos apps]# rz -E
rz waiting to receive.
[root@VM-8-17-centos apps]# ls
Dockerfile  ssm-docker-0.0.1-SNAPSHOT.jar
[root@VM-8-17-centos apps]# pwd
/root/cyk/apps
[root@VM-8-17-centos apps]# 

d)构建镜像

[root@VM-8-17-centos apps]# docker build -t app:1.0 .
[+] Building 46.7s (8/8) FINISHED                                                                                     docker:default=> [internal] load build definition from Dockerfile                                                                            0.0s=> => transferring dockerfile: 326B                                                                                            0.0s=> [internal] load .dockerignore                                                                                               0.0s=> => transferring context: 2B                                                                                                 0.0s=> [internal] load metadata for docker.io/library/openjdk:8-jdk                                                               16.2s=> [1/3] FROM docker.io/library/openjdk:8-jdk@sha256:8a9d5c43f540e8d0c003c723a2c8bd20ae350a2efed6fb5719cae33b026f8e7c         30.0s=> => resolve docker.io/library/openjdk:8-jdk@sha256:8a9d5c43f540e8d0c003c723a2c8bd20ae350a2efed6fb5719cae33b026f8e7c          0.0s=> => sha256:e24ac15e052e04a3462ef4984b5d83214f7f65c06f54acd3745a1926e226be16 7.81kB / 7.81kB                                  0.0s=> => sha256:9b829c73b52b92b97d5c07a54fb0f3e921995a296c714b53a32ae67d19231fcd 5.15MB / 5.15MB                                  0.9s=> => sha256:cb5b7ae361722f070eca53f35823ed21baa85d61d5d95cd5a95ab53d740cdd56 10.87MB / 10.87MB                                0.7s=> => sha256:8a9d5c43f540e8d0c003c723a2c8bd20ae350a2efed6fb5719cae33b026f8e7c 1.29kB / 1.29kB                                  0.0s=> => sha256:9413213335131c4e06b21a8e379bd9b6a20afcd6b762540463d5f7c72942dcdd 1.79kB / 1.79kB                                  0.0s=> => sha256:0e29546d541cdbd309281d21a73a9d1db78665c1b95b74f32b009e0b77a6e1e3 54.92MB / 54.92MB                               18.6s=> => sha256:6494e4811622b31c027ccac322ca463937fd805f569a93e6f15c01aade718793 54.57MB / 54.57MB                               21.5s=> => sha256:668f6fcc5fa5532a1dd793456f64daf954192e0521fd65d42af584d5e2d93f55 5.42MB / 5.42MB                                  1.3s=> => sha256:c0879393b07ef5fa816c292b00e3eb4945890bc2a69ab0d1754240cbe9cedf21 212B / 212B                                      1.6s=> => sha256:bef50c41a74d450f2d708be5971c3ba635ed1a714af7f4fa1497886adb2fa734 106.00MB / 106.00MB                             12.4s=> => extracting sha256:0e29546d541cdbd309281d21a73a9d1db78665c1b95b74f32b009e0b77a6e1e3                                       3.1s=> => extracting sha256:9b829c73b52b92b97d5c07a54fb0f3e921995a296c714b53a32ae67d19231fcd                                       0.3s=> => extracting sha256:cb5b7ae361722f070eca53f35823ed21baa85d61d5d95cd5a95ab53d740cdd56                                       0.3s=> => extracting sha256:6494e4811622b31c027ccac322ca463937fd805f569a93e6f15c01aade718793                                       3.2s=> => extracting sha256:668f6fcc5fa5532a1dd793456f64daf954192e0521fd65d42af584d5e2d93f55                                       0.2s=> => extracting sha256:c0879393b07ef5fa816c292b00e3eb4945890bc2a69ab0d1754240cbe9cedf21                                       0.0s=> => extracting sha256:bef50c41a74d450f2d708be5971c3ba635ed1a714af7f4fa1497886adb2fa734                                       3.3s=> [internal] load build context                                                                                               0.1s=> => transferring context: 9.88kB                                                                                             0.0s=> [2/3] WORKDIR /cyk/apps                                                                                                     0.2s=> [3/3] ADD ssm-docker-0.0.1-SNAPSHOT.jar /cyk/apps/apps.jar                                                                  0.1s=> exporting to image                                                                                                          0.1s=> => exporting layers                                                                                                         0.1s=> => writing image sha256:89839bc7dd0c546892b523403eb18d8b3a5d84993c4be71a9dd4ca2875bd1e9d                                    0.0s=> => naming to docker.io/library/app:1.0                                                                                      0.0s
[root@VM-8-17-centos apps]# docker images
REPOSITORY                  TAG              IMAGE ID       CREATED          SIZE
app                         1.0              89839bc7dd0c   28 seconds ago   526MB

1.4、运行镜像并测试

a)先自定义一个网桥,方便后续运行容器时直接加入到统一网络下.

[root@VM-8-17-centos apps]# docker network create mynet
dd8d11bdbd1ff64905a877c350752521f8dc772480b0a9db378769d283a143ac
[root@VM-8-17-centos apps]# 
[root@VM-8-17-centos apps]# 
[root@VM-8-17-centos apps]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
f84ca6fc4b48   bridge    bridge    local
a1b8a8a8e372   host      host      local
dd8d11bdbd1f   mynet     bridge    local
38b4ab15453c   none      null      local

d)启动容器

启动 mysql:

docker run -d --name mysql -p 3306:3306 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1111 --network mynet mysql:5.7

Ps:这里不要忘了准备 MySQL 的数据 

启动 springboot 项目:

docker run -d --name app -p 8081:8081 --network mynet app:1.0

检查启动日志:

[root@VM-8-17-centos apps]# docker logs -f app.   ____          _            __ _ _/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/  ___)| |_)| | | | | || (_| |  ) ) ) )'  |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot ::                (v2.7.6)2023-12-28 10:40:00.259  INFO 1 --- [           main] com.cyk.SsmDockerApplication             : Starting SsmDockerApplication using Java 1.8.0_312 on 4ecafb679d7f with PID 1 (/apps/apps.jar started by root in /apps)
2023-12-28 10:40:00.273  INFO 1 --- [           main] com.cyk.SsmDockerApplication             : No active profile set, falling back to 1 default profile: "default"
2023-12-28 10:40:02.271  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8081 (http)
2023-12-28 10:40:02.290  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-12-28 10:40:02.290  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.69]
2023-12-28 10:40:02.391  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-12-28 10:40:02.391  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1959 ms
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
Parsed mapper file: 'class path resource [mapper/UserMapper.xml]'
2023-12-28 10:40:03.399  INFO 1 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page: class path resource [static/index.html]
2023-12-28 10:40:03.675  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8081 (http) with context path ''
2023-12-28 10:40:03.690  INFO 1 --- [           main] com.cyk.SsmDockerApplication             : Started SsmDockerApplication in 4.412 seconds (JVM running for 5.138)

 

e)注意事项:运行容器时,一旦出现以下情况

no main manifest attribute, in apps.jar

一定要看一下 pom.xml 文件中是否存在 <skip>true<skip> 的配置,因为打包时他会跳过主类.

f)postman 测试接口

这里我为了防止黑客攻击,建立隧道和远端服务器连接,开放映射本地 9091 端口.

访问后,云服务器上检查日志,也可以观察到打印相应日志(测试成功)

[root@VM-8-17-centos ~]# docker logs app.   ____          _            __ _ _/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/  ___)| |_)| | | | | || (_| |  ) ) ) )'  |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot ::                (v2.7.6)2023-12-28 10:40:00.259  INFO 1 --- [           main] com.cyk.SsmDockerApplication             : Starting SsmDockerApplication using Java 1.8.0_312 on 4ecafb679d7f with PID 1 (/apps/apps.jar started by root in /apps)
2023-12-28 10:40:00.273  INFO 1 --- [           main] com.cyk.SsmDockerApplication             : No active profile set, falling back to 1 default profile: "default"
2023-12-28 10:40:02.271  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8081 (http)
2023-12-28 10:40:02.290  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-12-28 10:40:02.290  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.69]
2023-12-28 10:40:02.391  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-12-28 10:40:02.391  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1959 ms
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
Parsed mapper file: 'class path resource [mapper/UserMapper.xml]'
2023-12-28 10:40:03.399  INFO 1 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page: class path resource [static/index.html]
2023-12-28 10:40:03.675  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8081 (http) with context path ''
2023-12-28 10:40:03.690  INFO 1 --- [           main] com.cyk.SsmDockerApplication             : Started SsmDockerApplication in 4.412 seconds (JVM running for 5.138)
2023-12-28 10:43:17.431  INFO 1 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-12-28 10:43:17.431  INFO 1 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-12-28 10:43:17.432  INFO 1 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@45f8529a] was not registered for synchronization because synchronization is not active
2023-12-28 10:43:17.524  INFO 1 --- [nio-8081-exec-1] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2023-12-28 10:43:17.819  INFO 1 --- [nio-8081-exec-1] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
JDBC Connection [HikariProxyConnection@1585874780 wrapping com.mysql.cj.jdbc.ConnectionImpl@1380045] will not be managed by Spring
==>  Preparing: select * from user;
==> Parameters: 
<==    Columns: id, name, age
<==        Row: 1, cyk, 20
<==        Row: 2, lyj, 19
<==        Row: 4, pdder, 100
<==      Total: 3
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@45f8529a]

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt学习:Qt的意义安装Qt

Qt 的简介 QT 是一个跨平台的 C图形用户界面应用程序框架。它为程序开发者提供图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正地组件编程。 支持平台 xP 、 Vista、Win7、win8、win2008、win10Windows . Unix/Linux: Ubuntu 等…

RustDesk连接客户端提示key不匹配 Key Mismatch无法连接(已解决)

环境: RustDesk1.1.9 服务端docker部署 问题描述: RustDesk连接客户端提示key不匹配 Key Mismatch无法连接 解决方案: 1.docker部署RustDesk服务检查配置 networks:rustdesk-net:external: falsevolumes:hbbr:hbbs:services:hbbs:container_name: rustdesk-hbbsport…

大数据与人工智能|信息技术产业架构、行业发展与前沿技术(第2节)

内容链接&#xff1a;信息技术产业架构、行业发展与前沿技术&#xff08;大数据与人工智能系列课程 第2节&#xff09; 声明&#xff1a;学习使用&#xff0c;侵权必删&#xff01; 主要内容&#xff1a;1. 从算盘到量子计算机&#xff0c;介绍了半导体行业的发展历程和技术原…

K8S结合Prometheus构建监控系统

一、Prometheus简介 Prometheus 是一个开源的系统监控和警报工具&#xff0c;用于收集、存储和查询时间序列数据。它专注于监控应用程序和基础设施的性能和状态&#xff0c;并提供丰富的查询语言和灵活的告警机制1、Prometheus基本介绍 数据模型&#xff1a;Prometheus 使用时…

解密负载均衡:如何平衡系统负载(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

git 学习 之一个规范的 commit 如何写

最好的话做一件完整的事情就提交一次

磁盘相关知识

一、硬盘数据结构 1.扇区&#xff1a; 盘片被分为多个扇形区域&#xff0c;每个扇区存放512字节的数据&#xff08;扇区越多容量越大&#xff09; 存放数据的最小单位 512字节 &#xff08;硬盘最小的存储单位是扇区&#xff0c;512 个字节&#xff0c;八个扇区组成一块&…

python学习14

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

小米路由器2(R2D) 安装 MIXBOX

1. 先刷开发版 ROM http://www1.miwifi.com/miwifi_download.html 进入上述网页&#xff0c;找到 R2D 点击下载 开发版 ROM 教程 看 下载按钮上边的 “刷机教程” 刷机教程 2. 开启SSH工具 登录自己的小米账号后&#xff0c;里面会显示出 自己的 root密码&#xff1b; 默认…

视频美颜SDK趋势畅想:未来发展方向与应用场景

当下&#xff0c;视频美颜SDK正不断演进&#xff0c;本文将深入探讨视频美颜SDK的发展趋势&#xff0c;探讨未来可能的方向和广泛的应用场景。 1.深度学习与视频美颜的融合 未来&#xff0c;我们可以期待看到更多基于深度学习算法的视频美颜SDK&#xff0c;为用户提供更高质量…

【没有哪个港口是永远的停留~论文简读】Panoptic SegFormer

Panoptic SegFormer 原文&#xff1a;https://arxiv.org/pdf/2109.03814.pdf 代码&#xff1a;GitHub - zhiqi-li/Panoptic-SegFormer: This is the official repo of Panoptic SegFormer [CVPR22] 在全景分割中&#xff0c;图像内容可分为things和stuff两类。 things是可计…

vue-内网,离线使用百度地图(地图瓦片图下载静态资源展示定位)

前言 最近发现很多小伙伴都在问内网怎么使用百度地图&#xff0c;或者是断网情况下能使用百度地图吗 后面经过一番研究&#xff0c;主要难点是&#xff0c;正常情况下我们是访问公网百度图片&#xff0c;数据&#xff0c;才能使用 内网时访问不了百度地图资源时就会使用不了&…

漏洞复现-红帆OA iorepsavexml.aspx文件上传漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

一套rk3588 rtsp服务器推流的 github 方案及记录 -03(完结)

opencv 解码记录 解码库使用的时候发现瑞芯微以前做过解码库对ffmpeg和gstreamer的支持 然后最近实在不想再调试Rtsp浪费时间了&#xff0c;就从这中间找了一个比较快的方案 ffmpeg 带硬解码库编译 编译流程参考文献 https://blog.csdn.net/T__zxt/article/details/12342435…

2023年12月27日学习记录_加入噪声

目录 1、今日计划学习内容2、今日学习内容1、add noise to audio clipssignal to noise ratio(SNR)加入 additive white gaussian noise(AWGN)加入 real world noises 2、使用kaggel上的一个小demo&#xff1a;CNN模型运行时出现的问题调整采样率时出现bug 3、明确90dB下能否声…

每日一题--------求数字的每⼀位之和

大家好今天的每日一题又来了&#xff0c;有啥不对的请在评论区留言哦 文章目录 目录 文章目录 求数字的每⼀位之和 题⽬描述&#xff1a; 输⼊⼀个整数m&#xff0c;求这个整数m的每⼀位之和&#xff0c;并打印。 一、解题思路 我们可以通过不断获取该整数的个位数&#xff0c…

Redis中RDB和AOF

Redis中RDB和AOF 定时间间隔执行数据集的时间快照&#xff0c;把某一时刻数据和妆容以文件的形式写到磁盘上&#xff0c;也就是快照。 配置文件 如果是普通安装方式可以跳过&#xff0c;如果是docker安装&#xff0c;需要到官网下载redis.conf配置文件到本地&#xff0c;地址…

接口自动化测试问题汇总

本篇文章分享几个接口自动化用例编写过程遇到的问题总结&#xff0c;希望能对初次探索接口自动化测试的小伙伴们解决问题上提供一小部分思路。 sql语句内容出现错误 空格&#xff1a;由于有些字段判断是变量&#xff0c;需要将sql拼接起来&#xff0c;但是在拼接字符串时没有…

2022 年全国职业院校技能大赛高职组云计算正式赛卷第二场-容器云

2022 年全国职业院校技能大赛高职组云计算赛项试卷 云计算赛项第二场-容器云 目录 2022 年全国职业院校技能大赛高职组云计算赛项试卷 【赛程名称】云计算赛项第二场-容器云 【任务 1】容器云平台搭建[5 分] 【任务 2】容器云应用部署&#xff1a; Docker Compose 编排部署[7.0…

9_js_dom编程进阶3

Dom节点删除和复制操作事件加强讲解 1. 节点操作 1.1 删除节点 Node.removeChild() 方法从 DOM 中删除一个子节点。返回删除的节点。 child 是要移除的那个子节点。 node 是child的父节点。 PS&#xff1a;只能由父节点删除子节点 课堂案例&#xff1a;1.节点操作之删除节…