在开始安装MySQL之前,我们需要确保Docker环境已经正确配置。CentOS 7作为稳定的Linux发行版,是运行Docker的理想选择。以下步骤将帮助您完成基础环境搭建:
首先确认系统是否已安装Docker:
bash复制docker --version
如果未安装,执行以下命令:
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 docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
注意:生产环境建议使用特定版本而非最新版,可通过
yum list docker-ce --showduplicates查看可用版本
国内直接拉取Docker官方镜像速度较慢,需要配置镜像加速器。创建配置文件:
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
EOF
重启服务使配置生效:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
验证配置是否生效:
bash复制docker info | grep Mirrors -A 10
MySQL 5.7作为长期支持版本(LTS),在稳定性和性能之间取得了良好平衡。拉取指定版本镜像:
bash复制docker pull mysql:5.7
验证镜像:
bash复制docker images | grep mysql
经验分享:生产环境强烈建议指定完整版本号如mysql:5.7.37,避免自动升级导致兼容性问题
为防止容器删除后数据丢失,需要建立持久化存储:
bash复制mkdir -p /home/service/mysql/{data,conf,logs}
chmod -R 755 /home/service/mysql
创建自定义配置文件:
bash复制cat > /home/service/mysql/conf/my.cnf <<EOF
[mysqld]
user=mysql
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password
default-time_zone='+8:00'
innodb_buffer_pool_size=1G
max_connections=200
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
EOF
关键参数说明:
- utf8mb4支持完整Unicode字符集(包括emoji)
- 时区设置为东八区
- 根据服务器内存调整innodb_buffer_pool_size
执行以下命令启动容器:
bash复制docker run -d \
--name mysql \
-p 3306:3306 \
-v /home/service/mysql/data:/var/lib/mysql \
-v /home/service/mysql/conf:/etc/mysql/conf.d \
-v /home/service/mysql/logs:/logs \
-e MYSQL_ROOT_PASSWORD=YourStrongPassword123 \
-e TZ=Asia/Shanghai \
--restart=unless-stopped \
mysql:5.7
参数详解:
-v 挂载数据卷实现持久化-e 设置环境变量--restart 配置自动重启策略TZ 显式设置时区进入容器进行安全设置:
bash复制docker exec -it mysql bash
mysql -uroot -p
执行安全脚本:
sql复制-- 修改root用户host限制
RENAME USER 'root'@'%' TO 'root'@'localhost';
-- 创建应用专用用户
CREATE USER 'app_user'@'%' IDENTIFIED BY 'ComplexPwd!2023';
-- 按需授权
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'%';
-- 移除测试数据库
DROP DATABASE IF EXISTS test;
-- 刷新权限
FLUSH PRIVILEGES;
查看容器状态:
bash复制docker ps -a --filter name=mysql
查看日志:
bash复制docker logs --tail 100 -f mysql
备份数据库:
bash复制docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > all-databases.sql
问题1:容器启动失败
检查日志定位原因:
bash复制docker logs mysql
常见原因包括:
问题2:连接缓慢
在my.cnf中添加:
code复制[mysqld]
skip-name-resolve
问题3:内存不足
调整容器内存限制:
bash复制docker update --memory 2G --memory-swap 4G mysql
创建时指定资源限制:
bash复制docker run ... \
--memory=4g \
--cpus=2 \
...
监控资源使用:
bash复制docker stats mysql
根据服务器配置调整my.cnf:
code复制innodb_buffer_pool_size = 总内存的50-70%
innodb_log_file_size = buffer_pool_size的25%
innodb_flush_method = O_DIRECT
建议应用端使用连接池,推荐配置:
我在生产环境部署时发现,将容器部署在SSD存储上,配合适当的innodb_io_capacity参数设置,可以使IO性能提升3-5倍。另外定期执行OPTIMIZE TABLE对包含大量变长字段的表特别有效。