背景
- 项目由JAVA编写,使用Netty作为web服务器,全系不采用Spring以及相关包
- 采用Maven作为包管理器
目标:
- 将项目打包为docker镜像,且项目配置文件采取外部指定目录配置
准备工作
开发环境为windows 10专业版
不同版本的Windows 如 家庭版、专业版等对于虚拟机的支持度不一样,主要要支持
Hyper-V
。如果你是家庭版,在安装Docker Desktop
会一直失败,建议最好是用专业版,当然也不是说家庭版就没法使用了,只是更麻烦而已,此文章不再详细描述不同版本的windows安装docker的详细信息
-
部分UI,汉化
-
切换源
-
点击右上角设置
-
点击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" ] }
-
-
拉取镜像
- java (以下是示例)
- 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为宿主机配置文件所在目录挂载到容器的指定目录