Docker 构建 Jar 镜像
一、手动构建 1. 构建 DockerFile 创建项目目录 mkdir /usr/local/docker/app cd /usr/local/docker/app 将项目打包上传到目录 # Jar 包 /usr/local/docker/app/demo.jar # 配置文件 /usr/local/docker/app/config/application.yml 在目录下创建 Dockerf
一、手动构建
1. 构建 DockerFile
创建项目目录
mkdir /usr/local/docker/app
cd /usr/local/docker/app
将项目打包上传到目录
# Jar 包
/usr/local/docker/app/demo.jar
# 配置文件
/usr/local/docker/app/config/application.yml
在目录下创建 Dockerfile 文件
FROM openjdk:17.0.2-oraclelinux8
# 创建容器文件夹
RUN mkdir -p /app/logs \
/app/config
# 切换工作目录 , 相当于 cd
WORKDIR /app
# 将 jar 包添加到容器中 , tar 类型文件会自动解压(网络压缩资源不会被解压) , 可以访问网络资源 , 类似 wget
ADD demo.jar ./app.jar
# 功能和 ADD 相同 , 不会自动解压文件 , 也不能访问网络资源
# COPY ./lib/ ./lib
# 映射端口
EXPOSE 80
# ENTRYPOINT 或 CMD 只会执行一次 , 会覆盖之前的 ENTRYPOINT 或 CMD 命令
ENTRYPOINT ["java" , "-jar" , "app.jar"]
构建镜像
docker build -t app:1.0 .
2. 创建并启动容器
方式1. docker 启动
docker run -d --network host --name app -p 80:80 -v ./config/:/app/config app:1.0
方式2. docker-compose 启动
创建 docker-compose-app.yml 文件
version: '3'
services:
app:
image: app:1.0
container_name: app
environment:
TZ: Asia/Shanghai
SERVER_PORT: 8080
volumes:
- /usr/local/docker/app/logs/:/app/logs/
- /usr/local/docker/app/config/:/app/config/
restart: always
privileged: true
network_mode: "host"
启动容器
docker compose -f docker-compose-app.yml up -d
3. 更新 Jar 包
停止并删除镜像
docker stop app
docker rm app
docker rmi app:1.0
重新构建镜像并启动
cd /usr/local/docker/app
docker build -t app:1.0 .
docker compose -f docker-compose-app.yml up -d
扩展:ENTRYPOINT 和 CMD 区别
需求:想追加一个命令
-l
, 期望执行ls -al
1. CMD
docker run 会覆盖 CMD 后面的命令
FROM centos
CMD ["ls","-a"]
此时命令在 docker 启动后自己执行, 我们可以在命令行启动 docker 镜像时, 执行其他命令行参数, 覆盖默认的 CMD
$ docker run demo -l
此时会报错 , '-l' 替换了 'ls -a' 命令 , 没有这个命令导致报错
2. ENTRYPOINT
FROM centos
ENTRYPOINT ["ls","-a"]
docker run 不会覆盖 entrypoint 后面的命令,需要使用 --entrypoint
命令覆盖
$ docker run --entrypoint demo -l
此时会报错 , '-l' 替换了 'ls -a' 命令 , 没有这个命令导致报错
$ docker run demo -l
成功执行命令 'ls -al'
二、idea构建
1. 配置环境
Idea 安装 docker 插件
配置服务器SSH连接
进入 Settings -> Tools -> SSH Configurations
点击加号创建SSH连接配置
配置服务器FTP连接
进入 Settings -> Build-> Deployment
点击加号 选择SFTP 创建 FTP 连接配置
配置 docker 连接
测试 docker 连接
配置运行看板
连接远程 docker 后可以查看容器实时日志,执行 启动 重启 停止 等操作
2. 配置 Dockerfile
在项目目录下创建 Dockerfile 文件
FROM openjdk:8
RUN mkdir -p /backend/system/logs \
/backend/system/temp && chmod -R 777 /backend/system/temp
WORKDIR /backend/system
ADD ./target/backend-system.jar ./app.jar
ENV JAVA_OPTS="-Xms256m -Xmx512m"
ENV SERVER_PORT=9201
EXPOSE ${SERVER_PORT}
# 修改成东八区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
ENTRYPOINT java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} -jar app.jar
配置启动命令
点击添加端口配置
配置端口映射
点击 Run 运行,进行构建并上传镜像文件到服务器,此时在 idea 可以查看容器日志并进行启停操作
3. 安装遇到的问题
问题描述
Idea 使用版本是 2023.x 或以前,运行 dockerfile 时,可以正常运行构建,但是在更新到 2024 版本后,idea 无法正常构建 dockerfile,提示 docker.exe 找不到
解决办法
网上解决方案是在 windows 本地安装 docker,此方法太过繁琐,以下是其他博主找到的替代方案,简单方便
下载 docker.exe
解压后,在 idea 中配置 docker.exe 的位置
安装 buildx 工具
https://github.com/docker/buildx/releases/download/v0.17.1/buildx-v0.17.1.windows-amd64.exe
在用户文件夹下(在文件管理地址栏输入 %USERPROFILE%
定位),新建 .docker
文件夹,下面再新建一个 cli-plugins 文件夹,将文件重命名为 docker-buildx.exe
,放入该文件夹中即可
4. 扩展:清理旧镜像
构建完 docker 镜像后,旧镜像标签和库名都是
<none>
如果每次使用的都是同一个版本号,那么再重新构建的时候,docker 底层会指向最新的镜像;旧的镜像,一旦失去了docker 的引用,就会变成 <none>
,所以在构建的时候,要使用不同的版本号或者直接清理旧镜像容器,释放资源
清理 none 镜像
docker image prune -f
清理缓存
# 删除所有未使用的镜像、容器、网络和卷,这个命令会询问你是否确定要删除
docker system prune
# 删除所有未引用的镜像,而不仅仅是未使用的镜像。
docker system prune -a
5. 扩展:启动命令配置
配置 command
如果 dockerfile 中是 CMD 命令,会被当前命令覆盖
注:此处只是示例,--network host
仅适用于 Linux 主机,Windows 环境下,在 idea 中直接启动 nacos 容器,即使指定了 --network host
,Docker 也会忽略这个参数,并默认使用 bridge 模式,会导致网络设置错误,其他服务访问不到配置文件。
解决:在 idea 中构建镜像和容器,用命令在 Linux 服务器上执行启动
docker run -d --name nacos --network host -e MODE=standalone nacos:latest
配置挂载目录
更多推荐
所有评论(0)