启动用户空间代理出错:监听tcp 0.0.0.0:3306时绑定地址已被占用。

63

我需要制作一个 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.

请帮帮忙!


1
sudo netstat -antp 的输出中,有什么在使用端口3306? - BMitch
3
我收到了这个信息,我猜这是我的本地mysql。三天前,我使用http://tecadmin.net/install-laravel-framework-on-ubuntu/#安装了Laravel和MySQL。非常感谢您的帮助!tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1370/mysqld - moonlight
2
goodnesskay的回答帮了我很多。 但是对于我来说,命令是:sudo service mysql stop。 - Ago
14个回答

97

我遇到了同样的问题。

sudo netstat -nlpt |grep 3306

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

sudo service mysql stop

请注意,您将需要使用mysql而不是mysqld

我希望这对您有用 - 我能够顺利运行docker-compose up,没有任何问题。


我们应该有一个支持本地MySQL的解决方案,停止本地MySQL不是解决方案。这会误导新手。 - Adarsh Rajput
7
运行时出现错误:netstat: t: 未知协议或未被记录的协议 - swyx
太好了,这解决了我的问题。有没有办法避免mysql服务在启动时自动启动? - guyaloni

53
尝试终止使用端口3306的所有进程:
sudo kill `sudo lsof -t -i:3306`

接下来,运行您的Docker容器:

sudo docker-compose up

这种残酷的方式对我很有效! - Gloria Chen

33

可能您已经在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服务器。


请看我下面的新评论!我已经回答了。 - moonlight
我们应该有一个支持本地MySQL的解决方案,停止本地MySQL不是解决方案。 - Adarsh Rajput
@AdarshRajput 在这种情况下,您不应该从容器中启动mysql,并将其他服务与本地mysql链接起来。或者至少为其中一个使用另一个端口。您不能有两个使用相同端口的服务。 - Spiral Out
@SpiralOut- 你是对的(从技术上讲)。但是在这里,你应该告诉如何在docker中使用不同的端口或本地mysql + OP的docker设置可能是重复的,并且没有本地实例。从OP的主要问题中看到:[已尝试在docker-compose.yml中更改默认端口] || 仍然使用3306,这意味着OP可能在错误的位置进行设置。 - Adarsh Rajput
1
@AdarshRajput,你也是对的,这可能是另一种处理方式,但它不应该在nginx端口上,而应该在mysql端口上。如果你测试过它并且它对你有效,则可以为@cece的答案点赞。 - Spiral Out

28

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

docker-compose.yml

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

docker-compose up

1
如此被低估的答案,然而当你想在另一个MySQL服务旁边使用它时,这是一个好方法。 - Lazac92
我会投票支持这个,因为它允许多个MySQL服务/实例共存,解决当前问题不会影响其他任何事情,特别是那些未知的事情。 - scotty

17
在Ubuntu上运行此命令将停止您的mysql运行,以便使您的docker容器工作:
sudo service mysql stop  

如果你正在运行apache2,那么当你想要使用nginx时,你需要停止该服务:

sudo service apache2 stop

接下来,您可以运行docker-compose up -d ...命令


这是当前的简易解决方案。 - Abdel Hidalgo
我们应该有一个支持本地MySQL的解决方案,停止本地MySQL不能是解决方案。 - Adarsh Rajput

5
对我而言,当我试图在docker容器中加载和运行MySQL镜像时,出现了同样的错误: enter image description here 即使在系统偏好设置中停止了本地mysql服务器也没有帮助: enter image description here 因为端口3306被我的tomcat服务器使用,所以基本上您必须确保docker命令要使用的端口(在此情况下是3306)不被任何其他服务占用,否则命令将失败。

5

第一种解决方案:

  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 

2
你看到的错误来自于本地mysql实例监听的端口3306(根据你的评论目前在pid 1370上)。当另一个进程正在使用该主机端口时,您将无法运行发布在此端口上的容器。解决方案是停止本地主机上的mysql,或更改/删除容器中发布的端口。如果其他容器只需要该端口,则可以将其保留未发布,并且它们可以直接在Docker私有网络(默认情况下为“bridge”)上通信。

$service mysqld stop 会给我这个错误信息: $mysqld: 无法识别的服务 第二种解决方案听起来很复杂,实际上也是这样吗? - moonlight
你可以尝试执行 ls /etc/init.d 命令来查找 MySQL 服务的名称。更改 MySQL 发布端口的步骤与更改 80 端口的步骤相同,只需要针对 3306 端口进行操作即可。 - BMitch

2

这个选项解决了我的问题:

sudo pkill mysql


0

执行这个命令解决了我的问题:

docker swarm leave --force

说明: 我在本地主机上启动了Docker Swarm服务作为主节点。 Swarm正在使用网络优先级,并利用已经使用的端口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接