首页 > 编程语言 >docker构建打包java项目

docker构建打包java项目

时间:2023-11-26 22:46:12浏览次数:46  
标签:web java 容器 demo redis docker data 打包

docker构建打包java项目

简介

本项目用于 研究和实践 docker的工作流部署发布

查看github源码

技术栈

  • spring-web (RESTAPI 请求交互)
  • redis (用于实验 多容器通信)
  • maven

docker常用命令

docker --help 可查看帮助指令

查看 镜像列表

docker image ls

查看 容器列表

docker container ls

查看 日志

docker logs [容器containerId]

docker部署

1. docker创建网络空间,以便多容器在同网络里可通信

docker network create web-demo-net

2. 获取redis镜像

docker pull redis:latest
  • :latest拉取最新版镜像

3. redis镜像运行成容器

docker run -d -p 6379:6379 \
--name web-demo-redis \
--network web-demo-net \
--network-alias redis-net \
-v redis-data:/data \
redis:latest
  • -d 后台启动
  • -p 6379:6379 容器的端口(:后面的6379) 映射 成 宿主机的端口(:前面的6379)
  • --name 给容器命名
  • --network 指定使用的网络空间,同网络空间的容器才可通信
  • --network-alias 指定本容器所使用网络地址的别名:redis-net, web项目配置文件中的redis连接host即为 redis-net ,(很重要!相当于分配独有有ip地址)
  • -v 指定数据卷映射,其中redis-data是创建的数据卷名称,实际物理数据在宿主机,逻辑数据在容器中。其中/data为容器应用生成的数据路径
  • redis:latest 指定生成容器所使用的镜像名和版本标签

4. docker打包web项目为镜像

Dockfilebuild文件编写

# 获取运行环境
FROM    openjdk:17
# 把本地文件目录 解析到 容器目录(容器若没有会自动创建文件夹)
ADD     ./target/web-demo.jar   /usr/local/workspace/web-demo/web-demo.jar
# 设置工作目录空间,方便后续操作指令
WORKDIR /usr/local/workspace/web-demo
# 执行指令
CMD     java -jar web-demo.jar

打包命令

docker buildx b -t web-demo:v1 .
  • -t 命名镜像名称, :v1 指定版本标签tag
  • . 构建目录为当前目录

5. web-demo镜像运行成容器

docker run -d -p 8080:8080 --name web-demo --network web-demo-net web-demo:v1

6. 宿主机访问web应用测试

  • localhost:8080
  • localhost:8080/hello

docker备份容器数据

利用中转容器 目录挂载 获取 数据卷

docker run --rm \
 --volumes-from web-demo-redis \
 -v ~/backup:/backup \
  debian \
  tar cvf /backup/redis-data.tar /data
  • --rm 作为临时容器启动,运行后即删除容器
  • --volumes-from 数据卷挂载来源 web-demo-redis
  • -v 数据卷映射目录,冒号:前的~/backup是宿主机的绝对路径,不再是上文中redis-data模式新建的数据卷名称,它用来真正接收压缩的备份文件。冒号:后的/backup是中转linux系统的目录,用来中转临时保存容器的压缩数据。
  • debian 是指定的临时系统镜像名,可使用其他系统镜像,如ubuntu等。
  • tar linux系统常用解压缩工具,这里是把 复制的数据卷目录/data压缩为 /backup/redis-data.tar

已经备份结束,可在宿主机的 ~/backup目录查看到压缩的备份文件 redis-data.tar

docker恢复容器数据

测试时,可docker volume rm redis-data删除数据卷,来模拟丢失数据

利用中转容器 目录挂载 获取 备份文件

docker run --rm \
 --volumes-from web-demo-redis \
  -v ~/backup:/backup \
  debian \
  bash -c "cd /data/ && tar xvf /backup/redis-data.tar --strip 1"
  • --strip 1表示tar工具解压时去掉前面1层目录,这里去掉了tar压缩包里的/data/目录,根据压缩时确定层级路径是否需要此参数

备份已完成, dump.rdb 已经是旧数据文件

docker compose 一件启动应用

上文手动启动redis容器,再启动web-demo容器,docker compose 可以 实现自动化一键启动所以服务容器

修改网络空间配置

上文中是手动配置web容器和redis容器的网络空间 web-demo-net, docker compose 无需配置,自动会在同个网络内,所以去掉web项目中的配置

修改 application-prod.ymlhost: redis-netcompose.yaml里设置的服务名redis

spring:
  data:
    redis:
