启动用户态代理时出错:监听 tcp 0.0.0.0:3306:绑定:地址已在使用中

Posted

技术标签:

【中文标题】启动用户态代理时出错:监听 tcp 0.0.0.0:3306:绑定:地址已在使用中【英文标题】:Error starting userland proxy: listen tcp 0.0.0.0:3306: bind: address already in use 【发布时间】:2021-12-31 11:06:09 【问题描述】:

我必须制作Laravel 应用程序并交付一个 Dockerfile,但我真的坚持这一点。在此之前,我在我的机器上安装laravel 时遇到了噩梦。

我正在尝试获取 dockervel 图像并按照此处的步骤操作: http://www.spiralout.eu/2015/12/dockervel-laravel-development.html

但是当我运行 dartisan make:auth 时,它会在下面给出这个错误:

**ERROR:** for dockervel_mysql_1  **Cannot restart container** c258b418c03cbd6ec02c349c12cf09403f0eaf42fa9248019af7860d037d6474: **driver failed programming external connectivity on endpoint dockervel_mysql_1** (da3dd576458aa1fe3af7b539c48b9d61d97432cf5e9ee02d78562851f53981ae): E**rror starting userland proxy: listen tcp0.0.0.0:3306: bind: address already in use.**

我已尝试更改docker-compose.yml 中的默认端口

   ports:
     - "8084:80"

仍然没有,还尝试在我的机器上停止 apache2 (service apache2 stop),还尝试了 docker-compose restart 并删除了 docker 容器 dockervel_mysql_1

不得不提的是,我在/var/www/laravel中已经有一个Laravel proj.了。

请帮忙!

【问题讨论】:

来自sudo netstat -antp 的输出,什么在使用端口 3306? 我知道了,我假设那是我本地的 mysql 。三天前,我使用tecadmin.net/install-laravel-framework-on-ubuntu/# 安装了 laravel 和 mysql。非常感谢您的帮助! tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1370/mysqld goodnesskay 回答帮助了我。但对我来说,命令是:sudo service mysql stop 【参考方案1】:

我也遇到了同样的问题

sudo netstat -nlpt |grep 3306

向我展示了 PID 以及它由 (mysgld) 启动的服务。每当我试图杀死 PID 时,它就会再次启动。但是当我停止服务时,问题就解决了

sudo service mysql stop

请注意,您必须使用 mysql 而不是 mysqld

我希望这对你有用 - 我能够毫无问题地运行 docker-compose up

【讨论】:

我们应该有支持本地mysql的解决方案,停止本地mysql不能解决。引导新人做错事。 运行此错误:netstat: t: unknown or uninstrumented protocol 太好了,这就是解决我问题的方法。有什么办法可以避免mysql服务开机启动?【参考方案2】:

可能您已经在端口 3306 中运行了一个 MySQL 服务。您应该先将其关闭。 然后尝试结束docker-compose down 并使用docker-compose up 重新启动它。 还记得在项目中添加文件(如dartisan make:auth)后更改权限dpermit

更新: 由于您已将端口更改为“8084”,您应该转到localhost:8084 如果您看到 apache 默认值,那么您可能正在浏览另一台服务器,因为 dockervel 是基于 nginx 构建的。 您可能在 Docker 上也存在一些差距。不要将本地存储与 docker 存储混用。容器中的/var/www 与您本地的/var/www 不同。在 docker-compose.yml 中,您将本地 ~/dockervel/www 挂载到容器 /var/www。 我建议您重新开始并恢复您对 apache 服务器所做的更改。关闭它,你不需要它。 Dockervel 将为您提供一个容器中的 NginX 服务器。

【讨论】:

看看我下面的新评论!我回答了。 我们应该有支持本地mysql的解决方案,停止本地mysql不能解决。 @AdarshRajput 在这种情况下,您不应从容器启动 mysql 并将其他服务与本地 mysql 链接。或者至少为其中一个使用另一个端口。不能有两个服务使用同一个端口。 @SpiralOut- 你是对的(技术上)。但是在这里你应该告诉如何在 docker 或本地 mysql + 中使用不同的端口可能是 OP 的 docker 设置是重复的并且没有本地实例。请参阅 OP 的主要问题:[已尝试更改 docker-compose.yml 中的默认端口] || 3306仍在使用中,意味着OP可能在错误的地方进行设置。 @AdarshRajput 你也是对的,这可能是处理这个问题的另一种方法,但它不应该在nginx's 端口上,而是在mysql's 端口上。如果您对其进行了测试并且对您有用,请在下面投票@cece answer 【参考方案3】:

尝试杀死所有使用端口3306的进程:

sudo kill `sudo lsof -t -i:3306`

然后,运行您的 docker 容器:

sudo docker-compose up

【讨论】:

【参考方案4】:

我对这个问题的解决方法是进入

docker-compose.yml

并改变 ports: -3306:3306ports: -3307:3306 然后再次运行此命令:

docker-compose up

【讨论】:

