【问题标题】:Docker Error bind: address already in useDocker 错误绑定:地址已在使用中
【发布时间】: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 代理
  • 我在这个答案中修复了同样的问题:stackoverflow.com/a/58772307/3530707

标签: ubuntu docker ubuntu-14.04 bind docker-compose


【解决方案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 &lt;process id&gt; (macOS) 或 sudo kill &lt;process id&gt; (Linux)。

来源:comment by user Rub21

【讨论】:

  • docker rm -fv $(docker ps -aq) 这行是我所需要的。谢谢
  • lsof 发挥了作用,杀死了进程并重新开始行动......
  • 有趣的是,每次我杀死它时,它都会分配给另一个我觉得非常有线的端口。
  • sudo lsof -i -P -n | grep &lt;port number&gt; -> 这个足以在 OSX ty 上调试 :)
【解决方案3】:

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

【讨论】:

  • 这也是我的问题,我忘了我安装了 Apache
  • FR:要停止 Apache 2 Web 服务器,请输入:# /etc/init.d/apache2 stop
  • sudo service apache2 stop &amp;&amp; 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 &lt;service-name-in-compose-file&gt; 停止它,或者通过将stop 替换为rm 来删除它。

2) 检查在当前工作区之外运行的容器
运行 docker ps 以查看在您的主机下运行的所有容器的列表。
如果您发现该端口正在被另一个容器使用,您可以使用docker stop &lt;container-id&gt; 停止它。
(*) 因为您不在源 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 &lt;PID&gt; 以直观显示进程及其相关进程。

在我们的例子中,我们可以看到该进程可能是一个守护进程(PPID 为 1) - 在这种情况下,请考虑运行:
A) $ cat /proc/&lt;PID&gt;/status 以获得有关该进程的更深入的信息,例如进程产生的线程数、其功能等。
B) $ systemctl status &lt;PID&gt; 以查看导致创建特定进程的 单元。如果服务不重要 - 你可以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 &lt;process_id&gt;sudo kill -9 `sudo lsof -t -i:&lt;port_number&gt;` 时它会自行重启。在这种情况下,您需要使用以下命令停止 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>
                                

                                【讨论】:

                                  猜你喜欢
                                  • 2020-10-06
                                  • 2018-04-14
                                  • 2011-01-09
                                  • 2021-01-04
                                  • 2012-05-02
                                  • 2018-03-20
                                  相关资源
                                  最近更新 更多