You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Swarm环境下project服务如何连接同栈mysql容器?

问题根因

报错指向MySQL的用户权限限制,结合你给出的配置,触发原因有两个:

  1. 你的website服务使用root用户连接MySQL,若mysql_data卷在本次部署前已经存在,MySQL初始化时设置的MYSQL_ROOT_HOST: '%'配置不会覆盖已有的权限表,导致root用户未授权overlay网络段的IP访问
  2. MySQL 8.0默认使用caching_sha2_password认证插件,部分旧版本的Mysql2客户端不兼容该插件,即使账号密码正确也会被拦截

解决方案

以下两种方案二选一即可,推荐使用方案二,安全性更高:

方案一:保留root用户连接

  1. 下线已部署的栈并清理旧数据卷(无MySQL重要数据时操作):
docker stack rm project
docker volume rm mysql_data
  1. 修改docker-compose.yaml中mysql服务的环境变量,新增认证插件配置:
services:
  mysql:
    environment:
      # 原有配置保留,新增以下行
      MYSQL_DEFAULT_AUTHENTICATION_PLUGIN: mysql_native_password
  1. 重新部署栈即可:
docker stack deploy --with-registry-auth -c docker-compose.yaml project

如果需要保留现有MySQL数据,跳过清理卷步骤,直接进入MySQL容器修改权限:

# 替换为你的mysql容器ID
docker exec -it <mysql容器ID> mysql -u root -proot
# 执行SQL命令
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
FLUSH PRIVILEGES;

方案二:使用预创建的普通用户连接

你的配置中已经初始化了username普通用户,该用户默认允许所有IP访问,只需修改website服务的数据库配置即可:

services:
  website:
    environment:
      # 修改以下两行配置即可
      - project_DATABASE_USERNAME=username
      - project_DATABASE_PASSWORD=password

修改后重新部署栈即可。

验证方式

部署完成后进入website容器测试连接:

# 替换为你的website容器ID
docker exec -it <website容器ID> bash
# 测试连通性
mysql -h mysql -u username -ppassword

成功进入MySQL命令行即代表连接正常。

内容的提问来源于stack exchange,提问作者dariush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:36:03