#      host: redis-net  
      host: redis
      port: 6379

编写 compose.yml

services:

  web-demo:
    # 当前目录下的Dockerfile构建
    build: .
    ports:
      - '8080:8080'
    # 也给web项目一个数据卷
    volumes:
      - web-demo-data:/usr/local/workspace/web-demo
    environment:
      - TZ=Asia/Shanghai

  redis:
    image: 'redis:latest'
    volumes:
      - redis-data:/data
    environment:
      - TZ=Asia/Shanghai

volumes:
  web-demo-data:
  redis-data:

启动 compose

在 compose.yaml目录

docker compose up

标签:web,java,容器,demo,redis,docker,data,打包
From: https://www.cnblogs.com/liyaocool/p/17858121.html

相关文章

  • 透析Java本质的36个话题02运算符与表达式
    1.莫衷一是——i+++j该如何计算?三个加号​ 在java中默认前面结合也就是(i++)+jinti=25;intj=2;intresult=i+++j;System.out.println(i);System.out.println(j);/*262*/贪心规则编译器的贪心规则,分析符号......
  • 透析Java本质的36个话题第四章 04构造器与变量(不全)
    1.相差无几-main方法很“特殊”吗?1.main方法的重载。2.调用main方法。3.继承main方法。4.隐藏main方法。5.main方法抛出异常。6.带有类型参数。main方法的重载​ 可以编译通过,但是找不到程序入口publicstaticvoidmain(){}staticvoidmain(){}......
  • Java设计模式之命令模式
    命令模式介绍命令模式是一种行为类设计模式,核心是将每种请求或操作封装为一个独立的对象,从而可以集中管理这些请求或操作,比如将请求队列化依次执行、或者对操作进行记录和撤销。命令模式通过将请求的发送者(客户端)和接收者(执行请求的对象)解耦,提供了更大的灵活性和可维护性。下......
  • Java learning Day2 常量 变量 运算符 Scanner 方法 数组
    常量:字面值常量(直接写值的常量)+自定义常量变量:long型变量后必须加L;小数字面值常量默认double 若用float需加F;变量强转:小的会自动转成大的float虽然只有4个字节但是比所有整型的取值范围都大    浮点型有精度问题  表达式类型提升:如果表达式当中存在多种数......
  • 透析Java本质的36个话题03String类
    1.来龙去脉-“+”是怎么连接字符串的?“+”号对String对象的连接OracleJDK1.7的实现: 当使用+字符串拼接,会创建一个临时的StringBuilder对象,该对象调用append连接操作。 类似于StringBuilder.append(s1).append(s2).toString;"+"的性能如果是在循环中对String对象进......
  • Java守护线程
    Java中的线程分为两类,分别为daemon线程(守护线程)和user线程(用户线程)。在JVM启动时会调用main函数,main函数所在的钱程就是一个用户线程。其实在JVM内部同时还启动了很多守护线程,比如垃圾回收线程。那么守护线程和用户线程有什么区别呢?区别之一是当最后一个非守护线程束时,JV......
  • java Math
    packagenet.elaina.math;publicclassTest1{publicstaticvoidmain(String[]args){//abs获取参数绝对值//System.out.println(Math.abs(88));//88//System.out.println(Math.abs(-88));//88//bug://以int类型为......
  • Java开发者的Python快速进修指南:面向对象进阶
    在上一期中,我们对Python中的对象声明进行了初步介绍。这一期,我们将深入探讨对象继承、组合以及多态这三个核心概念。不过,这里不打算赘述太多理论,因为我们都知道,Python与Java在这些方面的主要区别主要体现在语法上。例如,Python支持多重继承,这意味着一个类可以同时继承多个父类的属性......
  • Java开发者的Python快速进修指南:面向对象--高级篇
    首先,让我来介绍一下今天的主题。今天我们将讨论封装、反射以及单例模式。除此之外,我们不再深入其他内容。关于封装功能,Python与Java大致相同,但写法略有不同,因为Python没有修饰符。而对于反射来说,我认为它比Java简单得多,不需要频繁地获取方法和属性,而是有专门的方法来实现。最后,我......
  • 文件查找,打包压缩及解压
    9.1文件查找使用which命令在环境变量PATH设置的目录中查找符合条件的命令文件。使用locate命令查找还可以使用find命令查找(速度较慢)添加-ls可以查看文件的详细信息还可以通过-maxdepth指定查找的目录的深度。另外,find命令还可以根据时间查找、根据文件属主或属组查找以及根据文......