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.mzph.cn/news/584382.shtml

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

相关文章

SonarQube安装踩坑记录

如果用java1.8和mysql&#xff0c;则SonarQube版本不能超过7.8&#xff0c;看这里。 SonarQube7.8安装包地址&#xff1a; https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.8.zip 安装步骤&#xff1a; 1、下载SonarQube安装包 wget https://binari…

antv/x6_2.0学习使用(一、安装引入)

安装引入 安装 通过 npm 或 yarn 命令安装 x6 # npm $ npm install antv/x6 --save# yarn $ yarn add antv/x6安装完成之后&#xff0c;使用 import 进行引用 import { Graph } from antv/x6;通过 script 标签引入 可以使用下面三个 CDN 中的任何一个&#xff0c;默认返回…

几代WiFi有什么差异,它们有什么区别

最典型的差异指标&#xff1a;单流传输速率 第一代 基于的标准&#xff1a; 802.11 使用频率&#xff1a;2.4GHz 单流最大传输速率&#xff1a;2Mbit/s 第二代 基于的标准&#xff1a; 802.11b 使用频率&#xff1a;2.4GHz 单流最大传输速率&#xff1a;11Mbit/s 第三代 …

Anolis安装Jdk保姆级教学

前言 欢迎来到本博客&#xff0c;我们将带领你完成在Anolis操作系统上安装Java Development Kit&#xff08;JDK&#xff09;的详细过程。Anolis操作系统是一款基于Linux的轻量级操作系统&#xff0c;专为容器和云原生应用而设计。在Anolis上安装JDK将为你提供一个稳定、高效的…

洛谷:集合与前缀和

1.亲戚(并查集) #include<iostream> using namespace std; int n,m,p; int m1,m2,p1,p2; int f[5005];int find(int x)//查询根节点&#xff0c;根节点的标志是根节点的父节点是自己 {if(f[x]!x)f[x]find(f[x]);//路径压缩&#xff0c;父节点变为根节点,方便下次询问retu…

php中实现3DES算法(ECB加密模式PKCS5Padding填充)

讲道理&#xff0c;一提到3DES算法&#xff0c;首先想到的是要和java做交互了 现在3DES已经渐渐被抛弃了&#xff0c;尤其是ECB加密模式使用的更少了&#xff0c;但是没办法&#xff0c;业务需要&#xff0c;合作方用的是他&#xff0c;你头再铁也不能怎样&#xff0c;那就扒扒…

Python 简易图形界面库easygui 对话框大全(续)

目录 EasyGUI库 主要特点 使用场景 对话框样式 10. 文件打开框 fileopenbox 11. 文件保存框 filesavebox 12. 目录打开框 diropenbox 13. 索引对话框 indexbox 14. 例外报告框 exceptionbox 15. 代码文本框 codebox 16. 密码输入框 passwordbox 17. 多重文本框 mul…

成功软件项目的规划和管理策略

成功软件项目的规划和管理策略 在软件开发领域&#xff0c;成功的项目规划和有效的项目管理是确保项目按时交付、在预算内完成的关键要素。采用科学合理的规划和管理策略可以提高项目的可控性和成功交付的可能性。本文将介绍一些成功软件项目的规划和管理策略。 1. 明确的项目…

MySql数据库(3)——DML

一、DML DML&#xff08;Data Manipulation Language&#xff09;数据操作语言&#xff0c;常用语句&#xff1a; insert&#xff1a;输入delete&#xff1a;删除update&#xff1a;修改 插入数据 方式一&#xff1a;insert into 表名 &#xff08;列1&#xff0c;列2……&a…

Python开发雷点总结

数值运算&#xff08;加减乘除&#xff09; 1. invalid value赋值 当变量本身具有数值属性&#xff08;后续会参加数值运算&#xff09;&#xff0c;对invalid value设置应该为np.nan&#xff0c; 而非None&#xff1b;反之&#xff0c;容易抛出以下错误&#xff1a; TypeEr…

