非spring项目打包为docker镜像

背景

  • 项目由JAVA编写,使用Netty作为web服务器,全系不采用Spring以及相关包
  • 采用Maven作为包管理器

目标:

  • 将项目打包为docker镜像,且项目配置文件采取外部指定目录配置

准备工作

开发环境为windows 10专业版

不同版本的Windows 如 家庭版、专业版等对于虚拟机的支持度不一样,主要要支持Hyper-V。如果你是家庭版,在安装Docker Desktop会一直失败,建议最好是用专业版,当然也不是说家庭版就没法使用了,只是更麻烦而已,此文章不再详细描述不同版本的windows安装docker的详细信息

  1. 安装Docker Desktop

  2. 部分UI,汉化

  3. 切换源

    • 点击右上角设置

    • 点击docker引擎

    • 修改为以下内容(此处列举了部分源,你可以使用其他的)

      {
        "builder": {
          "gc": {
            "defaultKeepStorage": "20GB",
            "enabled": true
          }
        },
        "experimental": false,
        "registry-mirrors": [
          "https://dockerproxy.com",
          "https://docker.mirrors.ustc.edu.cn",
          "https://registry.cn-hangzhou.aliyuncs.com",
          "https://docker.nju.edu.cn"
        ]
      }
      
  4. 拉取镜像

    • java (以下是示例)
      在这里插入图片描述

修改JAVA项目

此项目 maven build 使用了 3 个插件

  • maven-jar-plugin 用于构建可执行 JAR 文件

org.apache.maven.plugins
maven-jar-plugin

  • maven-dependency-plugin 将项目的依赖复制到一个指定的目录

org.apache.maven.plugins
maven-dependency-plugin

  • maven-resources-plugin 将项目中的资源文件从源目录复制到输出目录,或者打包时排除部分配置文件,此项目在打包时需要摒弃项目本身的配置文件,在项目启动时指定外部的配置文件

org.apache.maven.plugins
maven-resources-plugin

此项目 mvn package时,会将项目的主体JAR生成在target目录下,项目中使用的其他的依赖会打包到 target/lib 目录下

编写 Dockerfile

## 此处的 openjdk:8-jdk-alpine 为 准备工作中拉取的java镜像,如果准备工作没有进行,此处执行将会很慢
FROM openjdk:8-jdk-alpine

# 维护者信息
LABEL maintainer="amarone"

# 声明镜像名称和版本
LABEL org.opencontainers.image.title="amarone"
LABEL org.opencontainers.image.version="V0.1"

# 声明暴露端口
EXPOSE 8080

# 创建容器目录结构
RUN mkdir -p /app/libs /app/conf

# 从构建阶段复制构建产物
COPY /target/lib/* /app/libs/
COPY /target/main(主要的jar).jar /app/libs/

# 声明配置目录挂载点 用于容器启动指定外部的配置文件夹与容器内的映射
VOLUME /app/conf

# 创建启动脚本 此处一定先指定主要jar(因类加载机制)
RUN echo '#!/bin/sh' > /start.sh && \
    echo 'MAIN_JAR=$(ls /app/libs/main(主要的jar).jar)' >> /start.sh && \
    echo 'LIB_JARS=$(ls /app/libs/*.jar | grep -v "$(basename $MAIN_JAR)" | tr "\n" ":")' >> /start.sh && \
    echo 'java -XX:+UseG1GC -Xms500m -Xmx500m -DOUE_LOG_TYPE=slf4j -cp "$MAIN_JAR:$LIB_JARS/app/conf" 主要类的权限定名' >> /start.sh && \
    chmod +x /start.sh

# 设置启动命令
CMD ["/start.sh"]

构建镜像

在项目根目录,dockerfile统计目录下使用终端指定命令。 命令后的 . 一定别忘了

docker build -t 名称:版本 .

导出镜像

docker save -o 镜像压缩包名.tar 名称:版本

导入镜像

docker load -i 镜像压缩包名.tar

运行镜像

docker run --name xw -d -p 8080:8080 -v
/home/conf/:/app/conf 名称:版本

8080:8080 为宿主机端口与容器端口映射

/home/conf/:/app/conf为宿主机配置文件所在目录挂载到容器的指定目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值