You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器内运行MySQL/Redis服务并通过CLI连接失败求助

问题根源

你忽略了Docker镜像的默认启动命令覆盖机制:当你在docker run命令末尾追加自定义命令(比如mysql或redis-cli)时,这个命令会替换镜像原本的启动指令——MySQL镜像默认启动mysqld服务,Redis镜像默认启动redis-server服务。也就是说,你的容器根本没启动数据库服务,直接运行了客户端命令,自然连不上本地服务。

解决办法

方法1:分两步操作(推荐,逻辑清晰易维护)

先启动后台运行的服务容器,再单独启动客户端连接:

MySQL 操作流程

  1. 启动MySQL服务容器:
docker run -d --rm \
--name mysql-container \
-e MYSQL_ROOT_PASSWORD=mypassword \
-p 3307:3306 \
mysql
  • -d参数让容器在后台运行
  • 第一次启动需要初始化数据,等待10-15秒确保服务就绪
  1. 进入容器启动MySQL客户端:
docker exec -it mysql-container mysql -u root -p

也可以直接从宿主机连接(使用映射的3307端口):

mysql -u root -h 127.0.0.1 -P 3307 -p

Redis 操作流程

  1. 启动Redis服务容器:
docker run -d --rm \
--name my-redis \
redis
  1. 进入容器启动Redis客户端:
docker exec -it my-redis redis-cli

若需要从宿主机连接,启动容器时添加端口映射-p 6379:6379,然后执行:

redis-cli -h 127.0.0.1

方法2:自定义启动脚本(单命令实现服务+客户端)

如果必须用单条docker run命令完成,需要编写自定义脚本,让服务先启动并就绪后,再启动客户端。

MySQL 实现

创建start-mysql.sh脚本:

#!/bin/bash
# 后台启动MySQL服务
mysqld &
# 等待服务初始化完成(时间可根据实际调整)
sleep 15
# 启动MySQL客户端
mysql -u root -h 127.0.0.1 -P 3306 -p
# 保持容器运行,避免服务退出后容器立刻停止
wait

赋予脚本执行权限:

chmod +x start-mysql.sh

用脚本启动容器:

docker run -it --rm \
--name mysql-container \
-e MYSQL_ROOT_PASSWORD=mypassword \
-v $(pwd)/start-mysql.sh:/usr/local/bin/start-mysql.sh \
--entrypoint /usr/local/bin/start-mysql.sh \
mysql

Redis 实现

创建start-redis.sh脚本:

#!/bin/bash
# 后台启动Redis服务
redis-server &
# 等待服务启动就绪
sleep 2
# 启动Redis客户端
redis-cli -h 127.0.0.1
# 保持容器运行
wait

赋予脚本执行权限:

chmod +x start-redis.sh

用脚本启动容器:

docker run -it --rm \
--name my-redis \
-v $(pwd)/start-redis.sh:/usr/local/bin/start-redis.sh \
--entrypoint /usr/local/bin/start-redis.sh \
redis
核心知识点
  • Docker镜像的ENTRYPOINT和CMD定义了容器启动时的默认执行命令,docker run末尾追加的命令会覆盖CMD的值。
  • 数据库类服务启动需要时间完成初始化或加载数据,直接启动客户端会因服务未就绪导致连接失败,新手阶段用固定等待时间即可,进阶可使用wait-for-it等工具实现健康检查式等待。

内容的提问来源于stack exchange,提问作者claws

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:33:28