一、拉取 MySQL 5.7 镜像

首先从 Docker Hub 拉取官方的 MySQL 5.7 镜像(指定版本标签5.7,避免默认的latest版本):

bash

docker pull mysql:5.7

拉取完成后,可通过以下命令验证:

bash

docker images | grep mysql
# 输出示例:mysql   5.7   xxxxxxxx   2 weeks ago   448MB

二、创建并运行 MySQL 5.7 容器

运行 MySQL 容器需要配置端口映射(方便外部访问)、数据卷(持久化数据)、环境变量(设置初始密码等),推荐命令如下:

bash

docker run -d \
  --name mysql57 \
  -p 3306:3306 \
  -v /data/mysql57:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=your_root_password \
  -e MYSQL_DATABASE=initial_db \
  -e MYSQL_USER=custom_user \
  -e MYSQL_PASSWORD=custom_password \
  --restart=always \
  mysql:5.7 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci
参数说明:
参数 作用
-d 后台运行容器
--name mysql57 给容器命名(自定义,方便后续管理)
-p 3306:3306 端口映射:主机 3306 端口 → 容器 3306 端口(若主机 3306 被占用,可改为3307:3306
-v /data/mysql57:/var/lib/mysql 数据卷挂载:将容器内 MySQL 数据目录(/var/lib/mysql)映射到主机/data/mysql57,确保数据持久化(容器删除后数据不丢失)
MYSQL_ROOT_PASSWORD 必须设置:root 用户的初始密码
MYSQL_DATABASE 可选:自动创建一个初始数据库(如initial_db
MYSQL_USER/MYSQL_PASSWORD 可选:自动创建一个普通用户及密码,并授予初始数据库的权限
--restart=always 容器退出时自动重启(服务器重启后也能自动启动)
最后两行 MySQL 服务的额外配置:设置默认字符集为utf8mb4(支持 emoji 表情和更多字符)

三、容器管理与操作

1. 查看容器状态

bash

docker ps | grep mysql57
# 若状态为`Up`,表示运行正常
2. 进入容器内部

如需在容器内操作 MySQL(如执行 SQL 命令),可进入容器的 bash 终端:

bash

docker exec -it mysql57 /bin/bash

进入后,通过 MySQL 客户端登录:

bash

mysql -u root -p
# 输入创建容器时设置的`MYSQL_ROOT_PASSWORD`密码
3. 外部连接 MySQL

通过本地或其他机器的 MySQL 客户端(如 Navicat、DBeaver)连接:

  • 主机:Docker 宿主机的 IP 地址(如服务器公网 IP 或本地127.0.0.1
  • 端口:映射的主机端口(如3306,若修改过则用实际端口)
  • 用户名root 或自定义用户(MYSQL_USER
  • 密码:对应用户的密码(MYSQL_ROOT_PASSWORDMYSQL_PASSWORD

四、数据备份与恢复

1. 备份数据库

通过mysqldump命令备份容器内的数据库到主机:

bash

# 备份所有数据库
docker exec mysql57 mysqldump -u root -p'your_root_password' --all-databases > /backup/mysql57_all_$(date +%Y%m%d).sql

# 仅备份指定数据库(如initial_db)
docker exec mysql57 mysqldump -u root -p'your_root_password' initial_db > /backup/mysql57_initialdb_$(date +%Y%m%d).sql
2. 恢复数据库

将主机的备份文件导入容器内的 MySQL:

bash

# 恢复到指定数据库(需先确保数据库存在)
cat /backup/mysql57_initialdb_20231017.sql | docker exec -i mysql57 mysql -u root -p'your_root_password' initial_db

五、常见问题解决

1. 端口冲突(port is already allocated

主机 3306 端口被占用(如已安装本地 MySQL),解决方法:

  • 停止占用端口的服务:sudo systemctl stop mysql
  • 或修改映射端口:-p 3307:3306(使用主机 3307 端口)
2. 数据卷权限问题(容器启动失败,日志显示权限错误)

主机挂载目录权限不足,导致 MySQL 无法写入数据:

bash

# 修复主机目录权限(MySQL容器内默认用户ID为999)
sudo chown -R 999:999 /data/mysql57
sudo chmod -R 755 /data/mysql57
3. 忘记 root 密码

通过以下步骤重置:

  1. 停止容器:docker stop mysql57
  2. 无密码启动容器(临时):

    bash

    docker run -d --name mysql57-tmp -p 3306:3306 -v /data/mysql57:/var/lib/mysql mysql:5.7 --skip-grant-tables
    
  3. 进入容器并修改密码:

    bash

    docker exec -it mysql57-tmp /bin/bash
    mysql -u root  # 无需密码直接登录
    # 执行SQL重置密码
    use mysql;
    update user set authentication_string=password('new_password') where user='root';
    flush privileges;
    exit;
    
  4. 停止临时容器并重启原容器:

    bash

    docker stop mysql57-tmp && docker rm mysql57-tmp
    docker start mysql57
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