Docker 安装 MySQL
MySQL 容器的初始化、数据持久化、字符集与备份恢复。
Key Points数据目录 /var/lib/mysql 必须挂卷,否则删容器即丢库;初始化只在数据目录为空时执行一次。
启动
Bash
docker run -d --name mysql \
-p 127.0.0.1:3306:3306 \
-e MYSQL_ROOT_PASSWORD=rootpass \
-e MYSQL_DATABASE=app \
-e MYSQL_USER=app \
-e MYSQL_PASSWORD=apppass \
-v mysql-data:/var/lib/mysql \
mysql:8.0 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_0900_ai_ci连进去
Bash
docker exec -it mysql mysql -uroot -prootpass
# 或从宿主机
mysql -h127.0.0.1 -P3306 -uapp -papppass app初始化脚本
Files in /docker-entrypoint-initdb.d/ run on the first start only (empty data dir), in lexicographic order. Later restarts skip them.
Bash
docker run -d --name mysql \
-v mysql-data:/var/lib/mysql \
-v "$PWD/init:/docker-entrypoint-initdb.d:ro" \
-e MYSQL_ROOT_PASSWORD=rootpass \
mysql:8.0备份与恢复
Bash
# 备份
docker exec mysql sh -c 'exec mysqldump -uroot -prootpass --databases app' > app.sql
# 恢复
docker exec -i mysql sh -c 'exec mysql -uroot -prootpass' < app.sql常见问题
| Symptom | Cause | Fix |
|---|---|---|
Access denied | Old volume has different password | Env vars only apply on first init |
| Chinese garbled | Wrong charset | --character-set-server=utf8mb4 |
| Container restarts | Not enough memory / bad volume perms | docker logs mysql |
Variables like
MYSQL_ROOT_PASSWORD only apply when the data directory is empty. If a password change does not stick, check for an old volume first.启动
Bash
docker run -d --name mysql \
-p 127.0.0.1:3306:3306 \
-e MYSQL_ROOT_PASSWORD=rootpass \
-e MYSQL_DATABASE=app \
-e MYSQL_USER=app \
-e MYSQL_PASSWORD=apppass \
-v mysql-data:/var/lib/mysql \
mysql:8.0 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_0900_ai_ci连进去
Bash
docker exec -it mysql mysql -uroot -prootpass
# 或从宿主机
mysql -h127.0.0.1 -P3306 -uapp -papppass app初始化脚本
把 .sql 或 .sh 放进 /docker-entrypoint-initdb.d/,容器第一次启动、数据目录为空时自动执行,按文件名字典序。之后重启不再执行。
Bash
docker run -d --name mysql \
-v mysql-data:/var/lib/mysql \
-v "$PWD/init:/docker-entrypoint-initdb.d:ro" \
-e MYSQL_ROOT_PASSWORD=rootpass \
mysql:8.0备份与恢复
Bash
# 备份
docker exec mysql sh -c 'exec mysqldump -uroot -prootpass --databases app' > app.sql
# 恢复
docker exec -i mysql sh -c 'exec mysql -uroot -prootpass' < app.sql常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 拒绝访问 | 旧卷里的密码不同 | 环境变量只在首次初始化生效 |
| 中文乱码 | 字符集不对 | --character-set-server=utf8mb4 |
| 反复重启 | 内存不足或卷权限问题 | docker logs mysql |
MYSQL_ROOT_PASSWORD 之类只在数据目录为空时生效。改了密码却连不上,先确认卷是不是旧的——用 docker volume ls 看一眼。