实际项目部署docker(替换jar,重新docker)和查看前端访问及nginx配置
一、前置信息和提出疑惑
docker-compose.yml 在/usr/kms-dev/下面
其中一个 容器服务配置
kms-admin-dev:
container_name: kms-admin-dev
image: kms/kms-admin:${KMS_VERSION:-latest}
build:
context: ./kms-admin
dockerfile: dockerfile
environment:
- TZ=Asia/Shanghai
- SPRING_PROFILES_ACTIVE=prod
- DB_PASSWORD=${MYSQL_ROOT_PASSWORD:-123456}
- JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5002
privileged: true
pid: host
devices:
- /dev/ttyAMA1:/dev/ttyAMA1
volumes:
- ./cert:/dataVolume/kms/cert
- ./kms-admin/dataVolume/kms:/dataVolume/kms
- ./kms-admin/temp:/dataVolume/temp
- ./kms-admin/log:/usr/local/skms/logs
- ./kms-admin/lib/libsgd.so:/usr/lib/libsgd.so
- ./kms-admin/lib/libsgd.so:/usr/lib64/libsgd.so
- ./kms-admin/lib/libQRNG.so:/usr/lib/libQRNG.so
- ./kms-admin/lib/libQRNG.so:/usr/lib64/libQRNG.so
- ./kms-admin/lib/libbusiness.so:/usr/lib/libbusiness.so
- ./kms-admin/lib/libbusiness.so:/usr/lib64/libbusiness.so
- ./kms-admin/lib/libplatform.so:/usr/lib/libplatform.so
- ./kms-admin/lib/libplatform.so:/usr/lib64/libplatform.so
- ./kms-admin/lib/libsdf_api.conf:/etc/libsdf_api/libsdf_api.conf
- ./kms-admin/jar/skms-admin.jar:/dataVolume/kms/skms-admin.jar # 测试用于经常更新jar包的情况
- ./kms-admin/jar/application.yml:/dataVolume/kms/application.yml # 测试用于经常更新application.yml的情况
- /etc/sysconfig/network-scripts:/etc/sysconfig/network-scripts
- /usr/sbin/ifconfig:/usr/sbin/ifconfig
- /usr/bin/cd:/usr/bin/cd
- /usr/local/bin/docker-compose:/usr/bin/docker-compose
- /usr/bin/docker:/usr/bin/docker
- /var/run/docker.sock:/var/run/docker.sock
- ./:/usr/kms
- /dev:/dev
ports:
- 0.0.0.0:9087:9088
- 0.0.0.0:5002:5002
depends_on:
- kms-mysql-dev
- kms-redis-dev
links:
- kms-mysql-dev
- kms-redis-dev
restart: always
这里配置能到
build:
context: ./kms-admin
dockerfile: dockerfile
/usr/kms-dev/kms-admin/ 这个目录有个dockerfile
# 基础镜像
FROM bitnami/java:1.8
USER root
# 创建目录
RUN mkdir -p /dataVolume/kms
# 指定路径
WORKDIR /dataVolume/kms
COPY ./jar/HAFsApi.jar /opt/bitnami/java/jre/lib/ext/HAFsApi.jar
COPY ./lib/libkey_manage.so /usr/lib/libkey_manage.so
COPY ./lib/libkey_manage.so /lib64/libkey_manage.so
COPY ./lib/libHAFsApi.so /lib64/libHAFsApi.so
COPY ./lib/config.ini /etc/grpc_config/config.ini
COPY ./lib/rddetector /usr/bin/rddetector
COPY ./lib/libSKFInterface.so /usr/lib/libSKFInterface.so
COPY ./lib/libSKFInterface.so /usr/lib64/libSKFInterface.so
COPY ./lib/libQRNG.so /usr/lib/libQRNG.so
COPY ./lib/libQRNG.so /usr/lib64/libQRNG.so
COPY ./lib/libbusiness.so /usr/lib/libbusiness.so
COPY ./lib/libbusiness.so /usr/lib64/libbusiness.so
# 启动系统服务
ENTRYPOINT ["java","-jar","skms-admin.jar"]
接着问了一个愚蠢问题:
把单体打包好的jar 放在/usr/kms-dev/kms-admin/jar/skms-admin.jar 是不用重新构建镜像?是不是因为 docker-compose.yaml 配置了 volumes: ./kms-admin/jar/skms-admin.jar:/dataVolume/kms/skms-admin.jar
这里ENTRYPOINT [“java”,“-jar”,“skms-admin.jar”] 能知道去/usr/kms-dev/kms-admin/jar目录下找jar包,这是约定还是原因让他知道去这里找jar
二、解析我的疑惑问题
一、核心结论
- 不用重新构建镜像的原因:正是因为docker-compose.yml中配置了volumes挂载,把宿主机/usr/kms-dev/kms-admin/jar/skms-admin.jar挂载到容器内/dataVolume/kms/skms-admin.jar,所以替换宿主机的 jar 包后,重启容器就能生效,无需重建镜像;
- ENTRYPOINT 找 jar 包的逻辑:ENTRYPOINT [“java”,“-jar”,“skms-admin.jar”] 本身不会自动找jar/目录,你看到的「能找到」是有隐藏的路径映射 / 容器内工作目录配置,而非「约定」,下面拆解具体原因
二、逐行拆解关键配置(理清路径映射)
先看你的docker-compose.yml和Dockerfile的核心关联:
- 挂载配置是「免重建镜像」的核心
volumes:
# 宿主机路径: 容器内路径
- ./kms-admin/jar/skms-admin.jar:/dataVolume/kms/skms-admin.jar
- 作用:把宿主机/usr/kms-dev/kms-admin/jar/skms-admin.jar(./对应/usr/kms-dev/),挂载到容器内/dataVolume/kms/skms-admin.jar;
- 效果:宿主机替换jar/下的 skms-admin.jar 后,容器内/dataVolume/kms/下的 jar 包会实时同步,重启容器就会运行新 jar 包,完全不用重建镜像(这是生产环境「热更 jar 包」的常用方式)
2.ENTRYPOINT 找 jar 包的真实逻辑
你的 Dockerfile 写的是ENTRYPOINT [“java”,“-jar”,“skms-admin.jar”],但这个命令能执行成功,绝对不是因为它「知道去 jar 目录找」
Dockerfile WORKDIR配置
# Dockerfile里有这行
WORKDIR /dataVolume/kms/
# 此时执行java -jar skms-admin.jar,等价于 java -jar /dataVolume/kms/skms-admin.jar
ENTRYPOINT ["java","-jar","skms-admin.jar"]
- 核心:WORKDIR是容器内的「工作目录」,执行java -jar skms-admin.jar时,会优先在WORKDIR目录下找这个 jar 包;
- 而volumes刚好把宿主机的 jar 包挂载到了WORKDIR目录,所以能找到
3.为什么宿主机要把 jar 包放/usr/kms-dev/kms-admin/jar/?
- 宿主机侧:jar/目录是人为规范(便于管理,和 Docker 无关),你也可以放/usr/kms-dev/kms-admin/abc/,只要volumes里的宿主机路径对应上就行;
- 容器侧:只认volumes配置的/dataVolume/kms/skms-admin.jar,和宿主机的jar/目录名称无关。
三、访问部署
一些部署疑惑可以参看blog: docker-compose一些配置疑惑
部署宿主机器ip: http://10.168.9.22/
先看你的docker-compose.yml 指定项目在:/usr/kms-dev/kms-admin/jar/aplication.yml 而volumes刚好把宿主机的 jar 包下面yml配置文件 挂载到了WORKDIR目录/dataVolume/kms/
- ./kms-admin/jar/application.yml:/dataVolume/kms/application.yml # 测试用于经常更新application.yml的情况
目前/usr/kms-dev/kms-admin/jar/ 下面skms-admin.jar 和 application.yml 都映射到容器内 /dataVolume/kms
看一下yml配置 端口配置(容器内是9088)
# 开发环境配置
server:
# 服务器的HTTP端口,默认为9088
port: 9088
servlet:
# 应用的访问路径
context-path: /
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# tomcat最大线程数,默认为200
max-threads: 800
# Tomcat启动初始化的线程数,默认值25
min-spare-threads: 30
但是上面看到docker-compose.yml把宿主9087映射到容器端口9088,可以通过访问宿主9087 访问这个服务。容器内部相互服务用9088访问
ports:
- 0.0.0.0:9087:9088
访问这个服务接口地址: http://10.168.9.22/9087
但是我要访问前端,要通过nginx,看看nginx 容器咋配置
docker-compose.yml 中nginx
kms-nginx-dev:
image: nginx:latest
volumes:
- ./kms-nginx/dist:/usr/share/nginx/html:ro
- ./kms-nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./kms-nginx/logs:/var/log/nginx
restart: always
ports:
- "82:80"
前端的dist 和nginx 配置修改 会映射到容器中
看看 nginx.conf 配置 cat nginx.conf,如何访问刚才后端容器
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /dev-api/ {
proxy_pass http://10.168.9.22:9087/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
所以页面访问 宿主的82端口就是容器80 nginx服务
http://10.168.9.22:82
四、项目上传jar简单指令
生成jar: 参考blog 单体服务打包
有了jar才执行下面这些上传步骤
1.WSL介绍
WSL 全称 Windows Subsystem for Linux(适用于 Linux 的 Windows 子系统)。它让你可以在 Windows 系统中直接运行 Linux 命令行工具和应用,不需要安装虚拟机或双系统
wsl --install
这个命令会自动完成以下所有操作:
- 启用 WSL 功能(无需手动去控制面板勾选)
- 安装默认的 Linux 发行版(通常是 Ubuntu)
- 安装 WSL 2 内核组件
- 将 WSL 2 设为默认版本
简单说,一条命令就能配好 Linux 环境。
2.使用方法
以管理员身份打开 PowerShell 或 CMD:
# 1. 安装 WSL
wsl --install
# 2. 重启电脑(安装完成后会提示)
# 3. 重启后,启动 Ubuntu 并设置用户名和密码
wsl
常用 WSL 命令

3.部署jar指令
部署宿主机器ip: http://10.168.9.22/
远程jar位置: /usr/kms-dev/kms-admin/jar/skms-admin.jar
本地项目地址: C:\Users\14317\Desktop\wzProfile\gitProject(idea终端默认就是项目地址)
在idea终端选择 PowerShell,执行如下命令:
wsl rsync -avz kms-admin/target/kms-admin.jar root@10.168.9.22:/usr/kms-dev/kms-admin/jar/skms-admin.jar

指令解析
- rsync: Linux 下的文件同步工具,支持增量传输(只传变化的部分)
- -avz:
- -a:归档模式(保留文件属性)
- -v:显示详细信息
- -z:传输时压缩 - kms-user/target/kms-user.jar: 源文件路径:你本地的 JAR 包(相对路径)
- root@10.168.9.22:/usr/kms-dev/kms-admin/jar/skms-admin.jar :
- root:远程服务器的登录用户名
- 10.168.9.22:远程服务器的 IP
- /usr/kms-dev/kms-admin/jar/skms-admin.jar: 远程文件存放路径
这里指令每次都要输入 root@10.168.9.22 的密码
在 WSL 的 Linux 环境中生成 SSH 密钥对,并把公钥复制到远程服务器,实现免密登录。
执行如下指令
wsl ssh-keygen -t rsa -b 4096
wsl ssh-copy-id root@10.168.9.22
- ssh-keygen: SSH 密钥生成工具
- -t rsa: 指定密钥类型为 RSA 加密算法
- -b 4096 指定密钥长度为 4096 位(比默认 2048 位更安全)

- ssh-copy-id: 把本机的公钥自动复制到远程服务器的工具
- root: 远程服务器的登录用户名
- 10.168.9.22: 远程服务器的 IP 地址

更多推荐
所有评论(0)