Docker错误绑定:地址已被使用

当我在Docker项目中运行docker-compose up时,它失败了,并显示以下消息:

启动userland代理时错误:监听tcp 0.0.0.0:3000:绑定:地址已在使用

netstat -pna | grep 3000

显示了这个:

tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      -

我已经尝试过docker-compose down,但它没有帮助。

617903 次浏览

在你的情况下,它是一些其他进程正在使用端口,正如注释中所指出的,sudo netstat -pna | grep 3000帮助你解决了这个问题。

而在其他情况下(我自己遇到过很多次),大多数情况下是相同的容器在其他实例中运行。在这种情况下,docker ps是非常有用的,因为我经常让相同的容器在其他目录中运行,然后尝试在其他地方再次运行,在那里使用相同的容器名称。

docker ps如何帮助我:

docker rm -f $(docker ps -aq)是一个简短的命令,我用来删除所有的容器。

编辑:添加了如何docker ps帮助我。

我也有同样的问题。我通过停止主机上的Apache2服务来解决这个问题。

对我来说是

启动userland代理错误:监听tcp 0.0.0.0:9000:绑定:地址已经在使用

我所需要的是关闭调试监听php风暴icon

我也有同样的问题, docker-compose down --rmi all(在你运行docker-compose up的同一目录下) 帮助< / p >

UPD:注意-这也会删除你已经提取的本地docker映像(从评论)

这帮助了我:

docker-compose down  # Stop container on current dir if there is a docker-compose.yml
docker rm -fv $(docker ps -aq)  # Remove all containers
sudo lsof -i -P -n | grep <port number>  # List who's using the port
< p >,然后: kill -9 <process id> (macOS)或sudo kill <process id> (Linux).

来源:评论由用户Rub21

我多次遇到同样的问题。重新启动docker似乎可以做到这一点

我今天下午升级了我的码头机,遇到了同样的问题。我尝试重新启动docker,但没有运气。

最后,我不得不重新启动我的电脑,它工作了。绝对是个bug。

我通过重新启动Docker来解决这个问题。

对于Linux / Unix:

简单搜索linux实用程序使用以下命令

netstat -nlp | grep 8888

它将显示在该端口上运行的进程,然后使用该进程的PID(在行中查找PID)杀死该进程。

kill PID

检查docker-compose.yml,可能是端口被指定了两次。

version: '3'
services:
registry:
image: mysql:5.7
ports:
- "3306:3306"             <--- remove either this line or next
- "127.0.0.1:3306:3306"

如果redis服务器作为一个服务启动,当你使用kill -9 <process_id>sudo kill -9 `sudo lsof -t -i:<port_number>` 时,它会重新启动自己。在这种情况下,您需要使用以下命令停止redis服务。

sudo service redis-server stop

@DmitrySandalov的回答:我在8080上运行tomcat/java,它需要继续运行。看看船坞。Yml文件并将8080的条目更改为我选择的另一个条目。

nginx:
build: nginx
ports:
#- '8080:80' <-- original entry
- '8880:80'
- '8443:443'

完美的工作。(唯一的问题是,如果我更新项目,更改将被删除,因为它来自外部回购。)

在某些情况下,在停止容器或杀死进程之前对问题执行更深入的调试是至关重要的。

考虑以下清单:

1) 检查当前的docker编写环境
docker-compose ps运行。
如果端口正在被其他容器使用,则用docker-compose stop <service-name-in-compose-file>停止它或用rm替换stop来移除它 2) 检查当前工作区外运行的容器
运行docker ps查看在你的主机下运行的所有容器的列表 如果你发现端口正在被另一个容器使用,你可以用docker stop <container-id>停止它。< br > (*)因为你不在源compose环境的作用域下——首先使用码头工人检查来收集关于你要停止的容器的更多信息是一个很好的做法。< / p > < p > 3) 检查端口是否被主机上的其他进程占用 < br > 例如,端口为6379,执行命令

$ sudo netstat -ltnp | grep ':6379'
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      915/redis-server 12
tcp6       0      0 ::1:6379                :::*                    LISTEN      915/redis-server 12

(*)你也可以使用lsof命令,该命令主要用于检索被各种进程打开的文件的信息(我建议在此之前运行netstat)。

因此,对于上面的输出,PID915。现在你可以运行:

$ ps j 915
PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
1   915   915   915 ?           -1 Ssl    123   0:11 /usr/bin/redis-server 127.0.0.1:6379

并查看父进程的ID (PPID)和执行命令 你也可以运行:$ pstree -s <PID>来显示进程及其相关进程 在我们的例子中,我们可以看到进程可能是一个守护进程(PPID为1)-在这种情况下,考虑运行:
a) $ cat /proc/<PID>/status,以获得关于进程的更深入的信息,如进程所产生的线程数,它的能力等 B) $ systemctl status <PID>,以便查看导致特定进程创建的单元。如果服务不重要——你可以停止并禁用服务。< / p > 4) 重启Docker服务
运行:sudo service docker restart。< / p > 5) 你到了这一步…
只有当它不会将您的系统置于危险之中时,才考虑重新启动服务器

如果你有同样的问题,并且是在Windows上,只是一个旁注:

在我的情况下,进程在我的方式只是grafana-server.exe。因为我首先下载了二进制版本并双击可执行文件,现在它作为一个服务由用户SYSTEM启动,我不能taskkill(没有权限)

我必须进入Windows的“服务管理器”,搜索“Grafana”服务,并停止它。此后,端口3000不再被占用。

希望这能有所帮助。

