目录
一、Docker安装MySQL
1. 准备自定义目录
命令如下:
# 创建主目录
sudo mkdir -p /data/mysql
# 创建子目录结构
sudo mkdir -p /data/mysql/data # 数据文件
sudo mkdir -p /data/mysql/conf # 配置文件
sudo mkdir -p /data/mysql/logs # 日志文件
sudo mkdir -p /data/mysql/initdb.d # 初始化脚本
# 设置适当的权限(MySQL 在容器中通常以 mysql 用户运行,UID 为 999)
sudo chown -R 999:999 /data/mysql
效果图如下:
2. 创建自定义配置文件
命令如下:
sudo tee /data/mysql/conf/my.cnf > /dev/null <<EOF
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-time-zone = '+8:00'
# 性能优化参数
innodb_buffer_pool_size = 256M
max_connections = 200
key_buffer_size = 32M
thread_cache_size = 16
# 日志配置
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/slow-query.log
long_query_time = 2
# 安全设置
max_allowed_packet = 16M
[client]
default-character-set = utf8mb4
EOF
效果图如下:
3. 部署 MySQL 容器
命令如下(请确保将示例中的密码和用户名替换为您自己的强密码和用户名):
# 拉取 MySQL 镜像(以 8.0 版本为例)
docker pull mysql:8.0
# 运行 MySQL 容器
docker run -d \
--name mysql \
--restart=always \
-p 3306:3306 \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/conf/my.cnf:/etc/mysql/my.cnf:ro \
-v /data/mysql/logs:/var/log/mysql \
-v /data/mysql/initdb.d:/docker-entrypoint-initdb.d \
-e MYSQL_ROOT_PASSWORD=your_strong_password \
-e MYSQL_DATABASE=your_db_name \
-e MYSQL_USER=your_user \
-e MYSQL_PASSWORD=your_password \
mysql:8.0
重要凭据参数解释
-
MYSQL_ROOT_PASSWORD
:- 设置 MySQL root 用户的密码
- 这是必需的参数,容器不会成功启动除非设置了此项
-
MYSQL_DATABASE
:- 可选参数
- 容器首次启动时会自动创建的数据库名称
-
MYSQL_USER
和MYSQL_PASSWORD
:- 可选参数,但必须一起使用
- 创建一个新的非 root 用户
- 此用户将获得
MYSQL_DATABASE
数据库的完全权限
效果图如下:
4. 验证 MySQL 部署
命令如下:
# 查看容器状态
docker ps -a | grep mysql
# 检查容器日志
docker logs mysql
# 连接到 MySQL 服务器
docker exec -it mysql mysql -uroot -p
效果图如下:
5. 创建初始化脚本(可选)
如果要在容器首次启动时执行 SQL 脚本,创建一个初始化脚本:
sudo tee /data/mysql/initdb.d/init.sql > /dev/null <<EOF
CREATE DATABASE IF NOT EXISTS app_db;
USE app_db;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO users (username, email) VALUES ('admin', 'admin@example.com');
EOF
6. 备份和恢复(重要)
设置定期备份:
# 创建备份脚本
sudo tee /data/mysql/backup.sh > /dev/null <<EOF
#!/bin/bash
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
BACKUP_DIR="/data/mysql/backups"
mkdir -p \$BACKUP_DIR
# 使用 Docker 执行 mysqldump
docker exec mysql sh -c 'exec mysqldump -uroot -p"\$MYSQL_ROOT_PASSWORD" --all-databases' > \$BACKUP_DIR/all_databases_\$TIMESTAMP.sql
# 保留最近30天的备份
find \$BACKUP_DIR -name "*.sql" -type f -mtime +30 -delete
EOF
# 添加执行权限
sudo chmod +x /data/mysql/backup.sh
# 添加到 crontab 每天执行
(crontab -l 2>/dev/null; echo "0 3 * * * /data/mysql/backup.sh") | crontab -
效果图如下:
7. MySQL 容器管理命令
命令如下:
# 停止 MySQL 容器
docker stop mysql
# 启动 MySQL 容器
docker start mysql
# 重启 MySQL 容器
docker restart mysql
# 删除 MySQL 容器(数据不会丢失,因为存储在主机目录)
docker rm -f mysql
8. 性能监控(可选)
# 监控 MySQL 容器资源使用情况
docker stats mysql
# 查看 MySQL 状态变量
docker exec -it mysql mysql -uroot -p -e "SHOW GLOBAL STATUS;"
# 查看进程列表
docker exec -it mysql mysql -uroot -p -e "SHOW PROCESSLIST;"
9. 安全注意事项
- 请使用强密码,并避免在代码或脚本中硬编码密码
- 考虑配置 MySQL 仅监听本地地址,或使用 Docker 网络隔离
- 定期更新 MySQL 镜像以获取安全补丁:
docker pull mysql:8.0 && docker restart mysql
- 限制容器资源使用,如
--memory=1g --memory-swap=1g --cpus=1
您现在已经成功使用 Docker 在自定义目录中部署了 MySQL。这种方式确保了数据持久性和可迁移性。
二、MySQL 对外提供连接
1. 确认 Docker MySQL 容器配置
首先,确保您的 MySQL Docker 容器已经正确配置为允许远程连接:
# 如果尚未部署 MySQL 容器,使用以下命令部署
docker run -d \
--name mysql \
--restart=always \
-p 3306:3306 \ # 关键:将 MySQL 端口映射到主机
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/conf/my.cnf:/etc/mysql/my.cnf:ro \
-e MYSQL_ROOT_PASSWORD=your_strong_password \
-e MYSQL_DATABASE=your_db_name \
-e MYSQL_USER=remote_user \
-e MYSQL_PASSWORD=remote_password \
mysql:8.0
# 如果已经部署,但未映射端口,需要重新创建容器并加上端口映射
2. 配置 MySQL 允许远程访问
确保 MySQL 配置允许远程访问,命令如下(remote_user和remote_password可替换):
# 进入 MySQL 容器
docker exec -it mysql bash
# 登录 MySQL
mysql -u root -p
# 创建可远程访问的用户账号
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'strong_remote_password';
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%';
# 或限制权限到特定数据库
# GRANT ALL PRIVILEGES ON specific_db.* TO 'remote_user'@'%';
FLUSH PRIVILEGES;
EXIT;
# 检查绑定地址(确保不是只允许127.0.0.1)
cat /etc/mysql/my.cnf | grep bind-address
效果图如下:
如果绑定地址设置为 127.0.0.1,则需要修改 my.cnf 文件:
# 编辑 MySQL 配置
docker stop mysql
nano /data/mysql/conf/my.cnf
# 允许从任何IP地址连接 将 bind-address = 127.0.0.1 修改为:
bind-address = 0.0.0.0
# 重启 MySQL 容器
docker start mysql
nano操作指南如下:
nano编辑器保存和退出操作指南
在nano编辑器中工作完成后,保存并退出的操作如下:
保存文件
按下 Ctrl + O (字母O) 组合键
底部会显示文件名,可以确认或修改文件名
按下 Enter 键确认保存
退出nano
按下 Ctrl + X 组合键
如果文件已修改但未保存,会提示是否保存
输入 Y (Yes) 保存并退出
输入 N (No) 不保存直接退出
按 Ctrl + C 取消退出操作,继续编辑
常用快捷键提示
nano编辑器在底部显示一些常用快捷键,其中:
^G 表示 Ctrl + G:显示帮助
^O 表示 Ctrl + O:保存文件
^X 表示 Ctrl + X:退出编辑器
提示
nano编辑器中的 ^ 符号代表 Ctrl 键,所以当你看到 ^X 时,意思是按住 Ctrl 键同时按 X 键。
效果图如下:
3. K3s 节点防火墙配置
确保 K3s 节点的防火墙允许 3306 端口:
# 检查当前防火墙状态
sudo ufw status
# 如果启用了 ufw,则添加规则
sudo ufw allow 3306/tcp
sudo ufw reload
# 如果使用 iptables
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4
# 验证端口是否开放
sudo netstat -tulpn | grep 3306
效果图如下:
4. 腾讯云安全组配置
在腾讯云控制台配置安全组规则:
- 登录腾讯云控制台
- 导航到 安全组 配置页面
- 找到与您的 K3s 节点关联的安全组
- 添加入站规则:”协议: TCP;端口: 3306;来源: 您的本地 IP (建议)或 0.0.0.0/0 (不建议)“
5. K3s 特定配置考虑点
K3s 默认可能会干扰 Docker 网络配置,确保它们能够协同工作:
# 检查 Docker 容器是否正常运行和映射
docker ps | grep mysql
效果图如下:
6. 获取连接信息
获取用于连接的公共 IP 地址:
# 查看腾讯云 K3s 节点的公网 IP
curl -s ifconfig.me
# 或
wget -qO- icanhazip.com