外部连接不上 docker内的Mysql,telnet不通3306

本文讲述了作者在Windows环境下遇到Docker MySQL容器端口映射到主机失败的问题,通过排查发现并启用了IP转发功能,成功解决外部访问问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

从别人那拿过来的一个虚拟机,虚拟机里有docker->mysql 3306。

本机vm打开虚拟机后,自动启动mysql,查看容器运行一切正常:

docker ps -a

所有映射的端口,在外部都telnet不通,比如 3306、6379等都不行。想着在别人都ok的,在我这里不行,问题肯定出在我的虚拟机或者我的windows(跟他比,只有vm后者win不一样,给的包应该是一样的)。那就开始百度,找了好久,大概都是这种:

1、检查防火墙(我已经关闭了,还是不行)

2、mysql版本过高8.0,user用户密码加密方式改变。(将加密方式由 caching_sha2_password-> mysql_native_password,这个我本身就是mysql_native_password了,肯定也不行的)

大部分是上面两种,但我的不是,在这个帖子:

docker 端口映射 及外部无法访问问题 - 鸭子船长 - 博客园 (cnblogs.com)https://www.cnblogs.com/zl1991/p/10531726.html

发现了可能的原因进行排查,看到第二种情况,ip转发,我就尝试看看,打开ip转发,我丢,果真好了。打开ip转发:

linux centos7开启IP转发、路由转发解决docker 端口映射 及外部无法访问问题_学亮编程手记-优快云博客https://blog.youkuaiyun.com/a772304419/article/details/121697939

vi /etc/sysctl.conf

加入此行:
net.ipv4.ip_forward = 1

重新加载一下:
sysctl -p

查看一下有没有修改成功:
sysctl -a|grep "ip_forward"

net.ipv4.ip_forward = 1
....

然后在win上 telnet centos的ip 加 3306 端口,哦了,通了。

