Docker错误绑定:已在使用的地址

时间:2016-06-22 15:09:21

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

当我在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,但它没有帮助。

24 个答案:

答案 0 :(得分:24)

在您的情况下,正是使用该端口的其他进程正如评论中所示,sudo netstat -pna | grep 3000帮助您解决问题。

在其他情况下(我自己多次遇到它),它主要是在其他一些实例上运行的同一个容器。在这种情况下docker ps非常有用,因为我经常在其他目录中运行相同的容器,然后尝试在其他地方再次运行,其中使用了相同的容器名称。

docker ps如何帮助我: docker rm -f $(docker ps -aq)是一个简短的命令,用于删除所有容器。

修改:添加了docker ps帮助我的方式。

答案 1 :(得分:5)

在某些情况下,必须在停止容器或终止进程之前对问题进行更深入的调试。

请考虑以下清单:

1)检查您当前的docker撰写环境
运行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

并查看父进程(PPID)的ID和执行命令。
您还可以运行:$ pstree -s <PID>以可视化方式显示该流程及其相关流程。

在我们的例子中,我们可以看到该进程可能是守护进程(PPID为1)-在这种情况下,请考虑运行:
A)$ cat /proc/<PID>/status,以便获得有关以下内容的更深入的信息进程,例如进程产生的线程数,其功能等。
B)$ systemctl status <PID>,以便查看引起特定进程创建的单元。如果服务不是很关键-您可以stop and disable the service

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

5)您已经达到了这一点。
仅在不给系统带来风险的情况下,请考虑重新启动服务器。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

当我尝试启动新的伴奏时,出现以下错误- 监听tcp 0.0.0.0: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)〜]#

杀死-9 12749

然后尝试重新启动应该工作的容器

答案 4 :(得分:1)

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

change to port in docker browser

答案 5 :(得分:1)

这很可能是因为您已经在主机操作系统上运行了 Web 服务器,因此它与 Docker 尝试启动的 Web 服务器冲突。

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

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

答案 6 :(得分:1)

在我的情况下是

  

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

我所需要做的就是关闭phpstorm icon

中的侦听侦听功能

答案 7 :(得分:1)

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

答案 8 :(得分:1)

这对我有帮助:

docker-compose down
docker rm -fv $(docker ps -aq)
sudo lsof -i -P -n | grep <port number>

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

来源:comment by user Rub21

答案 9 :(得分:1)

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

最后,我必须重新启动计算机,然后计算机才能正常工作。绝对是一个错误。

答案 10 :(得分:0)

使用端口8888的是Jupiter,我不得不更改Jupiter Notebook的配置文件才能在另一个端口上运行。

列出使用该特定端口的人员。 须藤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配置的更多详细信息,请参见此内容。

答案 11 :(得分:0)

我已经使用另一个端口运行容器,例如... 8082 :-)

答案 12 :(得分:0)

也许太粗鲁了,但是对我有用。重新启动docker服务本身

sudo service docker restart

希望它也对您有用!

答案 13 :(得分:0)

在我的机器上,此命令netstat -tulpn中未显示使用中端口(8080)的PID,因此我无法杀死它,杀死容器并重新启动计算机无效。因此,service docker restart命令为我(ubuntu)重新启动了docker,并且该端口不再使用,我很高兴开始午餐。

答案 14 :(得分:0)

在:do​​cker 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

对我来说很好!

答案 15 :(得分:0)

更改network_mode:“桥接”到“主机”对我来说是成功的。

与此

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"

答案 16 :(得分:0)

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

就我而言,按照我的方式进行的过程仅仅是grafana-server.exe。因为我首先下载了二进制版本,然后双击了可执行文件,所以它现在是由用户SYSTEM作为服务启动的,我无法taskkill(未经许可)

我必须转到Windows的“服务管理器”并搜索服务“ Grafana”,然后将其停止。之后,端口3000将不再被占用。

希望有帮助。

答案 17 :(得分:0)

我几次遇到相同的问题。重新启动docker似乎可以解决问题

答案 18 :(得分:0)

@DmitrySandalov的答案的一种变化:我的tomcat / java运行在8080上,需要继续进行。查看了docker-compose.yml文件,并将8080的条目更改为我选择的另一个。

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

工作完美。 (唯一的麻烦是,如果我更新了项目,更改将被删除,因为它来自外部存储库。)

答案 19 :(得分:0)

选中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"

答案 20 :(得分:0)

对于Linux / Unix:

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

netstat -nlp | grep 8888

它将显示正在该端口上运行的处理,然后使用该进程的PID(在行中查找PID)终止该进程。

kill PID

答案 21 :(得分:0)

docker-compose down --rmi all 

然后重新启动计算机

答案 22 :(得分:0)

我通过重启Docker解决了这个问题。

答案 23 :(得分:-1)

`$` sudo service redis-server stop

做到了。