报错
(HTTP code 500) server error - Ports are not
available: exposing port TCP 0.0.0.0:33060 -> 0.0.0.0:0: listen tcp
0.0.0.0:33060: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
解决方案
这个错误提示表明在启动 MySQL 容器时,端口 33060
已经被其他服务占用,导致无法在容器中绑定该端口。具体错误信息显示 bind: Only one usage of each socket address (protocol/network address/port) is normally permitted
,这意味着同一个端口不能被多个服务同时监听。
解决方案:
-
检查端口占用情况:
你可以使用以下命令查看当前是否有服务占用了33060
端口:在 Linux/macOS 上:
sudo lsof -i :33060
在 Windows 上:
netstat -ano | findstr :33060
如果发现某个进程已经占用了端口
33060
,可以终止该进程,或者选择使用其他端口。
比如我的电脑检查之后
- TCP 0.0.0.0:33060 和 [::]:33060 表示端口
33060
正在监听来自 IPv4 和 IPv6 的所有网络接口请求。换句话说,当前有一个进程正在占用33060
端口,用于 MySQL X Protocol 服务,进程号为6900
。 - LISTENING 状态表示这个端口正在等待网络连接请求。
要解决这个问题,可以考虑以下几种方法:
1. 停止占用 33060
的进程
你可以通过结束该进程来释放 33060
端口。要结束占用该端口的进程,可以在命令行中使用以下命令:
在 Linux/macOS 上:
sudo kill 6900
在 Windows 上:
taskkill /PID 6900 /F
这将停止进程号为 6900
的服务,释放 33060
端口。
2. 修改 Docker 容器的端口映射
如果你不想停止占用端口的进程,可以在启动 MySQL 容器时更改端口映射,例如将 MySQL X Protocol 服务的端口映射到主机上的其他端口:
docker run -d -p 3306:3306 -p 33061:33060 --name mysql-container mysql
这将把容器内部的 33060
端口映射到主机上的 33061
端口。
3. 禁用 MySQL X Protocol
如果你不需要 MySQL X Protocol,可以通过修改 MySQL 配置文件禁用 33060
端口:
- 找到 MySQL 的配置文件(通常是
/etc/mysql/my.cnf
或/etc/my.cnf
)。 - 添加以下内容来禁用 X Protocol:
[mysqld] mysqlx=0
然后,重新启动 MySQL 服务:
sudo service mysql restart
这将彻底关闭 33060
端口的监听,避免端口冲突。
解决后
我选择了第一种解决方案