一、部署环境与核心工具 咱们先把准备工作做扎实。整个部署过程,你需要准备好这几样东西: 服务器:一台阿里云轻量应用服务器就够用,系统选Ubuntu或者CentOS都行。 核心技术:Docker和Docker Compose是这次部署的“左膀右臂”,能帮你省去大量环境配置的麻烦。 数据库版本:直接上M
咱们先把准备工作做扎实。整个部署过程,你需要准备好这几样东西:
第一步,创建一个独立目录,把数据库相关的所有东西都放进去,方便管理。然后,编写一个docker-compose.yml文件,内容如下:
长期稳定更新的攒劲资源: >>>点此立即查看<<<
version: '3.8'
services:
new-db:
image: mysql:8.0
container_name: xxx-db # 容器名称
restart: always
environment:
MYSQL_ROOT_PASSWORD: xxx # root用户密码
MYSQL_DATABASE:xxx_db # 自动创建的数据库名
ports:
- "3307:3306" # 关键!宿主机端口:容器端口
volumes:
- ./mysql_data:/var/lib/mysql # 数据持久化挂载
这里有两个配置点需要特别留意:
端口映射:3307:3306这一行是关键。它意味着外部程序需要通过宿主机的3307端口来访问容器内的MySQL服务(默认3306端口)。如果你改了宿主机端口,比如改成3308,那么后续所有连接配置都得跟着改。
持久化挂载:volumes配置将容器内的数据目录挂载到宿主机的./mysql_data目录。这步操作至关重要,它能确保即使容器被删除,你的数据依然安全地保留在服务器上。
配置写完,启动就简单了。在docker-compose.yml文件所在目录下,执行一条命令:
docker compose up -d
服务就会在后台运行起来。至此,基础部署就算完成了,但先别急着高兴,真正的“挑战”往往在连接阶段。
数据库部署好了却连不上,这种经历不少人都遇到过。下面这三个“坑”,可以说是导致连接失败的“元凶”,咱们一个一个解决。
症状:
DataGrip 提示 [28000][1045] Connection timed out: connect,感觉像是拳头打在了棉花上,根本摸不到门。
原因:
问题通常不出在Docker或MySQL本身,而是云服务器的“门卫”——安全组。安全组默认只放行常见端口(如22,80,443),像我们自定义的3307端口,很可能被拦在了外面。
解决方案:
1. 登录你的云服务器控制台。
2. 找到“安全组”配置,添加入方向规则:
- 协议类型:TCP
- 端口范围:填写你映射的宿主机端口,例如 3307
- 授权对象:0.0.0.0/0(测试阶段可以这么设,生产环境强烈建议改为具体的IP或IP段)
症状:
Access denied for user ‘resumer-db’@‘xxx’
看到这个报错,是不是有点懵?明明配置里写了用户名,怎么还说不对?
原因:
这里犯了一个常见的混淆错误:把Docker容器的名称(container_name)当成了数据库的用户名。它们是两码事。
解决方案:
在DataGrip的连接配置里,请务必填写:
User: root (这是数据库的超级用户)
Password: xxx (即docker-compose.yml里MYSQL_ROOT_PASSWORD设置的值)
症状:
用户名密码都对了,却还是提示:Access denied for user ‘root’@‘你的IP’ (using password: YES)。这就让人有点恼火了。
原因:
这是MySQL 8.0的两个“默认设定”在作祟:
1. 权限限制:root用户默认只允许从‘localhost’(即服务器本机)登录,拒绝远程连接。
2. 加密冲突:MySQL 8.0默认使用了更强的caching_sha2_password加密插件,一些旧的客户端或驱动可能无法识别。
解决方案:
进入容器内部,执行一条“组合拳”命令,一次性解决这两个问题:
docker exec -it resumer-db mysql -uroot -proot -e \"ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root'; \GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; \FLUSH PRIVILEGES;"
命令解析:
这条命令干了三件大事:
1. 将root用户的身份验证插件改为兼容性更好的mysql_native_password。
2. 授予root用户从任何主机(‘%’代表所有IP)访问所有数据库的全部权限。
3. FLUSH PRIVILEGES 让权限修改立即生效。
所以,下次再遇到连接问题,不妨按这个思路排查:
根本连不上 → 先去查云服务器的安全组规则。
账号被拒绝 → 确认连接用的是root用户,而不是容器名。
密码对了还报错 → 大概率是MySQL 8.0的权限和加密问题,用上面的命令重置一下。
理清这三点,数据库连接报错基本就能迎刃而解。
通过Docker部署MySQL,核心在于理解“容器内外”的端口映射、数据持久化,以及云平台的安全策略。而成功连接的关键,则在于厘清用户权限与认证方式。把这几层关系理顺了,一个稳定、可远程访问的数据库环境就搭建完成了。剩下的,就是尽情发挥你的数据操作才华了。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述