前言

项目在本地 IDE 运行,Redis 在 Docker 容器中,聚焦 “不使用自定义网络” 和 “使用自定义网络” 两种方案的细节拆解

一、方案 1:不使用自定义网络(用 Docker 默认 bridge 网络)

核心逻辑

Docker 启动容器时,默认会将容器加入bridge网络(所有未指定网络的容器共享此网络)。本地项目在主机上运行,通过 “端口映射” 访问容器内的 Redis,无需额外创建网络,步骤最简单。

步骤 1:启动 Redis 容器(关键命令拆解)

docker run --name my-redis -p 6379:6379 -d redis:6
  1. docker run:Docker核心指令,作用是“基于指定镜像创建并启动一个容器实例”
  2. –name my-redis:给容器设置自定义名称“my-redis”,核心作用:
  • 便于识别:后续用 docker ps 查看时,能快速找到Redis容器(而非记随机名如“quirky_johnson”)
  • 简化操作:管理容器时直接用名称(如停止容器 docker stop my-redis,无需输入长容器ID)
  • 注意:同一台机器容器名不能重复,若已存在“my-redis”,需先执行 docker rm my-redis 删除旧容器
  1. -p 6379:6379:端口映射参数,格式为“主机端口:容器端口”,细节拆解:
  • 左侧6379:是你本地电脑(主机)的端口,相当于“对外访问入口”,本地项目通过这个端口连接Redis
  • 右侧6379:是Redis容器内部的端口,Redis服务在容器中默认监听6379端口(Redis官方默认端口)
  • 映射逻辑:本地项目访问 localhost:6379 时,Docker会自动把请求转发到容器内的6379端口,打通“主机→容器”的通信通道
  • 灵活调整:若主机6379端口已被占用(如本地装了其他Redis),可修改左侧端口,例:-p 6380:6379,此时项目需访问 localhost:6380
  1. -d:后台运行参数(全称detached),作用:
  • 容器启动后在后台运行,不占用当前命令行窗口(关闭命令行,容器仍继续运行)
  • 若不加-d,容器会在前台运行,实时输出Redis日志(适合调试启动问题,但窗口关闭后容器会停止)
  1. redis:6:指定容器依赖的镜像,格式为“镜像名:版本标签”:
  • redis:Docker官方维护的Redis镜像(从Docker Hub拉取,确保安全稳定)
  • 6:镜像版本标签,表示使用Redis 6.x系列(稳定版),不写标签默认拉取“latest”(最新版),生产/开发建议指定标签(避免自动升级导致兼容性问题)

步骤 2:验证 Redis 容器是否正常启动

启动后需确认容器处于运行状态,避免后续项目连接失败:

  1. 查看运行中的容器,筛选Redis容器
docker ps | grep my-redis

若输出类似“a1b2c3d4e5f6 redis:6 “docker-entrypoint.s…” 2分钟前 Up 2分钟 0.0.0.0:6379->6379/tcp my-redis”,表示容器正常运行

  1. 查看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
  1. docker network create:Docker创建网络的指令​
  2. redis-network:自定义网络名称,可任意命名(如redis-local-network),建议见名知意​
  3. 作用:创建一个独立的网络空间,只有加入此网络的容器才能互相通信,无关容器(如MySQL容器)无法访问Redis,提升安全性​
  4. 验证网络是否创建成功:​
    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
  1. 新增参数 --network=redis-network:指定Redis容器加入刚创建的自定义网络​
  2. 其他参数(–name、-p、-d、redis:6)含义和方案1完全一致,不再重复​
  3. 关键说明:本地项目不在容器内,即使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/sethttp://localhost:8080/redis/get,能正常读写数据即表示连接成功。

三、两种方案的对比与推荐

对比维度 方案 1:不使用自定义网络(默认 bridge) 方案 2:使用自定义网络
操作步骤 2 步(启动容器 + 项目配置),简单快速 3 步(创建网络 + 启动容器 + 项目配置),稍繁琐
本地项目配置 直接用localhost,无需调整 完全相同,无额外配置
安全性 所有容器共享 bridge 网络,Redis 可能被无关容器访问 仅自定义网络内的容器能访问 Redis,更安全
适用场景 本地开发、容器数量少(仅 1-2 个容器) 本地开发但容器数量多(如同时启动 Redis、MySQL、Nginx),需隔离网络
推荐度 ★★★★☆ ★★☆☆☆

核心推荐结论

优先选择方案 1(不使用自定义网络),原因:

  1. 本地开发时,容器数量通常较少(仅需 Redis 一个容器),默认 bridge 网络足够用,无需额外创建网络;

  2. 步骤更少,避免 “创建网络” 的冗余操作,提升开发效率;

  3. 自定义网络的 “隔离优势” 在本地开发场景中作用有限(本地环境无敏感数据,无需严格隔离)。

仅当本地同时运行多个容器(如 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 数据。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