docker-compose.yml是最轻量可控方式,用docker-compose up -d一键拉起mysql和redis双容器,需注意挂载路径、认证插件、服务名通信及显式网络定义。

直接用 docker-compose 一键拉起双容器
开发环境不需要高可用或复杂网络策略,docker-compose.yml 是最轻量、最可控的方式。它把 MySQL 和 Redis 的启动参数、挂载路径、依赖关系写死在一份文件里,docker-compose up -d 就能同时跑起来,改配置也只改一个地方。
注意:别用 docker run 分两次手动启——容易漏掉网络互通配置,导致应用连不上 Redis 或 MySQL 报 Connection refused。
示例 docker-compose.yml(放在项目根目录):
version: '3.8'
services:
mysql:
image: mysql:8.0.33
container_name: dev-mysql
environment:
MYSQL_ROOT_PASSWORD: devpass
MYSQL_DATABASE: testdb
MYSQL_USER: app
MYSQL_PASSWORD: apppass
ports:
- "3306:3306"
volumes:
- ./mysql-data:/var/lib/mysql
- ./mysql-conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro
restart: unless-stopped
<p>redis:
image: redis:7.2
container_name: dev-redis
command: redis-server /usr/local/etc/redis/redis.conf
ports:</p>
- "6379:6379" volumes:
- ./redis-data:/data
- ./redis-conf/redis.conf:/usr/local/etc/redis/redis.conf:ro
restart: unless-stopped
关键点:
-
./mysql-data和./redis-data必须提前mkdir,否则容器启动失败且报错不直观(常见现象:mysql容器反复重启,日志里出现mysqld: Can't create/write to file) - MySQL 配置挂载路径必须是
/etc/mysql/conf.d/(不是/etc/mysql/my.cnf),否则 8.0+ 会忽略;Redis 配置路径以镜像内redis.conf实际位置为准,官方镜像一般在/usr/local/etc/redis/ - 两个服务默认在同一 Docker 网络下,应用代码里连
mysql://app:apppass@mysql:3306/testdb和redis://redis:6379即可,不用写127.0.0.1
-
MySQL 8.0 连接失败?重点检查这三处
开发时最常卡在「连不上 MySQL」,错误信息往往是 Access denied for user 或 Public Key Retrieval is not allowed,根源几乎都出在认证插件或驱动兼容性上。
解决办法:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 确认 MySQL 启动时加了
default_authentication_plugin=mysql_native_password—— 在挂载的my.cnf里写:[mysqld] default_authentication_plugin = mysql_native_password
- Java 应用用
mysql-connector-java:8.0.x时,URL 后必须加?allowPublicKeyRetrieval=true&useSSL=false;Go 的go-sql-driver/mysql则需显式设allowNativePasswords=true - 别用 root 用户写业务逻辑。用
MYSQL_USER环境变量创建的用户(如上面的app)更安全,且权限可控——首次连接后进容器执行mysql -uapp -papppass -e "SHOW GRANTS FOR 'app'@'%';"可验证
Redis 持久化关不关?开发环境建议关
开发阶段频繁删库重跑、改结构、清缓存,开 RDB/AOF 反而拖慢启动速度,还容易因 redis.conf 权限或路径问题导致容器起不来(典型报错:Can't open the append only file: Permission denied)。
推荐做法:
- 在挂载的
redis.conf中显式关闭持久化:save "" appendonly no
- 如果真要保留数据(比如模拟登录态),只开 RDB,且把
save 60 1改成宽松策略,避免每秒刷盘影响响应 - 不要挂载
/data卷却忘记初始化权限:chown -R 999:999 ./redis-data(Redis 官方镜像默认用 UID 999 运行)
容器间网络不通?别信 localhost
很多新手在应用里硬编码 localhost:3306 或 127.0.0.1:6379,结果运行在容器里就炸——因为容器内的 localhost 指向自己,不是宿主机,更不是另一个容器。
正确姿势:
- 所有服务间通信必须用
docker-compose里定义的service name:MySQL 是mysql,Redis 是redis - 验证是否通:进 MySQL 容器执行
ping redis,进 Redis 容器执行nc -zv mysql 3306;不通就说明网络没对齐(比如用了network_mode: host却没统一) - 如果非要用宿主机端口调试(比如本地 IDE 连 MySQL),确保
ports字段已声明,且宿主机防火墙放行了 3306/6379
最易被忽略的是 compose 文件里没声明 networks,导致服务被分配到默认 bridge 网络——虽然默认互通,但某些 Docker 版本(尤其是旧版)会因 DNS 解析延迟导致首次连接超时。显式定义一个网络更稳:
networks:
devnet:
driver: bridge
然后每个 service 下加 networks: [devnet]。










