【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)
相关推荐
HalvmånEver2 小时前
7.高并发内存池大页内存申请释放以及使用定长内存池脱离new
java·spring boot·spring
凤山老林2 小时前
SpringBoot 使用 H2 文本数据库构建轻量级应用
java·数据库·spring boot·后端
小夏卷编程2 小时前
Ubuntu 20.04.4 宝塔 docker showdoc v3.2 更新到v3.7.3
运维·docker·容器
JEECG低代码平台3 小时前
JeecgBoot低代码平台 Docker 部署 OnlyOffice 文档服务完整指南
低代码·docker·容器
dreamread3 小时前
【SpringBoot整合系列】SpringBoot3.x整合Swagger
java·spring boot·后端
把你毕设抢过来3 小时前
基于Spring Boot的社区智慧养老监护管理平台(源码+文档)
数据库·spring boot·后端
生活爱好者!3 小时前
NAS帮我找回童年的快乐!部署 小游戏
运维·服务器·docker·容器·娱乐
闻哥3 小时前
深入Redis的RDB和AOF两种持久化方式以及AOF重写机制的分析
java·数据库·spring boot·redis·spring·缓存·面试
自在极意功。4 小时前
nginx和docker面试题
运维·nginx·docker
毕设源码_廖学姐6 小时前
计算机毕业设计springboot古诗词学习App 基于SpringBoot的中华经典诗文数字化研习平台 SpringBoot框架下的传统诗词文化移动学习系统
spring boot·学习·课程设计