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

Docker Error bind: address already in use

当我在我的 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 帮助您解决了问题。

而在其他情况下(我自己遇到过很多次)它在其他一些情况下大多是同一个容器 运行。在那种情况下,docker ps 非常有帮助,因为我经常将相同的容器 运行 留在其他目录中,然后在使用相同容器名称的其他地方再次尝试 运行。

docker ps如何帮助我:

docker rm -f $(docker ps -aq) is a short command which I use to remove all containers.

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

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

在我的例子中是

Error starting userland proxy: listen tcp 0.0.0.0:9000: bind: address already in use

我只需要在 php 风暴中关闭调试侦听

我有同样的问题, docker-compose down --rmi all(在你 运行 docker-compose 的同一目录中) 有帮助

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

然后: kill -9 <process id> (macOS) 或 sudo kill <process id> (Linux).

来源:comment by user Rub21.

我运行进入同一个问题好几次了。重新启动 docker 似乎可以解决问题

我今天下午升级了我的 docker 和 运行 遇到了同样的问题。我尝试重新启动 docker 但没有成功。

最后,我不得不重新启动我的电脑,它成功了。绝对是一个错误。

我通过重新启动 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 运行,需要继续进行。查看 docker-compose.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) 检查容器 运行ning 在当前工作空间之外
运行 docker ps 查看您主机下的所有容器列表 运行ning。
如果您发现该端口正在被另一个容器使用,您可以使用 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命令,主要用来获取各种进程打开的文件的信息(我建议之前运行ning 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)- 在这种情况下,请考虑 运行ning:
A) $ cat /proc/<PID>/status,以便获取有关进程的更深入的信息,例如进程生成的线程数、其功能等'。
B) $ systemctl status <PID> 为了看到 unit that caused the creation of a specific process. If the service is not critical - you can stop and disable the service.

4) 重新启动 Docker 服务
运行: sudo service docker restart.

5) 您达到了这一点并且..
仅当它不会将您的系统置于危险之中时 - 考虑重新启动服务器。

如果您有同样的问题并且与 Windows 有关,请注意:

在我的例子中,我的过程只是 grafana-server.exe。因为我首先下载了二进制版本并双击可执行文件,现在它作为服务由用户 SYSTEM 启动,我不能 taskkill(无权限)

我必须转到 Windows 的 "Service manager" 并搜索服务 "Grafana",然后停止它。之后3000端口就不再被占用了。

希望对您有所帮助。

使用端口 8888 的是 Jupiter,我不得不将 Jupiter notebook 的配置文件更改为另一个端口上的 运行。

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

你可以在 ~/.jupyter/jupyter_notebook_config.py:jupyter/jupyter_notebook_config.py:

中指定你想要 Jupyter 的端口 运行 uncommenting/editing

c.NotebookApp.port = 9999

如果您没有 jupyter_notebook_config.py 尝试 运行ning 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"

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

对我来说效果很好!

在我的机器上,此命令 netstat -tulpn 未显示 in-use 端口 (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

希望它也对你有用!

这很可能是因为您已经是 运行 主机 OS 上的网络服务器,所以它与 Docker 试图启动的网络服务器发生冲突。

所以在尝试其他任何事情之前先试试这个单线:

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

我有 运行 带有另一个端口的容器,例如... 8082 :-)

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

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

中删除 mongodb

在 Ubuntu 中删除 mongodb 的命令:

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

sudo apt-get purge mongodb-10gen 

sudo apt-get autoremove

让我再添加一个案例,因为我遇到了同样的错误,并且 none 目前列出的解决方案有效:

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 以避免错误。也许还有其他更优雅的方式。

首先,确保 which service you are running 在您的特定端口。在您的情况下,您已经在使用端口号 3000。

netstat -aof | findstr :3000

现在 stop that process 在特定端口 运行

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#>)

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

-9 用于不检查任何 deps 的硬杀。


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

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

通过运行 lsof -i :5000,我发现使用该端口的进程名为ControlCenter,这是一个原生macOS应用程序.如果您遇到这种情况,即使您使用蛮力(并杀死)该应用程序,它也会自行重启。在我的笔记本电脑中,lsof -i :5000 returns 进程 ID 433 正在使用控制中心。我可以执行 killall -p 433,但 macOS 不断重启进程。

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

中停用它

系统偏好设置 › 共享,并取消选中 AirPlay Receiver 以释放端口 5000。

在我的例子中,问题是我是 运行 MongoDB 作为 root 用户,停止这样做就成功了。

sudo brew services stop mongodb-community