【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)
相关推荐
jiuri_121524 分钟前
Docker使用详解:在ARM64嵌入式环境部署Python应用
python·docker·容器
计算机学长felix1 小时前
基于SpringBoot的“面向校园的助力跑腿系统”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·后端
williamdsy1 小时前
【Docker】[特殊字符] Docker 部署完全指南 - 从本地开发到云服务器
服务器·docker·开发部署流程
黄思搏1 小时前
Docker基础教程 - 容器化部署入门指南
docker
Mr.小海1 小时前
gunicorn和docker冲突吗
docker·容器·gunicorn
java水泥工2 小时前
课程答疑系统|基于SpringBoot和Vue的课程答疑系统(源码+数据库+文档)
spring boot·vue·计算机毕业设计·java毕业设计·大学生毕业设计·课程答疑系统
Rocket MAN4 小时前
Spring Boot 缓存:工具选型、两级缓存策略、注解实现与进阶优化
spring boot·后端·缓存
程序定小飞6 小时前
基于springboot的民宿在线预定平台开发与设计
java·开发语言·spring boot·后端·spring
FREE技术7 小时前
山区农产品售卖系统
java·spring boot
摇滚侠9 小时前
Spring Boot3零基础教程,云服务停机不收费,笔记71
java·spring boot·笔记