【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)
相关推荐
杨DaB6 小时前
【SpringBoot】Swagger 接口工具
java·spring boot·后端·restful·swagger
Agome998 小时前
Docker之自定义jkd镜像上传阿里云
阿里云·docker·容器
昵称为空C8 小时前
SpringBoot接口限流的常用方案
服务器·spring boot
hrrrrb8 小时前
【Java Web 快速入门】十一、Spring Boot 原理
java·前端·spring boot
无能百分百8 小时前
阿里云服务器ECS安装Docker(CentOS 7.x)
docker
创码小奇客10 小时前
架构师私藏:SpringBoot 集成 Hera,让日志查看从 “找罪证” 变 “查答案”
spring boot·spring cloud·trae
Olrookie11 小时前
XXL-JOB GLUE模式动态数据源实践:Spring AOP + MyBatis 解耦多库查询
java·数据库·spring boot
waynaqua11 小时前
SpringBoot:听说你还不知道时区设置
spring boot
又是努力搬砖的一年11 小时前
SpringBoot中,接口加解密
java·spring boot·后端
风象南12 小时前
SpringBoot 自研运行时 SQL 调用树,3 分钟定位慢 SQL!
spring boot·后端