docker部署spring boot,配置redis/mysql——篇二

本文讲述了如何通过docker-compose部署MySQL,解决配置文件问题,并介绍远程连接设置。还讲解了如何自定义配置并部署Redis,包括修改权限和构建自定义镜像。

紧接上篇已经讲过docker部署jar工程
接下来讲部署MySQL并且配置数据卷
我之前是一个mysql目录下建data文件夹防止MySQL数据的,conf文件夹放置配置文件hmf.cnf的
在这里插入图片描述
在这里插入图片描述
然后docker-compose.yml文件运行
在这里插入图片描述

但是这样部署后会出现不能初始化配置文件以及The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets等各种问题
所以我尝试第二种方法,远程连接数据库(前提是开放安全组的3306端口,开启MySQL远程连接权限,以及MySQL容器端口映射)
1、开启MySQL远程连接权限
先运行mysql镜像,
docker run --name mysql888(容器名字随意) -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=设置密码 mysql:8.0(镜像名称)
然后docker exec -it mysql888 /bin/bash进入容器
mysql -u root -p 输入mysql密码进入MySQL命令控制台

use mysql;使用数据库mysql
select host,user from user;查看用户以及连接的主机
update set host = ‘%’ where user = ‘root’;修改权限root用户可以任何主机IP登录
flush privileges;刷新
可以了,用navicat远程连接就可以了(安全组开放3306端口别忘了
在这里插入图片描述

redis部署以及配置

因为原始redis配置和自己配置不一样所以要自定义配置文件
你先自己在本地下载一个redis-6.2.6.tar.gz
解压复制redis.conf文件
修改以下几项
bind 127.0.0.1 -::1 注释掉不要
protected-mode yes
daemonize no
在你的服务器下建立类似以下的文件结构,新建Dockerfile文件以及上传redis.conf
在这里插入图片描述
cd 到redis目录下
构建自定义镜像
docker build -t myredis .
运行容器
docker run --name myredis -d -p 6379:6379 myredis
下一篇分享部署vue+nginx过程

<think> 我们正在讨论如何连接Docker中的Spring Boot应用容器与Redis容器。根据引用内容,有几种方法可以实现连接。关键点在于网络配置容器间的通信方式。 引用[1]提到,当Spring Boot应用运行在宿主机上时,可以通过localhost访问Docker容器,因为端口被映射到了宿主机。但是,当Spring Boot应用也在容器中时,我们需要采用不同的方法。 引用[2][3]提供了在Docker部署Spring Boot应用并连接Redis的方法。主要步骤包括: 1. 创建一个Docker网络,将Spring Boot容器Redis容器连接到同一个网络中。 2. 在Spring Boot应用的配置中,使用Redis容器的服务名(或IP地址)来连接。 具体步骤: 步骤1:创建Docker网络 在启动容器之前,创建一个自定义网络,这样容器可以通过容器名称相互访问。 ```bash docker network create backend-network ``` 步骤2:启动Redis容器并加入网络 根据引用[3],启动Redis容器时指定网络,并设置一些必要的配置(如绑定地址、关闭保护模式等)。例如: ```bash docker run -d --name redis-container \ --network backend-network \ -p 6379:6379 \ redis:latest \ redis-server --bind 0.0.0.0 --protected-mode no ``` 注意:这里我们使用了`--bind 0.0.0.0`允许任意IP连接,`--protected-mode no`关闭保护模式,以便其他容器可以连接。 步骤3:启动Spring Boot容器并加入同一网络 在启动Spring Boot容器时,将其连接到同一个网络(backend-network)中。这样,Spring Boot容器就可以通过容器名称“redis-container”来访问Redis容器。 例如,在Spring Boot配置文件(如application.properties)中,设置Redis的主机为容器名称: ```properties spring.redis.host=redis-container spring.redis.port=6379 ``` 然后启动Spring Boot容器: ```bash docker run -d --name spring-boot-app \ --network backend-network \ -p 8080:8080 \ spring-boot-image ``` 注意:这里我们假设已经构建了Spring Boot应用的镜像(spring-boot-image),并且应用在容器内监听8080端口,映射到宿主机的8080端口。 另一种方法是使用Docker Compose(引用[4][5]提到),可以更方便地定义多个容器网络。以下是一个docker-compose.yml的示例: ```yaml version: '3' services: spring-boot-app: image: spring-boot-image ports: - "8080:8080" networks: - backend-network depends_on: - redis redis: image: redis:latest command: redis-server --bind 0.0.0.0 --protected-mode no ports: - "6379:6379" networks: - backend-network networks: backend-network: driver: bridge ``` 在这个配置中,两个服务都加入了同一个网络(backend-network),Spring Boot应用可以通过服务名“redis”来访问Redis容器。 总结: 连接Spring Boot应用容器Redis容器的关键是让它们处于同一个Docker网络中,然后通过容器名称(或服务名)进行通信。 注意:在Spring Boot配置中,Redis的主机名就是Redis容器的名称(在docker run中使用`--name`指定的名称,或者在docker-compose中使用的服务名)。 引用[3]还提到了如果需要其他容器连接Redis,需要修改Redis配置文件,包括绑定地址(bind)关闭保护模式(protected-mode)。我们在启动Redis容器时通过命令行参数进行了设置。 因此,用户需要确保: 1. 两个容器在同一个用户定义的网络中。 2. Redis容器配置为允许远程连接(通过绑定0.0.0.0关闭保护模式)。 3. Spring Boot应用中配置Redis主机名为Redis容器的名称(在同一个网络中,Docker会自动解析为正确的IP)。 这样,Spring Boot应用容器就可以连接Redis容器了。 引用标识: [^1]: 当 Spring Boot 应用程序直接运行在宿主机上时,可以通过 localhost 访问 Docker 中的 MySQL Redis 容器。这是因为 Docker 将这些容器的端口映射到宿主机的网络,localhost:port 便能与这些容器通信。 [^2]: Docker 部署 Spring Boot 项目(含 MySQL + Redis )。 9. 在命令行进入 springboot 文件夹,执行命令构建镜像 docker build -t spring-boot-router . ... 10. 启动 Spring Boot 容器 docker run -d --network backend-network --name spring-boot-router -p 9090:9090 ... spring-boot-router [^3]: Docker部署Spring boot + Redis +Mysql。安装redis ... 需要修改redis.conf ... 1.把 bind 127.0.0.1 -> bind 172.20.21.2 ... 3.把 protected-mode yes -> protected-mode no </think> ### DockerSpring Boot 应用容器连接 Redis 容器的方法 在 Docker 环境中实现 Spring Boot 应用容器与 Redis 容器的连接,主要通过**容器网络互联**实现。以下是详细配置步骤: --- #### 方法一:共享自定义网络(推荐)[^2][^3] 这是最可靠的连接方式,容器通过网络别名直接通信: 1. **创建共享网络** ```bash docker network create backend-network ``` 2. **启动 Redis 容器并加入网络** ```bash docker run -d --name redis-container \ --network backend-network \ -p 6379:6379 \ redis:latest \ redis-server --bind 0.0.0.0 --protected-mode no ``` **关键配置**: - `--bind 0.0.0.0`:允许所有 IP 连接 - `--protected-mode no`:禁用保护模式(允许容器间通信) 3. **配置 Spring Boot 容器** ```bash docker run -d --name spring-boot-app \ --network backend-network \ -p 8080:8080 \ -e SPRING_REDIS_HOST=redis-container \ # 使用容器名作为主机地址 your-spring-boot-image ``` 4. **Spring Boot 配置文件** 在 `application.yml` 中配置 Redis: ```yaml spring: redis: host: ${SPRING_REDIS_HOST} # 从环境变量获取 port: 6379 timeout: 5000 ``` --- #### 方法:通过宿主机 IP 连接[^1][^4] 适用于简单测试场景: ```bash # 启动 Redis 容器(默认端口映射) docker run -d --name redis-container -p 6379:6379 redis # 启动 Spring Boot 容器 docker run -d --name spring-boot-app \ -p 8080:8080 \ -e SPRING_REDIS_HOST=host.docker.internal \ # 特殊域名指向宿主机 your-spring-boot-image ``` **注意**:需在 Spring Boot 配置中使用 `host.docker.internal` 作为 Redis 主机地址[^1] --- #### 方法三:使用 Docker Compose[^4][^5] **docker-compose.yml** 完整示例: ```yaml version: '3.8' services: redis: image: redis:latest container_name: redis-container ports: - "6379:6379" command: redis-server --bind 0.0.0.0 --protected-mode no networks: - backend-network spring-boot-app: image: your-spring-boot-image container_name: spring-boot-app ports: - "8080:8080" environment: SPRING_REDIS_HOST: redis-container # 通过服务名访问 depends_on: - redis networks: - backend-network networks: backend-network: driver: bridge ``` 启动命令: ```bash docker-compose up -d ``` --- ### 关键验证步骤 1. **检查容器网络连通性** ```bash docker exec -it spring-boot-app ping redis-container ``` 2. **查看 Redis 连接日志** ```bash docker logs redis-container | grep "Accepted" ``` 3. **Spring Boot 连接测试** 在应用中添加测试接口: ```java @RestController public class RedisTest { @Autowired private RedisTemplate<String, String> redisTemplate; @GetMapping("/test-redis") public String test() { redisTemplate.opsForValue().set("test", "success"); return redisTemplate.opsForValue().get("test"); } } ``` 访问 `http://localhost:8080/test-redis` 应返回 "success" --- ### 常见问题解决 1. **连接超时错误**: - 检查 Redis 配置:确保绑定到 `0.0.0.0` 并禁用保护模式[^3] - 验证网络配置:`docker network inspect backend-network` 2. **认证失败**: 若 Redis 启用密码,在 Spring Boot 配置添加: ```yaml spring: redis: password: your_password ``` 3. **容器启动顺序问题**: - 使用 `depends_on` 控制启动顺序(Docker Compose) - 在应用中添加连接重试机制: ```java @Bean public LettuceConnectionFactory redisConnectionFactory() { LettuceClientConfiguration config = LettuceClientConfiguration.builder() .commandTimeout(Duration.ofSeconds(2)) .shutdownTimeout(Duration.ZERO) .build(); return new LettuceConnectionFactory( new RedisStandaloneConfiguration("redis-container", 6379), config); } ``` > **生产环境建议**: > - 始终使用自定义网络隔离容器[^2] > - 为 Redis 配置持久化卷:`-v redis-data:/data` > - 启用 TLS 加密通信(需配置 Redis 证书)[^4] [^1]: 当 Spring Boot 应用程序直接运行在宿主机上时,可以通过 localhost 访问 Docker 中的 MySQL Redis 容器。这是因为 Docker 将这些容器的端口映射到宿主机的网络,localhost:port 便能与这些容器通信。 [^2]: 启动 Spring Boot 容器 docker run -d --network backend-network --name spring-boot-router -p 9090:9090 ... spring-boot-router --network: 为容器指定一个网络,这里指定的网络是backend-network,要跟上面创建的 Docker 网络名称一致。 [^3]: Docker部署Spring boot + Redis +Mysql。需要修改redis.conf 1.把 bind 127.0.0.1 -> bind 172.20.21.2 ... 3.把 protected-mode yes -> protected-mode no。 [^4]: Docker部署Spring Boot应用。创建一个Spring Boot项目,Spring Boot项目中使用到MySQL数据库Redis缓存,通过Docker部署到阿里云服务器。 [^5]: docker部署spring boot配置redis/mysql——。使用docker-compose.yml文件运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值