Docker - 容器化运行 MySQL Redis Nginx 以及 SpringBoot 应用程序

博文目录


环境准备

首先确保 SpringBoot 项目依赖的中间件可用

容器之间互相访问, 包括中间件容器和连接中间件的应用程序容器, 建议都通过 --network 的方式将容器配置在同一个网络中

同网络中的容器通过将 目标容器的名称 配置成为 Host 来互相访问

docker network create test
docker run -d --name redis.springboot -p 6379:6379 --network test -e TZ=Asia/Shanghai -v redis:/data redis:7.2.4 redis-server /data/redis.conf
docker run -d --name mysql.springboot -p 3306:3306 --network test -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=Mrv587.. -v mysql:/var/lib/mysql -v mysql.conf:/etc/mysql/conf.d mysql:8.3.0
docker run -d --name nginx.springboot -p 80:80 --network test -e TZ=Asia/Shanghai -v nginx.conf:/etc/nginx -v nginx.html:/usr/share/nginx/html -v nginx.log:/var/log/nginx nginx:1.24.0

SpringBoot

创建工程

通过 Idea Spring Initializr 创建一个 Web 应用, 集成上面配置的 Redis 和 MySQL, 写个 Controller 能做简单的查询即可. 确保本地能够正常运行, 然后通过 Maven 打包成为可执行 Jar

在打包和构建前, 配置 Redis 和 MySQL 的 IP 为 对应容器的容器名称

# 连接的 redis 的 host 为之前创建的 redis 容器的名称 redis.springboot
spring.data.redis.host=redis.springboot
# mysql 同理
spring.datasource.url=jdbc:mysql://mysql.springboot:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai

创建镜像

在项目根目录创建 Dockerfile 文件, 按需修改

# 基于 OpenJDK 21 镜像构建新的 Docker 镜像。这将作为基础镜像,用于运行 Spring Boot 应用程序。
FROM openjdk:21

# 指定维护者信息
LABEL maintainer="coder"

# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 设置 ll (ls -l) 别名
RUN echo "alias ll='ls -l'" >> /root/.bashrc

# 安装 less
RUN apt update && apt install -y less

# 指定容器内的工作目录
WORKDIR /app

# 将本地 /target 目录下所有的 .jar 文件复制到容器中的 /app 目录,并将其中的第一个 .jar 文件重命名为 springboot.jar。
# 这假定您已经在构建 Spring Boot 应用程序时将其打包为一个可执行的 JAR 文件,并将其放置在 target 目录中。
COPY target/*.jar /app/springboot.jar

# 将容器内部的 8080 端口暴露出来,以便外部(主机)可以访问应用程序运行的端口。
EXPOSE 8080

# 启动程序

# ENTRYPOINT 用于指定容器启动时要执行的可执行文件或命令。
# 如果在 Dockerfile 中指定了 ENTRYPOINT,则任何通过 docker run 命令提供的参数都将被传递给 ENTRYPOINT 指定的命令作为参数。
# 如果 ENTRYPOINT 指定的命令是可执行文件,那么 CMD 中提供的任何命令都将作为参数传递给该可执行文件。
# ENTRYPOINT 通常用于定义容器的主要运行程序,例如应用程序的可执行文件或者 shell 脚本。

# 设置容器启动时要执行的命令为 java -jar /app/springboot.jar。
# 这将启动 Java 虚拟机(JVM),并运行 Spring Boot 应用程序的 JAR 文件。
ENTRYPOINT ["java", "-jar", "/app/springboot.jar"]

# CMD 用于提供容器默认的执行参数,它可以是可执行命令,也可以是参数。
# 如果 Dockerfile 中同时存在 CMD 和 ENTRYPOINT,那么 CMD 中的命令或参数将被视为 ENTRYPOINT 命令的默认参数。
# 如果在运行容器时没有提供参数,那么 CMD 中指定的命令将作为容器启动时执行的默认命令。
# 如果在运行容器时提供了参数,这些参数将覆盖 CMD 中指定的默认参数。

# 设置容器的默认参数为 --server.port=8080 和 --logging.file.name=/app.out。
# 这些参数将作为 ENTRYPOINT 命令的默认参数传递给 SpringBoot 应用程序。
CMD ["--server.port=8080", "--logging.file.name=/app/out"]

执行构建

docker build -t springboot:1.0.0 .

运行容器

# 通过 Nginx 转发的话, 可不绑定端口映射 -p 8080:8080
docker run -d --name springboot -p 8080:8080 --network test springboot:1.0.0

此时, 在浏览器访问 http://ip:8080/user/list 即可获得正确的响应了, 查看应用容器日志, 有正确的反馈

在这里插入图片描述

# 查看网络 test 连接的容器
docker network inspect test

在这里插入图片描述

代理

location /springboot {
	# host 同样配置成 应用容器的名称
	# proxy_pass 后面的 url 中含有 uri 部分的(端口之后的内容, 包括单独一个 /), 请求匹配到 /springboot 后, 会把请求 uri 中的 /springboot 去掉, 然后拼到 proxy_pass 指定的 url 后面
	# 访问 localhost:80/springboot/user/list, uri 是 /springboot/user/list, 剔除 /springboot 剩余 /user/list, 拼接后为 http://springboot:8080/demo/user/list, 完成代理转发
    proxy_pass http://springboot:8080/demo;
}

访问 localhost:80/springboot/user/list 同样可以访问到服务

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值