Docker 安装 MySQL

MySQL 容器的初始化、数据持久化、字符集与备份恢复。

Beginner
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

常见问题

SymptomCauseFix
Access deniedOld volume has different passwordEnv vars only apply on first init
Chinese garbledWrong charset--character-set-server=utf8mb4
Container restartsNot enough memory / bad volume permsdocker 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.

Friends & Partners