Docker 操作指南(以 SpringBoot + Rdeis 展开)
Docker 操作指南(以 SpringBoot + Rdeis 展开)
前言
项目在本地 IDE 运行,Redis 在 Docker 容器中,聚焦 “不使用自定义网络” 和 “使用自定义网络” 两种方案的细节拆解
一、方案 1:不使用自定义网络(用 Docker 默认 bridge 网络)
核心逻辑
Docker 启动容器时,默认会将容器加入bridge网络(所有未指定网络的容器共享此网络)。本地项目在主机上运行,通过 “端口映射” 访问容器内的 Redis,无需额外创建网络,步骤最简单。
步骤 1:启动 Redis 容器(关键命令拆解)
docker run --name my-redis -p 6379:6379 -d redis:6
- docker run:Docker核心指令,作用是“基于指定镜像创建并启动一个容器实例”
- –name my-redis:给容器设置自定义名称“my-redis”,核心作用:
- 便于识别:后续用 docker ps 查看时,能快速找到Redis容器(而非记随机名如“quirky_johnson”)
- 简化操作:管理容器时直接用名称(如停止容器 docker stop my-redis,无需输入长容器ID)
- 注意:同一台机器容器名不能重复,若已存在“my-redis”,需先执行 docker rm my-redis 删除旧容器
- -p 6379:6379:端口映射参数,格式为“主机端口:容器端口”,细节拆解:
- 左侧6379:是你本地电脑(主机)的端口,相当于“对外访问入口”,本地项目通过这个端口连接Redis
- 右侧6379:是Redis容器内部的端口,Redis服务在容器中默认监听6379端口(Redis官方默认端口)
- 映射逻辑:本地项目访问 localhost:6379 时,Docker会自动把请求转发到容器内的6379端口,打通“主机→容器”的通信通道
- 灵活调整:若主机6379端口已被占用(如本地装了其他Redis),可修改左侧端口,例:-p 6380:6379,此时项目需访问 localhost:6380
- -d:后台运行参数(全称detached),作用:
- 容器启动后在后台运行,不占用当前命令行窗口(关闭命令行,容器仍继续运行)
- 若不加-d,容器会在前台运行,实时输出Redis日志(适合调试启动问题,但窗口关闭后容器会停止)
- redis:6:指定容器依赖的镜像,格式为“镜像名:版本标签”:
- redis:Docker官方维护的Redis镜像(从Docker Hub拉取,确保安全稳定)
- 6:镜像版本标签,表示使用Redis 6.x系列(稳定版),不写标签默认拉取“latest”(最新版),生产/开发建议指定标签(避免自动升级导致兼容性问题)
步骤 2:验证 Redis 容器是否正常启动
启动后需确认容器处于运行状态,避免后续项目连接失败:
- 查看运行中的容器,筛选Redis容器
docker ps | grep my-redis
若输出类似“a1b2c3d4e5f6 redis:6 “docker-entrypoint.s…” 2分钟前 Up 2分钟 0.0.0.0:6379->6379/tcp my-redis”,表示容器正常运行
- 查看Redis容器日志,确认服务启动成功
docker logs my-redis
若日志中出现“Ready to accept connections”,表示Redis服务已就绪,可正常连接
步骤 3:本地 Spring Boot 项目配置(连接 Redis)
项目中无需修改代码,只需在配置文件中指定 “主机端口” 即可,因为本地项目通过主机映射的端口访问 Redis:
spring:
redis:
host: localhost # 本地主机地址(因为Redis容器端口已映射到主机)
port: 6379 # 主机映射的端口(和容器启动时-p参数左侧一致)
# 若Redis需密码(如生产环境),可添加 password: 你的Redis密码(默认Redis容器无密码,可通过启动命令加 --requirepass 配置)
步骤 4:测试项目与 Redis 的连接
在 IDE 中启动 Spring Boot 项目,编写简单接口验证通信:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RedisTestController {
// 注入Redis客户端模板(Spring Boot自动配置,依赖spring-boot-starter-data-redis)
@Autowired
private StringRedisTemplate stringRedisTemplate;
// 存数据到Redis
@GetMapping("/redis/set")
public String setRedisData() {
stringRedisTemplate.opsForValue().set("test-key", "本地项目连接Docker Redis成功!");
return "数据已存入Redis";
}
// 从Redis取数据
@GetMapping("/redis/get")
public String getRedisData() {
return stringRedisTemplate.opsForValue().get("test-key");
}
}
启动项目后,访问 http://localhost:8080/redis/set 存入数据,再访问 http://localhost:8080/redis/get 能获取到数据,说明连接成功。
二、方案 2:使用自定义网络(手动创建专属网络)
核心逻辑
手动创建一个自定义网络(如redis-network),让 Redis 容器加入此网络。本地项目仍在主机上运行,需通过 “端口映射” 访问 Redis,自定义网络的核心作用是 “隔离无关容器”(避免 Redis 被其他容器访问),但对本地项目的连接方式无影响。
步骤 1:创建自定义网络(命令拆解)
docker network create redis-network
- docker network create:Docker创建网络的指令
- redis-network:自定义网络名称,可任意命名(如redis-local-network),建议见名知意
- 作用:创建一个独立的网络空间,只有加入此网络的容器才能互相通信,无关容器(如MySQL容器)无法访问Redis,提升安全性
- 验证网络是否创建成功:
docker network ls | grep redis-network
若输出类似“abc123def456 redis-network bridge local”,表示网络创建成功
步骤 2:启动 Redis 容器(加入自定义网络,命令拆解)
docker run --name my-redis --network=redis-network -p 6379:6379 -d redis:6
- 新增参数 --network=redis-network:指定Redis容器加入刚创建的自定义网络
- 其他参数(–name、-p、-d、redis:6)含义和方案1完全一致,不再重复
- 关键说明:本地项目不在容器内,即使Redis加入自定义网络,仍需加-p端口映射(否则本地项目无法访问)
步骤 3:验证 Redis 容器是否加入自定义网络
查看redis-network网络中的容器
docker network inspect redis-network | grep Name
- 若输出中包含"Name": “my-redis”,表示Redis容器已成功加入自定义网络
步骤 4:本地 Spring Boot 项目配置(和方案 1 完全相同)
自定义网络仅影响容器间的通信,本地项目在主机上运行,连接方式无变化:
spring:
redis:
host: localhost # 仍用本地主机地址
port: 6379 # 仍用主机映射的端口
步骤 5:测试连接(和方案 1 完全相同)
启动项目后访问 http://localhost:8080/redis/set 和 http://localhost:8080/redis/get,能正常读写数据即表示连接成功。
三、两种方案的对比与推荐
| 对比维度 | 方案 1:不使用自定义网络(默认 bridge) | 方案 2:使用自定义网络 |
|---|---|---|
| 操作步骤 | 2 步(启动容器 + 项目配置),简单快速 | 3 步(创建网络 + 启动容器 + 项目配置),稍繁琐 |
| 本地项目配置 | 直接用localhost,无需调整 | 完全相同,无额外配置 |
| 安全性 | 所有容器共享 bridge 网络,Redis 可能被无关容器访问 | 仅自定义网络内的容器能访问 Redis,更安全 |
| 适用场景 | 本地开发、容器数量少(仅 1-2 个容器) | 本地开发但容器数量多(如同时启动 Redis、MySQL、Nginx),需隔离网络 |
| 推荐度 | ★★★★☆ | ★★☆☆☆ |
核心推荐结论
优先选择方案 1(不使用自定义网络),原因:
-
本地开发时,容器数量通常较少(仅需 Redis 一个容器),默认 bridge 网络足够用,无需额外创建网络;
-
步骤更少,避免 “创建网络” 的冗余操作,提升开发效率;
-
自定义网络的 “隔离优势” 在本地开发场景中作用有限(本地环境无敏感数据,无需严格隔离)。
仅当本地同时运行多个容器(如 Redis、MySQL、Elasticsearch),且需避免容器间互相干扰时,才考虑方案 2(自定义网络)。
四、本地项目 + Docker Redis 的常见问题与解决
问题 1:启动 Redis 容器时提示 “端口已被占用”
报错示例:Error response from daemon: Ports are not available: exposing port TCP ``0.0.0.0:6379`` -> ``0.0.0.0``:0: listen tcp ``0.0.0.0:6379``: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
原因:主机 6379 端口已被其他程序占用(如本地装了 Redis 服务)。
解决:修改端口映射的 “主机端口”,例:
docker run --name my-redis -p 6380:6379 -d redis:6
# 主机用6380端口,容器仍用6379端口,项目配置中port改为6380:
spring:
redis:
port: 6380
问题 2:项目访问 Redis 提示 “连接超时”
原因 1:Redis 容器未启动,执行 docker start my-redis 启动;
原因 2:端口映射错误(项目配置的 port 和容器 - p 参数左侧不一致),核对端口;
原因 3:容器启动失败,执行 docker logs my-redis 查看日志(如配置错误),重新启动容器。
问题 3:Redis 容器启动后,用 Redis 客户端工具(如 Redis Desktop Manager)连接失败
解决:客户端工具的 “主机” 填localhost,“端口” 填容器映射的主机端口(如 6379),无需填容器 IP(Docker 会自动转发),连接成功后即可可视化管理 Redis 数据。
更多推荐
所有评论(0)