Docker-mysql

使用 Docker 运行 MySQL

以下是本机开发示例,不是公网生产部署方案。宿主端口只绑定 127.0.0.1;如果只供容器间访问,应省略 -p 并使用专用 Docker 网络。应用使用单独的最小权限账户,不使用 root。

1. 确认镜像与输入密码

先在官方镜像文档核对适合项目的受支持版本、完整 tag(或 digest)、升级和数据兼容要求。这里不指定一个未经拉取/运行验证的版本,也不使用漂移的 latest。

下面交互命令适用于 Bash。输入由密码管理器生成的独立强密码,不把真实密码写入文章、历史命令或版本库。示例用 Docker 环境变量初始化,因此宿主 root / Docker 管理员仍能通过容器配置读取密码;生产部署应改用镜像支持的 MYSQL_ROOT_PASSWORD_FILE 与受控 secret 文件。

1
2
3
4
5
6
7
8
9
read -r -p '输入已核对的固定 mysql:<完整版本> 或 mysql@sha256:<摘要>: ' MYSQL_IMAGE
case "$MYSQL_IMAGE" in
mysql:[0-9]*.[0-9]*.[0-9]*|mysql@sha256:*) ;;
*) printf '请使用核对后的固定版本或摘要,禁止 latest。\n'; exit 1 ;;
esac
read -r -s -p '输入独立强 root 密码(不会回显): ' MYSQL_ROOT_PASSWORD
printf '\n'
[[ -n "$MYSQL_ROOT_PASSWORD" ]] || { printf '密码不得为空。\n'; exit 1; }
export MYSQL_ROOT_PASSWORD

输入检查只拒绝明显的空密码/漂移标签,不验证镜像存在、支持期限或密码强度;这些仍须由读者确认。

2. 快速启动或持久化(二选一)

无卷的方式只适合可丢弃的数据;删除容器后不要指望数据仍在:

1
2
3
4
5
sudo --preserve-env=MYSQL_ROOT_PASSWORD docker run --name mysql \
-p 127.0.0.1:3306:3306 \
-e MYSQL_ROOT_PASSWORD \
-d "$MYSQL_IMAGE"
unset MYSQL_ROOT_PASSWORD

需要持久化时,改用命名卷(不要先运行上面的同名容器):

1
2
3
4
5
6
7
sudo docker volume create mysql-data
sudo --preserve-env=MYSQL_ROOT_PASSWORD docker run --name mysql \
-p 127.0.0.1:3306:3306 \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD \
-d "$MYSQL_IMAGE"
unset MYSQL_ROOT_PASSWORD

sudo 必须允许保留该变量;不允许时不能假设密码已传入,应使用受控 secret 文件或先进入授权管理环境。不要删除数据卷来“修复”启动失败;修改初始化密码环境变量不会重设已初始化数据目录中的 root 密码。卷提供持久化,不代替备份;跨版本升级前备份并验证恢复。

3. 登录 MySQL

1
sudo docker exec -it mysql mysql -uroot -p

在提示时输入密码,不使用 -p明文密码。容器在运行不代表数据库已就绪;先查看日志及所选版本的健康检查,再登录。

4. 复制文件并导入

1
2
sudo docker cp /path/to/file.sql mysql:/root/file.sql
sudo docker exec -it mysql mysql -uroot -p

在 MySQL 客户端执行以下交互语句;name 和文件路径按自己的数据替换:

1
2
3
4
mysql> create database name;
mysql> use name;
mysql> set names utf8;
mysql> source /root/file.sql;

这只是导入流程示例;字符集、授权和备份要求由项目决定,不把任意 SQL 文件当作可信输入。对外部署还需要明确的认证、TLS、网络访问控制和恢复方案。