【docker】springboot 服务提交至docker

准备docker

(不是docker hub或者harbor,就是可以运行docker run的服务),首先确保docker已经安装。

本文以linux下举例说明:

shell 复制代码
systemctl stats docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2024-12-10 11:37:13 CST; 22h ago

确保是active 状态。

配置docker

参考
spingboot项目打包到docker镜像[保姆级教程]

经过测试配置放在/etc/docker/daemon.json中不行。还是报如下错误:

journalctl -xe
-- Unit docker.service has begun starting up.
Dec 10 11:13:55 hdp dockerd[2775612]: unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a flag and in the configuration file: hosts: (from flag: [fd://], from file: [unix:///var/r>Dec 10 11:13:55 hdp systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE
Dec 10 11:13:55 hdp systemd[1]: docker.service: Failed with result 'exit-code'.
# /etc/docker/daemon.json 和 /usr/lib/systemd/system/docker.service 冲突!

修改vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

重启docker
systemctl daemon-reload,systemctl restart docker

查看端口是否被监听:netstat -tuln | grep 2375

idea安装docker 插件

设置docker服务

设置idea docker 任务

构建Dockerfile

项目的根目录新建一个文件Dockerfile,名字无所谓(如:Dockerfile-prod),位置也无所谓。

FROM openjdk:8-jdk-alpine
# 镜像是从 openjdk:8-jdk-alpin 继承而来的

# ENV MY_PROFILE=prod # 从idea设置环境变量

EXPOSE 8501
# ARG JAR_FILE
# # 构建参数和 ENV 的效果一样,都是设置环境变量。
#所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。
#但是不要因此就使用 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的。
ARG WORK_DIR=/opt/aplications/docker-test

# springboot 项目一般使用jar外的config作为配置文件夹
RUN mkdir -p ${WORK_DIR}
RUN mkdir -p ${WORK_DIR}/config
# 设置当前dockerfile的默认工作目录,相当于linux的cd命令
WORKDIR ${WORK_DIR}

# ADD命令会将本机的文件复制至docker images中。同时单个文件复制可以修改文件名,也能使用*通配符复制多个文件。
# 此处路径以此dockerfile的位置为其实,本例dockerfile在子项目server的根目录,如果dockerfile在更深目录,可以使用../拼接目录。
ADD "build/libs/docker-test-1.0.jar" "docker-test.jar"
ADD "src/main/resources/log4j2.xml" "config/log4j2.xml"
ADD "src/main/resources/application.yml" "config/application.yml"
ADD "src/main/resources/application-${MY_PROFILE}.yml" "config/application-${MY_PROFILE}.yml"
# 本例需要使用springboot连接kafka并使用kerberos认证
ADD "src/main/resources/kafka-jaas.conf" "config/kafka-jaas.conf"
ADD "src/main/resources/user..keytab" "config/user.keytab"
ADD "src/main/resources/krb5.conf" "config/krb5.conf"
# 将bootJar 添加到镜像中根目录下 命令为 apprun.jar

# ADD "src/main/resources/hosts-${MY_PROFILE}" hosts # 从dockerfile修改host都会失败!!!

# 打印点日志
RUN java -version
RUN ls ${WORK_DIR}
RUN ls ${WORK_DIR}/config

# ENTRYPOINT 在容器启动后执行 java 命令来运行程序springboot的参数需要放在CMD中
ENTRYPOINT ["java","-jar", "/opt/aplications/docker-test/docker-test.jar"]
CMD ["--spring.profiles.active=${MY_PROFILE}"]

# ======= 其它的一些Dockerfile命令 ========== 这里我们没有用到不过还是提一下
#COPY package.json /usr/src/app/
#ADD 更高级的复制文件
#ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。
#CMD 指令就是用于指定默认的容器主进程的启动命令的。
#ENV 设置环境变量
#HEALTHCHECK 健康检查
#EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务

构建&运行

直接在idea运行docker任务即可

idea的docker插件会运行构建docker image,并推送至docker 服务运行container。

可以到linux中docker ps -a查看任务运行状态,任务失败了也不要紧, docker logs container名称/id查看运行日志。

springboot和kafka配置

application.yml

此处log4j2.xml所在的config目录就是dockerfile中add后的config目录,即config目录也是docker内的springboot jar文件相对目录。

yaml 复制代码
server:
  port: 8501

logging:
  config: config/log4j2.xml  # if linux: config/log4j2.xml, if win: server/src/test/resources/log4j2.xml
  level:
    org:
      apache:
        kafka: info
    root: info

kafka-jaas.conf

user.keytab所在的config目录也是docker内的springboot jar文件相对目录。

conf 复制代码
KafkaClient {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  useTicketCache=false
  keyTab="config/user.keytab"
  principal="user@XXXXX.COM"
  serviceName="kafka";
};

有一点需要注意,代码中使用最好绝对地址,可把相对路径转为绝对路径。

scala 复制代码
System.setProperty("java.security.krb5.conf", krb5Conf)
System.setProperty("java.security.auth.login.config", kafkaJaasConf)
相关推荐
亲持红叶3 分钟前
open-webui安装
docker·open-webui
伪装成塔的小兵13 分钟前
Windows使用docker部署fastgpt出现的一些问题
windows·docker·容器·oneapi·fastgpt
KingDol_MIni37 分钟前
Spring Boot 集成 T-io 实现客户端服务器通信
java·服务器·spring boot
后端码匠42 分钟前
Spring Boot3+Vue2极速整合:10分钟搭建DeepSeek AI对话系统
人工智能·spring boot·后端
计算机-秋大田1 小时前
基于Spring Boot的农产品智慧物流系统设计与实现(LW+源码+讲解)
java·开发语言·spring boot·后端·spring·课程设计
计算机毕设指导61 小时前
基于SpringBoot的城乡商城协作系统【附源码】
java·spring boot·后端·mysql·spring·tomcat·maven
华子w9089258591 小时前
基于数据可视化+SpringBoot+安卓端的数字化施工项目计划与管理平台设计和实现
java·spring boot·后端
橘猫云计算机设计1 小时前
基于Django的购物商城平台的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
java·数据库·spring boot·后端·django
2501_903238651 小时前
Spring Boot日志配置与环境切换实战
数据库·spring boot·后端·个人开发
尚学教辅学习资料3 小时前
基于SpringBoot+vue+uniapp的智慧旅游小程序+LW示例参考
vue.js·spring boot·uni-app·旅游