一、手动构建

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

https://download.docker.com/win/static/stable/x86_64/

解压后,在 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

配置挂载目录

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