«

Docker运行MySQL,数据持久化配置

时间:2026-10-8 08:24     作者:emer     分类: 无


前言

用Docker跑MySQL,删了容器数据就没了?那是没挂数据卷。本文讲怎么用Docker跑MySQL并持久化数据。

一、基本运行

最简单的跑法

docker run -d \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql:5.7

问题: 删了容器,数据库里的数据全没了。

二、加数据卷持久化

完整命令

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v /data/mysql:/var/lib/mysql \
  mysql:5.7

解释

这样容器删了,数据还在宿主机上。

三、其他常用配置

1. 设置字符集

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v /data/mysql:/var/lib/mysql \
  -v /data/mysql/my.cnf:/etc/mysql/conf.d/my.cnf \
  mysql:5.7 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci

2. 创建数据库和用户

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_DATABASE=mydb \
  -e MYSQL_USER=myuser \
  -e MYSQL_PASSWORD=123456 \
  -v /data/mysql:/var/lib/mysql \
  mysql:5.7

3. 挂载配置文件

先在宿主机创建my.cnf:

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
max_connections=1000

然后挂载:

docker run -d \
  --name mysql \
  -v /data/mysql/my.cnf:/etc/mysql/conf.d/my.cnf \
  -v /data/mysql:/var/lib/mysql \
  mysql:5.7

四、Docker Compose方式

version: '3'
services:
  mysql:
    image: mysql:5.7
    container_name: mysql
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: mydb
    volumes:
      - /data/mysql:/var/lib/mysql
      - /data/mysql/my.cnf:/etc/mysql/conf.d/my.cnf

启动:

docker-compose up -d

五、连接MySQL

进入容器连接

docker exec -it mysql mysql -uroot -p123456

从宿主机连接

mysql -h127.0.0.1 -P3306 -uroot -p123456

用Navicat等工具

六、备份和恢复

备份数据库

docker exec mysql mysqldump -uroot -p123456 mydb > /data/backup/mydb.sql

恢复数据库

docker exec -i mysql mysql -uroot -p123456 mydb < /data/backup/mydb.sql

七、常见坑

坑1:密码不对

报错:

Access denied for user 'root'@'localhost'

检查: 环境变量 MYSQL_ROOT_PASSWORD 设了没?

坑2:权限问题

宿主机 /data/mysql 目录权限不对:

chmod -R 777 /data/mysql

坑3:端口被占用

3306端口被宿主机的MySQL占了:

Bind for 0.0.0.0:3306 failed: port is already allocated

解决: 换个端口:

-p 3307:3306

坑4:数据没持久化

没加 -v 挂载,删了容器数据就没了。

检查: 有没有 -v /data/mysql:/var/lib/mysql?

坑5:第一次启动慢

MySQL第一次启动要初始化数据,要等个十几秒。

等不及就先别连,过一会再试。

坑6:字符集不对,中文乱码

加参数:

--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

八、推荐配置

docker run -d \
  --name mysql \
  --restart=always \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=你的密码 \
  -v /data/mysql:/var/lib/mysql \
  -v /data/mysql/my.cnf:/etc/mysql/conf.d/my.cnf \
  mysql:5.7

总结

记住:

  1. 一定要挂数据卷,不然删容器数据就没了
  2. 用 -e MYSQL_ROOT_PASSWORD 设密码
  3. 用 -p 3306:3306 映射端口
  4. 配置文件也可以挂载进去

最常用:

docker run -d --name mysql -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v /data/mysql:/var/lib/mysql \
  mysql:5.7

遇到问题加QQ23979811 协助处理

标签: MySQL Docker 数据卷 数据持久化 数据库容器