部署java项目到linux服务器

2023年 7月 19日 14.4k 0

 部署前需要做到:

1、适用windows的子系统linux系统“wsl2” ,使用wsl2就无需在虚拟机中进行linux系统的安装,具体参考:WSL操作指南_wsl使用_天使手儿的博客-CSDN博客

2、在linux中创建docker服务,具体参考:Ubuntu Docker 安装 | 菜鸟教程

做完以上准备工作后,开始部署java项目,笔者做的是前后端代码在一起的javaweb项目,所以只部署好jar包就能够正常运行项目,无需再部署前端,所以这部分只有部署后端的步骤。

部署java项目:

1、创建自己的目录,在目录里编写Dockerfile配置文件,如下:

FROM anapsix/alpine-java:8_server-jre_unlimited #基础镜像,一切根据基础镜像构建
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #镜像构建时被需要运行的命令
RUN mkdir -p /app
WORKDIR /app #镜像的挂载目录
EXPOSE 8080 #暴露的端口
ADD reggie_take_out-1.0-SNAPSHOT.jar ./ #会添加同目录下名叫reggie_take_out-1.0-SNAPSHOT.jar的文件 别忘了后头还有一个点,那个点就代表当前目录
CMD sleep 30;java -Xms1024m -Xmx2048m -Djava.security.egd=file:/dev/./urandom -jar reggie_take_out-1.0-SNAPSHOT.jar #指定这个容器启动的时候要运行的命令

dockerfile 常用指令如下:

FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,名字+邮箱
RUN #镜像构建的时候被需要运行的命令
ADD #步骤,tomcat镜像,这个tomcat压缩包,添加内容
WORKDIR #镜像的挂载目录
VOLUME #挂载的目录
EXPOST #保留端口配置
CMD #指定这个容器启动的时候要运行的命令,只有之后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量

2、在 Dockerfile 文件的存放目录下,执行构建动作。

编写如下命令:

docker build -t regiee_take_out:v5.0-dev .(冒号后指定版本)

或者可以将命令写入一个.sh脚本文件,之后执行脚本文件即可。

3、添加jar包到Dockerfile同目录中

执行命令:cp ~/../mnt/f/jar/*.jar ./

这句命令的含义是将~/../mnt/f/jar/.jar目录下的jar包复制到当前目录./中,而~/../mnt/f/jar/.jar目录对应的是本地windows系统F:jar/目录下的jar包,即~/../mnt/是linux目录 对应windows中f/jar/*.jar目录,将jar包放入F:jar/目录下即可同步到服务器上

4、镜像构建之后,开始构建容器

编写docker-compose.yml文件,如下:

version: '3.0'
services: # 可以指定多个服务
    regiee: #这个名字随便起 只要有意义
      restart: always # 自动开机启动
      image: regiee_take_out:v5.0-dev # 基于哪个镜像
      container_name: my_regiee_5.0 #容器名称
      ports: # 指定端口 可以是多个
         - 8888:8082

然后执行docker-compose up -d来启动容器,-d为后台运行

docker-compose down为关闭容器

5、执行docker logs -f 容器id 来查看日志是否启动成功

问题记录

1、每次重启电脑或者 WSL2 后,WSL2 子系统的 IP 地址就会发生改变,解决办法:

blog.csdn.net/manbu_cy/ar…

附上bat脚本:

@echo off
setlocal enabledelayedexpansion

::先停掉可能在跑的wsl实例
wsl --shutdown ubuntu
::重新拉起来,并且用root的身份,启动docker服务
wsl -u root service docker start
if !errorlevel! equ 0 (
    echo docker start success
    :: 看看我要的IP在不在
    wsl -u root ip addr | findstr "192.168.107.65" > nul
    if !errorlevel! equ 0 (
        echo wsl ip has set
    ) else (
        ::不在的话给安排上
        wsl -u root ip addr add 192.168.107.65/24 broadcast 192.168.107.0 dev eth0 label eth0:1
        echo set wsl ip success: 192.168.107.65
    )


    ::windows作为wsl的宿主,在wsl的固定IP的同一网段也给安排另外一个IP
    ipconfig | findstr "192.168.107.100" > nul
    if !errorlevel! equ 0 (
        echo windows ip has set
    ) else (
        netsh interface ip add address "vEthernet (WSL)" 192.168.107.100 255.255.255.0
        echo set windows ip success: 192.168.107.100
    )
)
pause

脚本创建完成后,记得一定要管理员运行!一定要管理员运行!一定要管理员运行!

我就是吃了一个这个大亏,在这个小问题上停滞了一天才解决。

2、容器中的项目数据无法持久化

方法一:

通过volume挂载进行 持久化到服务器,具体参考:

Docker——docker-volume原理_庄小焱的博客-CSDN博客_docker --volume

方法二:通过部署minio服务器进行图片的存储

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论