Docker 错误绑定:地址已在使用中
Posted
技术标签:
【中文标题】Docker 错误绑定:地址已在使用中【英文标题】:Docker Error bind: address already in use 【发布时间】:2016-10-24 15:03:29 【问题描述】:当我在我的 Docker 项目中运行 docker-compose up
时,它会失败并显示以下消息:
Error starting userland proxy: listen tcp 0.0.0.0:3000: bind: address already in use
netstat -pna | grep 3000
显示这个:
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN -
我已经尝试过docker-compose down
,但是没有用。
【问题讨论】:
运行sudo netstat -pna | grep 3000
以获取正在监听的进程。
您的输出显示其他进程已经在侦听端口 3000。你可以使用其他端口吗?尝试使用sudo
来查看进程名称。
是的,这个端口上有 ntop。谢谢!我不知道sudo
可以改变输出:)
对我来说它是 8888 端口,它是 docker 代理
我在这个答案中修复了同样的问题:***.com/a/58772307/3530707
【参考方案1】:
在您的情况下,是其他一些进程正在使用该端口,如 cmets 所示,sudo netstat -pna | grep 3000
帮助您解决了问题。
虽然在其他情况下(我自己遇到过很多次),但它大多是在其他实例上运行的同一个容器。在那种情况下,docker ps
非常有帮助,因为我经常让相同的容器在其他目录中运行,然后尝试在使用相同容器名称的其他地方再次运行。
docker ps
如何帮助我:
docker rm -f $(docker ps -aq)
是一个简短的命令,我用它来删除所有容器。
编辑:添加了docker ps
如何帮助我。
【讨论】:
其实我经常遇到这个问题。什么都没有,但docker-compose down
有帮助
这肯定会有所帮助,前提是您在运行 docker-compose up
的同一目录中运行它。虽然我建议在我的回答中找到已经在运行的容器并采取所需的操作。我觉得删除它们是合适的,如果有人不想删除,那么可以使用 rm
使用 stop
来阻止它们。
我有另一台服务器在运行tensorflow/tensorflow
图像的同一端口上运行。如何设置我的图像以在另一个端口中运行。我试过这个:docker run -it -d -p 8888:8000 tensorflow/tensorflow
我将端口 8888 从我的图像绑定到客户端的 8000,但不工作。
@EmanuelFontelles 在尝试调试时,不要使用-d
选项。现在,端口公开为HOST:CONTAINER
。因此你应该运行docker run -it -p 8000:8888
【参考方案2】:
这对我有帮助:
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
然后:
kill -9 <process id>
(macOS) 或 sudo kill <process id>
(Linux)。
来源:comment by user Rub21。
【讨论】:
docker rm -fv $(docker ps -aq)
这行是我所需要的。谢谢
lsof 发挥了作用,杀死了进程并重新开始行动......
有趣的是,每次我杀死它时,它都会分配给另一个我觉得非常有线的端口。
sudo lsof -i -P -n | grep <port number>
-> 这个足以在 OSX ty 上调试 :)【参考方案3】:
我遇到了同样的问题。我通过停止主机上的 Apache2 服务解决了这个问题。
【讨论】:
这也是我的问题,我忘了我安装了 Apache FR:要停止 Apache 2 Web 服务器,请输入:# /etc/init.d/apache2 stopsudo service apache2 stop && sudo service nginx stop
为我工作。
在更新/重启后不知何故启用了 apache。它正在监听 80 端口并阻止一个重要的容器运行。
Apache2 在我的机器上安装了 php8。重启后出现问题,当系统启动时自动启动 apache2。由于我在本地计算机上不需要它,我只是通过sudo apt remove apache2
将其删除。【参考方案4】:
我有同样的问题,
docker-compose down --rmi all
(在您运行 docker-compose up 的同一目录中)
帮助
UPD:注意 - 这也会删除您拉取的本地 docker 镜像(来自 comment)
【讨论】:
是的,它总是有帮助,但down
是您通常最不想做的事情。失去当前状态不是小菜一碟。
这也会删除你拉取的本地 docker 镜像,所以请谨慎使用
您应该已经提到它将删除答案中的本地 docker 图像。【参考方案5】:
对于 Linux/Unix:
使用以下命令简单搜索 linux 实用程序
netstat -nlp | grep 8888
它将显示在此端口上运行的处理,然后使用该进程的 PID(在行中查找 PID)终止该进程。
kill PID
【讨论】:
netstat 显示 PID/程序(例如 2714/splunkd)。sudo kill 2714 工作。谢谢。【参考方案6】:在某些情况下,在停止容器或终止进程之前对问题执行更深入的调试至关重要。
考虑遵循以下清单:
1) 检查你当前的 docker compose 环境
运行docker-compose ps
。如果端口正在被另一个容器使用,请使用docker-compose stop <service-name-in-compose-file>
停止它,或者通过将stop
替换为rm
来删除它。
2) 检查在当前工作区之外运行的容器
运行 docker ps
以查看在您的主机下运行的所有容器的列表。
如果您发现该端口正在被另一个容器使用,您可以使用docker stop <container-id>
停止它。
(*) 因为您不在源 compose
环境的范围内 - 首先使用 docker inspect 收集有关您将要停止的容器的更多信息是一个好习惯。
3) 检查端口是否被主机上运行的其他进程使用 例如如果端口是 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
)。
因此,如果PID
上方的输出为915
。现在你可以运行了:
$ 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>
以查看导致创建特定进程的systemd 单元。如果服务不重要 - 你可以stop and disable the service。
4) 重启 Docker 服务
运行:sudo service docker restart
。
5) 你已经达到了这一点并且...... 仅当它不会使您的系统面临风险时 - 考虑重新启动服务器。
【讨论】:
【参考方案7】:这很可能是因为您已经在主机操作系统上运行 Web 服务器,因此它与 Docker 尝试启动的 Web 服务器冲突。
所以在尝试其他任何东西之前先试试这个单行:
sudo service apache2 stop; sudo service nginx stop; sudo nginx -s stop;
【讨论】:
这对我有用,但是当 docker 容器正在运行时,我无法正确重启 apache2 @r34 这是预期的行为。您可以在主机操作系统上或通过 Docker 运行 apache2,但不能同时运行两者。 另一个尝试sudo httpd -k stop
,因为我的 php 切换脚本为我重新启动了 apache...【参考方案8】:
在我的情况下是
启动用户态代理时出错:listen tcp 0.0.0.0:9000: bind: address already in use
我只需要在 php Storm 中关闭调试监听
【讨论】:
【参考方案9】:我在尝试启动新容器时遇到以下错误 -
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
然后尝试重新启动它应该工作的容器
【讨论】:
看准了!您的解决方案有所帮助。【参考方案10】:我今天下午升级了我的 docker 并遇到了同样的问题。我尝试重新启动 docker 但没有运气。
最后,我不得不重新启动我的电脑,它工作。绝对是一个错误。
【讨论】:
重启对我也有帮助。谢谢。【参考方案11】:将 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"
【讨论】:
【参考方案12】:我多次遇到同样的问题。重新启动 docker 似乎可以解决问题
【讨论】:
我知道如何重新启动容器。如何重启docker?sudo systemctl restart docker
,安装firewalld后出现同样的问题【参考方案13】:
检查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"
【讨论】:
这个对我有用,我碰巧重复了我的 docker-compose.yml 中的端口【参考方案14】:@DmitrySandalov 回答的一个变体:我在 8080 上运行了 tomcat/java,需要继续运行。查看 docker-compose.yml 文件并将 8080 的条目更改为我选择的另一个条目。
nginx:
build: nginx
ports:
#- '8080:80' <-- original entry
- '8880:80'
- '8443:443'
完美运行。 (唯一的问题是,如果我更新项目,更改将被删除,因为它来自外部存储库。)
【讨论】:
确保注释或删除使用端口的那行代码,否则它将继续尝试使用该端口。【参考方案15】:首先,确保which service you are running 在您的特定端口中。在您的情况下,您已经在使用端口号 3000。
netstat -aof | findstr :3000
现在 stop that process 在特定端口上运行
lsof -i tcp:3000
【讨论】:
【参考方案16】:我在我的 ubuntu 机器上运行了 apache。我用这个命令杀了它!
sudo /etc/init.d/apache2 stop
【讨论】:
【参考方案17】:我通过重启 Docker 解决了这个问题。
【讨论】:
【参考方案18】:更改 docker update 的端口比关闭其他使用端口 80 的服务更有意义。
【讨论】:
【参考方案19】:如果redis服务器作为服务启动,当你使用kill -9 <process_id>
或sudo kill -9 `sudo lsof -t -i:<port_number>`
时它会自行重启。在这种情况下,您需要使用以下命令停止 redis 服务。
sudo service redis-server stop
【讨论】:
虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高答案的长期价值。【参考方案20】:如果您遇到同样的问题并且使用的是 Windows,请注意:
就我而言,我的过程只是grafana-server.exe
。因为我首先下载了二进制版本并双击可执行文件,现在它由用户SYSTEM
作为服务启动,我不能taskkill
(无权限)
我必须去 Windows 的“服务管理器”并搜索服务“Grafana”,然后停止它。之后,端口 3000 不再被占用。
希望对您有所帮助。
【讨论】:
【参考方案21】:使用 8888 端口的是 Jupiter,我不得不更改 Jupiter notebook 的配置文件以在另一个端口上运行。
列出谁在使用该特定端口。 须藤 lsof -i -P -n | grep 9
您可以指定希望 Jupyter 运行的端口,取消注释/编辑 ~/.jupyter/jupyter_notebook_config.py 中的以下行:
c.NotebookApp.port = 9999
如果您没有 jupyter_notebook_config.py,请尝试运行 jupyter notebook --generate-config。有关 Jupyter 配置的更多详细信息,请参阅此处。
【讨论】:
【参考方案22】:在它运行之前: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
对我来说效果很好!
【讨论】:
【参考方案23】:在我的机器上,这个命令netstat -tulpn
没有为正在使用的端口(8080)显示 PID,所以我无法杀死它,杀死容器并重新启动计算机不起作用。所以service docker restart
命令为我(ubuntu)重新启动了 docker,端口不再使用,我很开心,去吃午饭了。
【讨论】:
【参考方案24】:也许这太粗鲁了,但对我有用。重启 docker 服务本身
sudo service docker restart
希望它也对你有用!
【讨论】:
【参考方案25】:我已经使用另一个端口运行容器,例如... 8082 :-)
【讨论】:
【参考方案26】:我遇到了这个问题。我的简单解决方案是从系统中删除 mongodb
在 Ubuntu 中删除 mongodb 的命令:
sudo apt-get purge mongodb mongodb-clients mongodb-server mongodb-dev
sudo apt-get purge mongodb-10gen
sudo apt-get autoremove
【讨论】:
【参考方案27】:让我再添加一个案例,因为我遇到了同样的错误,并且到目前为止列出的解决方案都不起作用:
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
根据初始化顺序,serv2 可能会在 serv1 启动之前被分配 IP 10.10.100.2,所以我只是为所有容器手动分配 IP 以避免错误。也许还有其他更优雅的方式。
【讨论】:
【参考方案28】:我有同样的问题,通过停止 docker container
解决了。
sudo docker container stop <container-name>
【讨论】:
以上是关于Docker 错误绑定:地址已在使用中的主要内容,如果未能解决你的问题,请参考以下文章
例外:Network.Socket.bind:docker 中的资源繁忙(地址已在使用中)
来自守护进程的 Docker 错误响应:“冲突……容器已在使用”
Apache 错误:地址已在使用中:make_sock:无法绑定到地址 [::]:443
收到此错误:java.net.BindException:地址已在使用中:无法绑定