1. 简介

在本教程中,我们将学习如何判断一个 Docker MySQL 容器是否已经准备好处理数据库查询请求。我们会先创建一个 MySQL 容器,然后介绍两种常用的方法来检测 MySQL 的就绪状态:

  • 使用 mysqladmin ping 命令从容器外部检测
  • 使用 docker exec 在容器内部执行 mysql 命令检测

这两种方法都非常实用,适用于自动化脚本或 CI/CD 流水线中等待数据库启动完成的场景。


2. 创建一个 Docker MySQL 容器

我们可以使用如下命令创建一个 MySQL 容器:

$ docker run --name <container-name> -e MYSQL_ROOT_PASSWORD=<secret-password> -d mysql:<tag>

其中:

  • <container-name> 是你希望给容器起的名字
  • <secret-password> 是 root 用户的密码
  • <tag> 是你希望使用的 MySQL 版本标签(例如 8.0, latest 等)

例如,下面这个命令会创建一个名为 my_db_server 的容器,使用最新版的 MySQL 镜像,并设置 root 密码为 123456

$ docker run --name my_db_server -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

⚠️ 注意:MySQL 容器启动后并不会立即就绪,它需要一些时间来初始化数据库服务。我们需要等待服务真正准备好之后才能进行数据库操作。


3. 使用 mysqladmin 工具检测 MySQL 是否就绪

我们可以使用 mysqladmin ping 命令来检测 MySQL 是否已经就绪。

✅ 步骤如下:

  1. 安装 MySQL 客户端(如果尚未安装):

    $ sudo apt install mysql-client
    
  2. 使用以下命令检测连接状态(需替换 IP、密码):

    $ mysqladmin ping -h"<container-ip-address>" --user=root --password=<secret-password>
    

🧠 自动化检测脚本

下面是一个自动检测 MySQL 是否就绪的 Shell 脚本:

#!/bin/bash
DB_HOST=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my_db_server)
until mysqladmin ping -h"$DB_HOST" --user=root --password=123456 --silent
do
  echo "Waiting for a 'ping reply'..."
  sleep 2
done
echo "MySQL is up!"

📌 输出示例

Waiting for a 'ping reply'...
Waiting for a 'ping reply'...
Waiting for a 'ping reply'...
MySQL is up!

这个脚本会每隔 2 秒尝试一次 ping,直到 MySQL 返回成功响应为止。


4. 使用 docker exec 检测 MySQL 状态

这种方法不需要安装 mysql-client,而是通过 docker exec 在容器内部执行 mysql 命令进行检测。

✅ 检测命令示例:

$ docker exec my_db_server mysql --user=root --password=123456 -e "status"

🧠 自动化检测脚本

#!/bin/bash
until docker exec my_db_server mysql --user=root --password=123456 -e "status" &> /dev/null
do
  echo "Waiting for database connection..."
  sleep 2
done
echo "MySQL is up!"

📌 输出示例

Waiting for database connection...
Waiting for database connection...
MySQL is up!

✅ 优点:不需要在宿主机安装 MySQL 客户端,更适合 CI/CD 环境使用。


5. 总结

我们介绍了两种判断 Docker MySQL 容器是否就绪的方法:

方法 是否需要安装客户端 是否依赖容器内部命令 适用场景
mysqladmin ping ✅ 需要安装 mysql-client ❌ 否 本地测试、脚本中使用
docker exec + mysql ❌ 不需要 ✅ 是 CI/CD、容器化部署环境

两种方法都有效,选择哪一种取决于你的环境和需求。如果你是在 CI 流水线中使用,推荐使用第二种方法,可以避免安装额外依赖。

📌 踩坑提醒:不要在容器启动后立即执行数据库操作,否则会因为服务未就绪导致失败。使用上述脚本可以有效避免这类问题。


原始标题:Determining When a Docker Mysql Container Is Ready to Handle Queries