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).
我运行进入同一个问题好几次了。重新启动 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>
为了看到 systemd 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
当我在我的 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).
我运行进入同一个问题好几次了。重新启动 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>
为了看到 systemd 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/editingc.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