jmeter之beanshell使用:常用变量汇总

1.变量--日期 使用场景&#xff1a;当入参日期是变量&#xff0c;取当前日期 使用如下&#xff1a; &#xff08;1&#xff09;当前日期 import java.text.SimpleDateFormat; import java.util.Date;// 创建 SimpleDateFormat 对象并指定日期格式 SimpleDateFormat dateFor…

深入解析 C 语言中的 for 循环、break 和 continue

C语言中的 for 循环 当您确切地知道要循环执行代码块的次数时&#xff0c;可以使用 for 循环而不是 while 循环 for (语句 1; 语句 2; 语句 3) {// 要执行的代码块 }语句 1 在执行代码块之前执行&#xff08;一次&#xff09;。语句 2 定义执行代码块的条件。语句 3 在执行代…

价格成谜,小米汽车到底要卖给谁?

文&#xff5c;刘俊宏 编&#xff5c;王一粟 “不要再讲9.9万了&#xff0c;不可能的&#xff0c;也不要再讲14.9万&#xff0c;小米SU7是有理由的贵”&#xff0c;小米集团创始人、董事长雷军在12月28日的小米汽车技术发布会上&#xff0c;把价格作为最大的悬念留给了市场。…

【Python排序算法系列】—— 选择排序

​ &#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 选择排序 过程演示&#xff1a; 选择排序实现代码&#xff1a; 分析选择排序&#xff1a…

Grafana无法发送告警消息的飞书webhook(机器人)

1.问题描述 Grafana无法向飞书机器人发送报警消息&#xff0c;实测使用Grafana自带的webhook也不好使&#xff0c;对于用飞书办公的程序猿非常不便&#xff0c;后来发现一个报警神器&#xff0c;开源免费&#xff0c;关键是好用 PrometheusAlert 2.PrometheusAlert安装 Prom…

【办公软件】Excel双坐标轴图表

在工作中整理测试数据&#xff0c;往往需要一个图表展示两个差异较大的指标。比如共有三个数据&#xff0c;其中两个是要进行对比的温度值&#xff0c;另一个指标是两个温度的差值&#xff0c;这个差值可能很小。 举个实际的例子&#xff1a;数据如下所示&#xff0c;NTC检测温…

openGauss学习笔记-178 openGauss 数据库运维-逻辑复制-逻辑解码-使用SQL函数接口进行逻辑解码

文章目录 openGauss学习笔记-178 openGauss 数据库运维-逻辑复制-逻辑解码-使用SQL函数接口进行逻辑解码178.1 前提条件178.2 操作步骤 openGauss学习笔记-178 openGauss 数据库运维-逻辑复制-逻辑解码-使用SQL函数接口进行逻辑解码 openGauss可以通过调用SQL函数&#xff0c;…

构建高质量软件的测试策略和质量保障原则

在软件开发过程中&#xff0c;高质量的软件是确保项目成功的关键。为了实现这一目标&#xff0c;团队需要采用有效的测试策略和质量保障原则。本文将介绍一些构建高质量软件的测试策略和质量保障原则。 1. 全面的测试覆盖 确保所有关键功能和模块都经过全面的测试覆盖。采用单元…

go语言设计模式-单例模式

建造型设计模式-单例模式 是用来控制类型实例的数量的&#xff0c;当需要确保一个类型只有一个实例时&#xff0c;就需要使用单例模式。 即把实例的访问进行收口&#xff0c;不能谁都能 new 类&#xff0c;所以单例模式还会提供一个2访问该实例的全局端口&#xff0c;一般都会…

pip 下载太慢的解决办法,pip换国内源,pip换源

用pip安装python包的时候&#xff0c;如果系统没有进行相关设置&#xff0c;则用的源服务器是国外的&#xff0c;在国内访问非常慢&#xff0c;我们需要换成国内的源服务器&#xff0c;pip换源通过如下命令&#xff1a; pip config set global.index-url <源地址> 一、…