一.前言
关于这个问题我想应该有很多小伙伴都遇到过,我把网上的大多数方法都试过一遍,发现没有任何作用,今天由于一次偶然的尝试,使我成功的解决的这个困扰我许久的问题。
二.环境说明
安装必要的软件和环境配置
相信大家能看这篇文章一定早就准备好了必要的环境(docker desktop安装、windows开启Hyper-V、WSL、kafka安装),如果还有未准备好的可以在本站搜一搜windows下的docker安装就行了,在这里就不多做论述。
三.上传并启动
3.1上传自己的springboot项目镜像
3.1.1修改配置文件
首先我们需要在自己的springboot项目的配置文件中修改kafka的brokers,将IP改为本机的IP
server:
port: 8070
spring:
application:
name: KafkaDemo
cloud:
stream:
kafka:
binder:
brokers: 10.161.78.114:9092
configuration:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
bindings:
input-in-0:
destination: MyTopic
group: my-group
output-out-0:
destination: MyTopic
#这是我的yaml配置文件,我所使用的是springcloudstream框架,
#大家也可以试一试,可以大大减少kafka配置的工作量
在这里如果大家使用的是localhost:9092的话,你打包到docker上运行的话会出现找不到这个端口的错误警告,即便你宿主机运行了kafka,原因就是端口映射找不到,为了避免这样的情况,我也是直接修改的IP设置,这也是今天我尝试的方法。
3.1.2创建一个Dockerfile文件
在修改完配置文件之后,我们需要在我们springboot根目录中创建一个名字为Dockerfile的文件,并对项目进行clean,目的是清理环境,保证打包项目的干净,然后编写Dockerfile文件
FROM openjdk:17-jdk-slim
LABEL maintainer=rain
# 设置工作目录
WORKDIR /app
# 复制编译好的 JAR 文件到容器中
COPY target/KafkaDemo-0.0.1-SNAPSHOT.jar /app
# 暴露容器的端口,Spring Boot 默认使用 8080 端口
EXPOSE 8070
# 容器启动时运行的命令
CMD ["java", "-jar", "/app/KafkaDemo-0.0.1-SNAPSHOT.jar"]
#大家直接复制就好,但是这个KafkaDemo-0.0.1-SNAPSHOT.jar需要改成自己的项目名字
#名字的获取方法可以在pom中查看,也可以等待package后在target/目录下直接复制
3.1.3打包项目并上传到docker
在完成上一步之后进行package打包项目,等待打包完成之后,在项目的命令行输入
docker build -t my-spring-boot-app .
===================================以下是说明===============================================
docker build: 这是 Docker 命令行工具,用于构建 Docker 镜像。
-t my-spring-boot-app: 这里的 -t 选项用来给镜像指定一个标签或名称,这里是 my-spring-boot-app。标签通常用于标识和管理镜像。
.: 这个点表示 Docker 构建上下文的路径。Docker 构建上下文是构建过程中用来定位 Dockerfile 和其他构建上下文文件的路径。在这个例子中,它假设 Dockerfile 是在当前目录下。
等待命令执行完成,可能需要一定的时间,我运行的时候开了VPN才下载完成,具体的问题可以去看看本站的其他博主
3.2启动镜像项目
首先我们需要明白在docker中,容器的端口是不会与宿主机互通的,也就是你在docker中部署的项目如果没有与宿主机建立端口映射就无法正常访问服务。因此我们需要修改启动参数,在这里我推荐使用在微软中下载的Ubuntu进行启动,输入以下命令
docker run -p 8070:8070 --add-host host.docker.internal:10.161.78.114 my-spring-boot-app
===================================以下是说明===============================================
docker run: 这是 Docker 命令行工具,用于运行一个 Docker 容器。
-p 8070:8070: 这个选项指定将容器内部端口 8070 映射到主机的端口 8070。这样,外部系统可以通过主机的 8070 端口访问容器中运行的应用程序。
--add-host host.docker.internal:10.161.78.114: 这个选项允许将自定义主机名映射到指定的 IP 地址。在这里,host.docker.internal 是 Docker 容器内部访问宿主机的标准主机名,映射到 IP 地址 10.161.78.114。
my-spring-boot-app: 这是要运行的 Docker 镜像名称,即之前使用 docker build 命令构建的镜像名称。
然后等待运行结果,如果没有WARN的字样说明项目成功部署并启动,然后打开网页输入对应的端口访问即可
四.总结
可能部分细节我还没说清楚,请遇到问题的小伙伴在评论区提出自己的疑问,以便我及时看到并提供力所能及的帮助,同时也望大家指出我说错的地方,相互进步。
如果有需要源代码的小伙伴请在评论区留言,我可以上传到github上。
大家生活愉快,天天开心啊!