Docker部署MySQL5.7:从安装到持久化配置全流程
MySQL作为应用系统中最常用的关系型数据库之一,在开发、测试以及生产环境中都有广泛应用。传统方式安装MySQL需要处理软件包安装、环境配置、服务管理、版本兼容等问题,而通过Docker部署MySQL5.7,可以快速完成数据库环境搭建,同时利用容器化技术实现环境隔离和便捷迁移。
本文将详细介绍Docker部署MySQL5.7的完整流程,包括Docker环境准备、MySQL5.7镜像获取、容器创建、数据持久化配置、远程连接设置以及常见问题排查,帮助开发者快速搭建稳定可靠的MySQL运行环境。
一、为什么选择Docker部署MySQL5.7
使用Docker运行MySQL,相比传统安装方式具有明显优势:
1. 环境隔离
Docker容器拥有独立运行环境,不会影响宿主机上的其他软件,也避免了不同项目之间MySQL版本冲突的问题。
例如,一个项目需要MySQL5.7,另一个项目需要MySQL8.0,可以通过不同容器同时运行:
MySQL5.7容器负责旧项目运行;
MySQL8.0容器提供新项目测试环境。
两者互不干扰。
2. 快速部署
传统安装MySQL需要下载软件包、配置服务、初始化数据库等多个步骤,而Docker只需要拉取镜像并启动容器即可。
3. 方便迁移
Docker环境可以通过镜像快速复制,在开发、测试、生产环境之间保持一致,降低部署成本。
4. 易于管理
通过Docker命令即可完成启动、停止、删除、升级等操作,不需要手动管理系统服务。
二、安装Docker环境
在部署MySQL5.7之前,需要确保服务器已经安装Docker。
可以通过以下命令检查Docker版本:
docker -v如果返回类似:
Docker version 24.x.x说明Docker已经安装成功。
如果系统没有安装Docker,可以根据操作系统进行安装。
Linux系统安装Docker示例
更新软件源:
yum update -y安装Docker:
yum install docker -y启动Docker服务:
systemctl start docker设置Docker开机启动:
systemctl enable docker检查运行状态:
systemctl status docker三、拉取MySQL5.7 Docker镜像
Docker Hub提供了官方MySQL镜像,可以直接拉取指定版本。
执行:
docker pull mysql:5.7查看已经下载的镜像:
docker images正常情况下可以看到:
REPOSITORY TAG
mysql 5.7指定版本号部署可以避免因为latest标签变化导致环境不稳定。
四、创建MySQL5.7容器
最简单的方式可以直接启动MySQL容器:
docker run -d
--name mysql57
-p 3306:3306
-e MYSQL_ROOT_PASSWORD=123456
mysql:5.7参数说明:
| 参数 | 作用 |
|---|---|
| -d | 后台运行容器 |
| --name | 指定容器名称 |
| -p | 映射端口 |
| MYSQL_ROOT_PASSWORD | 设置root密码 |
| mysql:5.7 | 使用MySQL5.7镜像 |
启动完成后,可以查看运行状态:
docker ps如果看到:
mysql57 mysql:5.7 Up说明MySQL容器已经正常运行。
五、配置MySQL数据持久化
直接运行MySQL容器存在一个问题:
如果删除容器,数据库中的数据也会丢失。
因此生产环境必须配置数据持久化。
MySQL官方镜像默认数据目录:
/var/lib/mysql可以通过Docker Volume或者宿主机目录进行映射。
六、使用目录挂载实现数据持久化
首先创建MySQL数据目录:
mkdir -p /data/mysql57/data然后重新创建容器:
docker run -d
--name mysql57
-p 3306:3306
-v /data/mysql57/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
mysql:5.7参数:
-v 宿主机目录:容器目录表示:
宿主机:
/data/mysql57/data映射到:
/var/lib/mysqlMySQL产生的数据文件都会保存到宿主机。
即使删除容器:
docker rm -f mysql57重新创建容器后,原来的数据库仍然存在。
七、配置MySQL配置文件持久化
除了数据库文件,MySQL配置也建议进行挂载。
创建配置目录:
mkdir -p /data/mysql57/conf创建配置文件:
vim /data/mysql57/conf/my.cnf示例:
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
max_connections=500
default-time-zone='+08:00'启动容器:
docker run -d
--name mysql57
-p 3306:3306
-v /data/mysql57/data:/var/lib/mysql
-v /data/mysql57/conf/my.cnf:/etc/mysql/my.cnf
-e MYSQL_ROOT_PASSWORD=123456
mysql:5.7这样MySQL配置文件也实现了持久化管理。
八、创建MySQL用户并设置远程访问
默认情况下,MySQL5.7的root用户可能只允许本地访问。
进入MySQL容器:
docker exec -it mysql57 bash登录数据库:
mysql -uroot -p输入密码后执行:
use mysql;查看用户权限:
select user,host from user;如果需要允许远程访问:
update user set host='%' where user='root';刷新权限:
flush privileges;退出:
exit;之后可以通过客户端连接:
服务器IP:3306九、解决MySQL字符集问题
Docker部署MySQL后,经常遇到中文乱码问题。
推荐统一使用UTF-8编码。
进入MySQL:
show variables like '%character%';如果看到:
latin1说明字符集没有正确配置。
可以修改my.cnf:
[mysqld]
character-set-server=utf8mb4
init_connect='SET NAMES utf8mb4'
[client]
default-character-set=utf8mb4重启容器:
docker restart mysql57再次检查:
show variables like '%character%';确保使用utf8mb4。
十、Docker管理MySQL常用命令
查看容器状态
docker ps停止MySQL
docker stop mysql57启动MySQL
docker start mysql57重启MySQL
docker restart mysql57查看日志
docker logs mysql57实时查看:
docker logs -f mysql57进入MySQL容器
docker exec -it mysql57 bash删除容器
docker rm -f mysql57注意:
删除容器不会删除挂载的数据目录。
十一、使用Docker Compose部署MySQL5.7
对于项目开发环境,推荐使用docker-compose管理。
创建:
docker-compose.yml内容如下:
version: '3'
services:
mysql:
image: mysql:5.7
container_name: mysql57
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- ./data:/var/lib/mysql
- ./conf/my.cnf:/etc/mysql/my.cnf启动:
docker-compose up -d停止:
docker-compose down通过Compose管理,可以将数据库环境配置直接提交到项目中,提高团队协作效率。
十二、Docker部署MySQL5.7常见问题
1. 容器启动后自动退出
查看日志:
docker logs mysql57常见原因:
密码配置错误;
数据目录权限不足;
配置文件格式错误。
2. 端口3306被占用
错误:
Bind for 0.0.0.0:3306 failed查看端口:
netstat -tunlp | grep 3306解决方式:
修改映射端口:
-p 3307:3306客户端连接:
服务器IP:33073. 数据目录权限问题
如果挂载目录权限不足:
chmod -R 777 /data/mysql57/data或者修改目录所属用户。
4. 忘记root密码
可以进入容器后通过跳过权限验证方式重置密码:
启动参数增加:
--skip-grant-tables然后重新设置密码。
十三、生产环境部署建议
虽然Docker部署MySQL非常方便,但生产环境仍需要做好优化:
1. 定期备份数据库
可以使用:
mysqldump进行备份:
mysqldump -uroot -p database_name > backup.sql2. 限制资源使用
Docker支持限制CPU和内存:
--memory=2g