1. 环境准备与基础配置
1.1 系统环境检查
在开始部署前,我们需要确保CentOS 7系统环境符合要求。执行以下命令检查系统版本和内核信息:
bash复制cat /etc/redhat-release
uname -r
理想情况下,内核版本应在3.10以上。如果系统较旧,建议先进行更新:
bash复制sudo yum update -y
注意:生产环境中建议使用稳定的LTS版本,避免使用最新版本可能带来的兼容性问题。我在实际部署中发现,某些特定内核版本(如3.10.0-1160)与Docker的兼容性最佳。
1.2 网络配置确认
由于后续需要通过Navicat远程连接,网络模式选择至关重要。在VMware中,桥接模式是最常用的选择:
bash复制# 查看当前网络配置
ip addr show
如果使用的是NAT模式,需要额外配置端口转发。这里我推荐使用桥接模式,因为它能直接获取局域网IP,简化连接过程。
2. 清理原有数据库环境
2.1 停止MariaDB服务
CentOS 7默认安装了MariaDB,我们需要先停止相关服务:
bash复制sudo systemctl stop mariadb
sudo systemctl disable mariadb
2.2 彻底移除MariaDB
为确保完全清除,建议移除所有相关包:
bash复制sudo yum remove -y mariadb-server mariadb mariadb-libs
重要提示:如果之前有重要数据存储在MariaDB中,请先备份/var/lib/mysql目录。我在一次部署中就因为没有备份而丢失了测试数据,教训深刻。
3. Docker安装与配置
3.1 解决yum源问题
有时CentOS 7的默认yum源可能失效,我们可以先更新yum缓存:
bash复制sudo yum clean all
sudo yum makecache
如果仍然有问题,可以尝试使用阿里云镜像源:
bash复制sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
3.2 安装Docker CE
按照官方推荐的方式安装Docker:
bash复制sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
安装完成后,启动并设置开机自启:
bash复制sudo systemctl start docker
sudo systemctl enable docker
验证安装是否成功:
bash复制docker --version
3.3 配置Docker加速器
国内用户建议配置镜像加速器以提高拉取速度:
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
sudo systemctl restart docker
4. MySQL容器部署
4.1 准备持久化目录
创建用于存储MySQL数据和配置的目录:
bash复制sudo mkdir -p /opt/mysql8/{data,conf.d}
sudo chown -R 999:999 /opt/mysql8/data
这里将目录所有者设置为999是因为MySQL容器内部默认使用mysql用户(UID 999)运行。
4.2 自定义MySQL配置
创建配置文件以兼容旧版客户端:
bash复制sudo tee /opt/mysql8/conf.d/my.cnf <<-'EOF'
[mysqld]
default_authentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
EOF
这个配置做了三件事:
- 使用旧版认证方式兼容更多客户端
- 设置默认字符集为utf8mb4
- 设置默认排序规则
4.3 启动MySQL容器
使用以下命令启动容器:
bash复制docker run -d \
--name mysql8 \
--restart=always \
-e MYSQL_ROOT_PASSWORD=your_secure_password \
-e MYSQL_DATABASE=app_db \
-e MYSQL_USER=app_user \
-e MYSQL_PASSWORD=user_password \
-v /opt/mysql8/data:/var/lib/mysql \
-v /opt/mysql8/conf.d:/etc/mysql/conf.d \
-p 3306:3306 \
mysql:8.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
参数说明:
--restart=always:确保容器自动重启-e:设置环境变量(生产环境请使用更复杂的密码)-v:挂载数据卷实现持久化-p:端口映射- 最后两个参数确保使用utf8mb4字符集
5. 容器状态验证
5.1 检查容器运行状态
bash复制docker ps -f name=mysql8
预期输出应显示容器状态为"Up"。
5.2 测试数据库连接
bash复制docker exec -it mysql8 mysql -u root -p
输入密码后,可以执行SQL命令验证:
sql复制SELECT VERSION();
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
6. 网络与安全配置
6.1 防火墙配置
开放3306端口:
bash复制sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --reload
验证端口是否开放:
bash复制sudo firewall-cmd --list-ports | grep 3306
6.2 获取虚拟机IP地址
bash复制ip addr show
记录ens33或其他主网卡下的IP地址,如192.168.1.100。
7. 远程连接配置
7.1 创建远程访问用户
虽然可以使用root用户,但更安全的做法是创建专用用户:
bash复制docker exec -it mysql8 mysql -u root -p
执行SQL:
sql复制CREATE USER 'remote_user'@'%' IDENTIFIED BY 'secure_password';
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
7.2 Navicat连接配置
在Navicat中新建连接:
- 连接名:任意描述性名称
- 主机:虚拟机IP地址
- 端口:3306
- 用户名:remote_user
- 密码:secure_password
点击"测试连接"验证是否成功。
8. 高级配置与优化
8.1 性能调优
修改my.cnf添加性能相关参数:
bash复制sudo tee -a /opt/mysql8/conf.d/my.cnf <<-'EOF'
[mysqld]
innodb_buffer_pool_size=1G
innodb_log_file_size=256M
innodb_flush_log_at_trx_commit=2
sync_binlog=1000
EOF
需要重启容器使配置生效:
bash复制docker restart mysql8
8.2 备份策略
设置定期备份:
bash复制sudo mkdir /opt/mysql_backups
sudo crontab -e
添加以下内容实现每天凌晨3点备份:
code复制0 3 * * * docker exec mysql8 sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /opt/mysql_backups/dump_$(date +\%F).sql
9. 常见问题排查
9.1 连接被拒绝
可能原因:
- 防火墙未开放端口
- MySQL未授权远程访问
- 容器端口未正确映射
解决方案:
bash复制# 检查端口映射
docker port mysql8
# 检查MySQL用户权限
docker exec -it mysql8 mysql -u root -p -e "SELECT host, user FROM mysql.user;"
9.2 数据持久化失败
检查挂载卷权限:
bash复制ls -ld /opt/mysql8/data
正确的权限应为999:999。
9.3 容器启动失败
查看容器日志:
bash复制docker logs mysql8
常见问题包括:
- 数据目录权限不正确
- 配置文件语法错误
- 端口冲突
10. 生产环境建议
- 使用更复杂的密码并定期更换
- 考虑使用docker-compose管理容器
- 设置监控和告警
- 定期测试备份恢复流程
- 考虑使用读写分离或集群部署提高可用性
我在实际生产环境中发现,将MySQL配置和数据目录放在独立的磁盘分区上可以显著提高I/O性能。另外,定期执行OPTIMIZE TABLE对InnoDB表进行维护也是个好习惯。