使用8888端口的是Jupiter,我必须更改Jupiter笔记本的配置文件以在另一个端口上运行。

列出谁正在使用该特定端口。 sudo lsof -i -P -n | grep 9

你可以在~/.jupyter/jupyter_notebook_config.py中指定你想要Jupyter运行的端口,不注释/编辑下面的行:

c.NotebookApp.port = 9999

如果你没有jupyter_notebook_config.py,试着运行jupyter notebook——generate-config。有关Jupyter配置的更多详细信息,请参见此。

改变network_mode:“bridge”到“host”。

这与

version: '2.2'
services:
bind:
image: sameersbn/bind:latest
dns: 127.0.0.1
ports:
- 172.17.42.1:53:53/udp
- 172.17.42.1:10000:10000
volumes:
- "/srv/docker/bind:/data"
environment:
- 'ROOT_PASSWORD=secret'
network_mode: "host"

在运行之前:docker run -d——name oracle -p 1521:1521 -p 5500:5500 qa/oracle 我刚刚将端口更改为docker run -d——name oracle -p 1522:1522 -p 5500:5500 qa/oracle

这对我来说很有效!

在我的机器上,这个命令netstat -tulpn没有显示正在使用的端口(8080)的PID,所以我不能杀死它,杀死容器并重新启动计算机不起作用。所以service docker restart命令为我重启了docker (ubuntu),端口不再使用,我是一个快乐的家伙,去吃午饭。

当我试图启动一个新的容器时,我得到了下面的错误

listen tcp 0.0.0.0:8080: bind: address already in use.

要查看哪个进程正在端口8080上运行,运行以下命令:

netstat -tulnp | grep 8080

我得到了下面的输出

[root@ip-112-x6x-2x-xxx.xxxxx.compute.internal (aws_main) ~]# netstat -tulnp | grep 8080 tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN **12749**/java [root@ip-112-x6x-2x-xxx.xxxxx.compute.internal (aws_main) ~]#

运行

kill -9 12749

然后尝试重新启动容器,它应该可以工作

也许这太粗鲁了,但对我来说很管用。重新启动docker服务本身

sudo service docker restart

希望它也适用于你!

这很可能是因为你已经在你的主机操作系统上运行了一个web服务器,所以它与Docker试图启动的web服务器冲突。

所以,在尝试其他任何方法之前,先试试下面这句话:

sudo service apache2 stop; sudo service nginx stop; sudo nginx -s stop;

我已经用另一个端口运行了集装箱,比如……8082: -)

更改docker更新的端口比关闭其他使用端口80的服务更有意义。

change to port in docker browser

我遇到了这个问题。我的简单解决方案是从系统中删除mongodb

Ubuntu中删除mongodb的命令:

sudo apt-get purge mongodb mongodb-clients mongodb-server mongodb-dev


sudo apt-get purge mongodb-10gen


sudo apt-get autoremove

让我再加一个例子,因为我有同样的错误,目前列出的解决方案都不可行:

serv1:
...
networks:
privnet:
ipv4_address: 10.10.100.2
...


serv2:
...
# no IP assignment, no dependencies
  

networks:
privnet:
ipam:
driver: default
config:
- subnet: 10.10.100.0/24

根据init顺序,serv2可能会在serv1启动之前被分配IP 10.10.100.2,所以我只是手动为所有容器分配IP以避免错误。也许还有其他更优雅的方式。

首先,确保您正在运行哪个服务在你的特定端口。在您的示例中,您已经使用了端口号3000。

netstat -aof | findstr :3000


现在停止这个过程运行在特定的端口

lsof -i tcp:3000

我也有同样的问题,通过停止docker container它得到了解决。

sudo docker container stop <container-name>

我在我的ubuntu机器上运行apache。我用这个命令杀死了它!

sudo /etc/init.d/apache2 stop

我解决了这个sudo service redis-server stop

你可以用下面的命令杀死监听该端口的进程:

kill -9 $(lsof -t -i tcp:<port#>)

例:

kill -9 $(lsof -t -i tcp:<port#>)

或者ubuntu:

sudo kill -9 `sudo lsof -t -i:8000`

lsof的手册页:https://man7.org/linux/man-pages/man8/lsof.8.html

-9是硬杀,不检查任何deps。


(不相关,但可能有用,如果它的PORT 5000神秘)-罪魁祸首进程是由于Mac OS monterery。

端口5000通常用于为本地开发服务器提供服务。当更新到最新的macOS操作系统时,我无法将docker绑定到端口5000,因为它已经在使用中。(您可能会发现一条类似Port 5000已被使用的消息。)

通过运行lsof -i:5000,我发现使用端口的进程名为ControlCenter,这是一个本地macOS应用程序。如果这种情况发生在您身上,即使您使用暴力(并杀死)应用程序,它也会重新启动。在我的笔记本电脑中,lsof -i:5000返回控制中心正在被id为433的进程使用。我可以杀死所有-p 433,但macOS不断重新启动进程。

在这个端口上运行的进程原来是一个AirPlay服务器。你可以在

系统首选项›共享,取消检查AirPlay接收器以释放端口5000。

在我的例子中,问题是我作为根用户运行MongoDB,停止它就可以了。

sudo brew services stop mongodb-community

我试了所有的方法,包括关闭播放功能,但都没有效果。

最后,这个简单的解决方案起作用了。 在应用程序运行定义主机为0.0.0.0和端口5000显式,bing一切工作

app.run(debug=True,host="0.0.0.0",port=5000)

现在运行应用程序为

docker run -p 5000:5000 <Image Name>