腾讯云 Docker 安装部署 MySQL 并提供外网连接_腾讯云服务器docker部署了mysql容器,如何设置使得外部可以访问该数据库
目录
一、Docker安装MySQL
1. 准备自定义目录
2. 创建自定义配置文件
3. 部署 MySQL 容器
4. 验证 MySQL 部署
5. 创建初始化脚本(可选)
6. 备份和恢复(重要)
7. MySQL 容器管理命令
8. 性能监控(可选)
9. 安全注意事项
二、MySQL 对外提供连接
1. 确认 Docker MySQL 容器配置
2. 配置 MySQL 允许远程访问
3. K3s 节点防火墙配置
4. 腾讯云安全组配置
5. K3s 特定配置考虑点
6. 获取连接信息
7. 本地可视化工具连接
一、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 = utf8mb4collation-server = utf8mb4_unicode_cidefault-time-zone = \'+8:00\'# 性能优化参数innodb_buffer_pool_size = 256Mmax_connections = 200key_buffer_size = 32Mthread_cache_size = 16# 日志配置slow_query_log = 1slow_query_log_file = /var/lib/mysql/slow-query.loglong_query_time = 2# 安全设置max_allowed_packet = 16M[client]default-character-set = utf8mb4EOF
效果图如下:
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 <<EOFCREATE 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 < \\$BACKUP_DIR/all_databases_\\$TIMESTAMP.sql# 保留最近30天的备份find \\$BACKUP_DIR -name \"*.sql\" -type f -mtime +30 -deleteEOF# 添加执行权限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# 登录 MySQLmysql -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 mysqlnano /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/tcpsudo ufw reload# 如果使用 iptablessudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPTsudo 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 节点的公网 IPcurl -s ifconfig.me# 或wget -qO- icanhazip.com