部署前需要做到:
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服务器进行图片的存储