<think>好的,用户之前问过关于MySQL连接URL的问题,现在遇到了在Docker Compose部署MySQL8并进行端口映射后,外部无法连接的问题。我需要详细分析可能的原因和解决方案。首先,用户可能已经按照教程用docker-compose部署了MySQL8,但外部无法访问,说明配置可能有误或者存在权限问题。 首先,应该考虑Docker的端口映射是否正确。检查docker-compose.yml文件中的ports部分是否正确将容器3306端口映射到宿主机的某个端口,例如“3306:3306”。如果宿主机的端口被占用或者映射错误,外部无法连接。 接下来,MySQL的配置文件可能没有允许远程访问。默认情况下,MySQL可能只监听本地连接,需要在my.cnf中设置bind-address为0.0.0.0。但用户使用的是Docker,可能需要检查MySQL的配置文件是否正确挂载,或者在docker-compose中通过command参数调整配置。 然后,用户权限问题。即使用户在容器内创建了用户,可能需要授权该用户从任意主机(%)访问,而仅仅是localhost。例如,使用CREATE USER 'user'@'%'并授予权限。用户可能只创建了localhost的用户,导致外部无法登录。 防火墙或安全组设置也是一个常见问题。宿主机的防火墙可能阻止了外部访问3306端口,或者云服务器的安全组规则没有开放该端口。需要检查iptables、ufw或者云服务商的安全组配置。 此外,MySQL 8的默认认证插件是caching_sha2_password,而一些旧的客户端可能支持,导致连接失败。可能需要更改用户的认证插件为mysql_native_password,或者更新客户端。 还有,检查Docker的网络配置是否正确,容器是否在正确的网络中运行,是否有其他网络策略限制访问。如果使用桥接网络,确保端口正确暴露。 用户可能已经尝试过一些方法但未奏效,需要一步步排查。建议用户先确保端口映射正确,然后进入容器检查MySQL是否监听正确地址,再检查用户权限和防火墙设置。最后,处理认证插件的问题。 需要将这些可能的原因和解决步骤整理成清晰的解答,帮助用户逐步排查问题。同时,注意使用用户提供的docker-compose.yml示例,指出需要修改的地方,比如添加command参数修改bind-address,或者调整用户权限。还要提醒用户注意安全,比如要在生产环境中使用宽松的权限设置,避免安全风险。以下是</think>针对 Docker Compose 部署 MySQL 8 后外部无法连接的 **详细排查与解决方案**: --- ### **1. 检查 Docker 端口映射配置** 确保 `docker-compose.yml` 中正确暴露端口(格式:`宿主端口:容器端口`): ```yaml services: mysql: image: mysql:8.0 ports: - "3306:3306" # 映射宿主机3306容器3306 environment: MYSQL_ROOT_PASSWORD: your_password volumes: - mysql_data:/var/lib/mysql volumes: mysql_data: ``` - **验证映射是否生效**: ```bash docker ps # 查看端口映射状态 netstat -tuln | grep 3306 # 检查宿主机是否监听3306 ``` --- ### **2. 配置 MySQL 允许远程访问** MySQL 默认只允许 `localhost` 连接,需修改配置允许外部 IP: #### **方案一:通过 Docker 命令修改配置** 在 `docker-compose.yml` 中添加 `command` 指令覆盖默认配置: ```yaml services: mysql: image: mysql:8.0 command: - --bind-address=0.0.0.0 # 允许所有IP连接 - --default-authentication-plugin=mysql_native_password # 兼容旧客户端 ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: your_password ``` #### **方案二:挂载自定义配置文件** 1. 创建 `my.cnf` 文件: ```ini [mysqld] bind-address = 0.0.0.0 ``` 2. 修改 `docker-compose.yml` 挂载配置文件: ```yaml volumes: - ./my.cnf:/etc/mysql/conf.d/my.cnf ``` --- ### **3. 创建远程访问用户并授权** MySQL 8 默认的 `root` 用户仅允许本地连接,需手动创建远程用户: 1. 进入 MySQL 容器: ```bash docker exec -it your_mysql_container_name mysql -uroot -p ``` 2. 执行 SQL 授权命令: ```sql -- 创建用户(示例用户名为 remote_user,密码为 remote_pass) CREATE USER 'remote_user'@'%' IDENTIFIED BY 'remote_pass'; -- 授予所有数据库权限 GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%'; FLUSH PRIVILEGES; ``` --- ### **4. 检查防火墙与安全组** - **宿主机防火墙**: ```bash # 开放3306端口(以 ufw 为例) sudo ufw allow 3306/tcp sudo ufw reload ``` - **云服务器安全组**: 确保云平台(如 AWS、阿里云)的安全组规则允许入方向 `3306` 端口。 --- ### **5. 解决 MySQL 8 认证插件问题** 若客户端报错 `caching_sha2_password`,需调整用户认证方式: ```sql ALTER USER 'remote_user'@'%' IDENTIFIED WITH mysql_native_password BY 'remote_pass'; ``` --- ### **6. 完整排查流程** 1. **验证容器MySQL 是否正常**: ```bash docker exec -it mysql_container mysql -uroot -p ``` 2. **检查容器内网络监听**: ```bash docker exec -it mysql_container apt update && apt install -y net-tools docker exec -it mysql_container netstat -ant | grep 3306 # 应显示 0.0.0.0:3306 ``` 3. **从宿主机测试连接**: ```bash mysql -h 127.0.0.1 -P 3306 -u remote_user -p ``` 4. **从外部服务器测试连接**: ```bash telnet 宿主服务器IP 3306 # 确认端口可达性 mysql -h 宿主服务器IP -P 3306 -u remote_user -p ``` --- ### **7. 常见错误与解决** - **ERROR 2003 (HY000): Can't connect to MySQL server** - 端口未正确映射或防火墙拦截。 - **ERROR 1130 (HY000): Host 'xxx.xxx.xxx.xxx' is not allowed** - 用户未授权远程访问。 - **ERROR 1045 (28000): Access denied** - 认证插件兼容或密码错误。 --- ### **8. 安全建议** - 避免直接使用 `root` 用户远程连接。 - 限制远程 IP 范围(如 `'remote_user'@'192.168.1.%'`)。 - 启用 SSL 加密连接(需配置证书)。 通过以上步骤,可彻底解决 DockerMySQL 8 的远程访问问题。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值