如此被低估的答案,但是当您想在另一个 mysql 服务旁边使用它时,这是一个好方法。 我会投票给这个,因为它允许多个mysql服务/实例共存,解决当前问题不会影响其他任何事情,尤其是那些不知道的事情。【参考方案5】:

在 Ubuntu 上,运行此命令将停止运行 mysql 以使 docker 容器正常工作:

sudo service mysql stop  

然后,如果你的 apache2 正在运行,你需要停止服务,尤其是当你想使用 nginx 时:

sudo service apache2 stop

然后,您可以运行docker-compose up -d ... 命令

【讨论】:

这是当前简单的解决方案 我们应该有支持本地mysql的解决方案,停止本地mysql不能解决【参考方案6】:

第一个解决方案:

  sudo service mysql stop

然后运行

 docker-compose up 

要启动应用程序,运行此 mysql stop 命令以停止端口 3306 端口上的当前 MySQL 服务是一种快速而快速的解决方案,以便您的 docker 应用程序可以使用相同的端口。

场景 1:当你想同时运行之前运行的应用程序和下一个你想现在运行的应用程序时,问题就会出现,此时它不起作用。

方案 1 的第二种解决方案:

如果你的下一个/当前应用程序来自 docker,那么在下面尝试它会在不干扰 3306 端口的第一个应用程序 mysql 服务的情况下工作

从 docker-compose.yml 文件打开并更改 MySQL 端口

默认配置

ports:
      - $SERVER_PORT_DB:-3306:3306

更改端口

 ports:
      - $SERVER_PORT_DB:-3307:3306

现在运行下面的命令来启动应用程序

docker-composer up 

【讨论】:

【参考方案7】:

所以对我来说,当我尝试在 docker 容器中加载和运行 MySQL 映像时,我遇到了同样的错误:

即使在系统偏好设置中停止本地 mysql 服务器后也无济于事: 因为我的tomcat服务器使用了端口3306,所以基本上你必须确保docker命令想要使用的端口(在这种情况下为3306)不应该被任何其他服务使用,否则该命令将失败

【讨论】:

【参考方案8】:

您看到的错误来自在端口 3306 上侦听的本地 mysql 实例(当前在您的 cmets 的 pid 1370 上)。当另一个进程正在使用该主机端口时,您将无法运行在此主机端口上发布的容器。解决方案是在本地主机上停止 mysql,或者更改/删除容器中的已发布端口。如果只有其他容器需要这个端口,你可以不发布它,它们可以直接在 docker 私有网络上通信(默认情况下,这是“桥”)。

【讨论】:

$service mysqld stop 给了我这个:$mysqld: unrecognized service 关于第二种解决方案,它听起来很复杂吗? 您可能可以通过ls /etc/init.d 查找mysql 的服务名称。更改 mysql 发布的端口与更改端口 80 的步骤相同,您只需对 3306 而不是 80 执行此操作。【参考方案9】:

你需要更改mysql端口 因为你在你的机器上安装 mysql 并且它使用默认端口 3306

现在你正试图让 dockervel_mysql_1 运行到同一个端口 3306 ,这就是为什么你在错误“地址已在使用”中看到的原因

因此,例如,如果您将 dockervel_mysql_1 端口更改为 3307,它将正常工作,而无需停止正在您机器上运行的 mysql

【讨论】:

【参考方案10】:

运行此命令为我解决了这个问题:

docker swarm leave --force

解释: 我已经在本地主机中启动了 docker swarm 服务作为主节点。 Swarm 已获得网络优先权并已使用此端口

【讨论】:

【参考方案11】:

如果你的机器上正在运行 tomcat,它连接到 MySQL 3306 端口,那么首先杀死 tomcat 然后尝试执行 docker-compose up 来检查。

我使用了两个不同版本的 MySQL,本地机器上的 MySQL 5 和 docker 上的 8。因此,当您在 tomcat 中连接到 3306 上的 mysql5 时,如果您只是停止 mysql5,则该过程尚未完成,因为 tomcat 仍连接到 3306。杀死 tomcat,然后启动 docker,它应该可以工作。

编码愉快!!

【讨论】:

【参考方案12】:

我知道这个问题已经很老了,但有人仍在寻找答案。您不必运行任何 kill 命令,而是可以使用 docker --remove-orphans 标志,它会为您清理它。例如

docker-compose up -d --build --remove-orphans

【讨论】:

【参考方案13】:

这对我有用,只是将应用程序的端口更改为8084:80,如here 所述。

【讨论】:

以上是关于启动用户态代理时出错:监听 tcp 0.0.0.0:3306:绑定:地址已在使用中的主要内容,如果未能解决你的问题,请参考以下文章

docker-proxy - 尝试在 443 上绑定时启动用户级代理时出错

在Amazon ECS EC2任务中启动userland proxy:0.0.0.0:25时出错

Swoole 中使用 TCP 异步服务器TCP 协程服务器TCP 同步客户端TCP 协程客户端

Linux5355端口被0.0.0.0监听

Prometeus 无法在“0.0.0.0”端口 9094 上启动 TCP 侦听器:

nginx 的 gitlab 容器代理传递不适用于推送请求