解封端口80 / nginx / docker

3

我想在Docker中运行一个Laravel应用程序,但是在第一步就失败了。我尝试使用docker/getting started Docker镜像并使用以下命令,但是遇到了以下阻塞问题。

$docker run -p 80:80 docker/getting-started

docker: Error response from daemon: Ports are not available: listen tcp 0.0.0.0:80: bind: address already in use.

这里列出了正在运行的内容:

$sudo lsof -i :80

COMMAND   PID          USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
nginx     143          root    6u  IPv4 0x17106caf335097c7      0t0  TCP localhost:http (LISTEN)
nginx   10145 Jeremyrrsmith    6u  IPv4 0x17106caf335097c7      0t0  TCP localhost:http (LISTEN)
nginx   10218 Jeremyrrsmith    6u  IPv4 0x17106caf335097c7      0t0  TCP localhost:http (LISTEN)
nginx   10296 Jeremyrrsmith    6u  IPv4 0x17106caf335097c7      0t0  TCP localhost:http (LISTEN)
nginx   10372 Jeremyrrsmith    6u  IPv4 0x17106caf335097c7      0t0  TCP localhost:http (LISTEN)

根据我所读到的,我需要杀掉正在使用端口80的进程,因此我已经将它们杀死(除了错误143),但它们会以新的PID重新启动。我应该真的将它们杀死吗?

Docker: Error response from daemon: Ports are not available: listen tcp 0.0.0.0:80: bind: address already in use. 错误让我头疼不已。

netstat -ltnp | grep 80 是其他线程中常见的命令,但我得到的是 netstat: option requires an argument -- p 的响应。阅读相关信息后,我发现这是一个Linux命令(在其他线程中并不清楚)。我用的是Mac电脑,应该使用命令lsof -n -i4TCP:80 | grep LISTEN(希望能对其他人有所帮助)。这提供了

nginx   10145 Jeremyrrsmith    6u  IPv4 0x17106caf335097c7      0t0  TCP 127.0.0.1:http (LISTEN)
nginx   10218 Jeremyrrsmith    6u  IPv4 0x17106caf335097c7      0t0  TCP 127.0.0.1:http (LISTEN)
nginx   10296 Jeremyrrsmith    6u  IPv4 0x17106caf335097c7      0t0  TCP 127.0.0.1:http (LISTEN)
nginx   10372 Jeremyrrsmith    6u  IPv4 0x17106caf335097c7      0t0  TCP 127.0.0.1:http (LISTEN)

我杀死这些PID,它们只是用新的PID重新启动,我认为我不需要它们,但它们是否与系统有关?我如何完全终止它们,并且它们是否实际上阻止我使用Docker的80端口?

4个回答

2

绕过常用端口的最简单和最常见的方法是使用不同的端口映射,例如docker run -p 8080:80 docker/getting-started,然后通过localhost:8080访问。

如果您想使用端口80,则可能需要停止nginx服务而不是杀死进程。


我运行了sudo stop nginx,但返回了sudo: stop: command not found。端口8080也遇到了同样的问题,我认为这是因为我正在运行Laravel Valet,它使用nginx。 - Jeremy
你是如何安装nginx的?可以使用sudo brew services stop nginx或者sudo nginx -s stop命令来停止它。参考链接:https://serverfault.com/questions/141975/how-to-stop-nginx-on-mac-os-x - invad0r
我不确定是否直接安装了它,我认为这是 Laravel Valet。我刚刚运行了 $valet stop 命令,我认为这解决了问题。现在运行 lsof -n -i4TCP:80 | grep LISTEN 不再返回任何内容,并且运行 Docker 命令已经设置了一个容器。我将标记为已解决。谢谢。 - Jeremy

1
我认为这是laravel valet的问题。我刚刚运行了$valet stop命令,我认为这解决了问题。现在运行lsof -n -i4TCP:80 | grep LISTEN不再返回任何内容,并且运行docker命令已经设置了一个容器。所以端口80被nginx阻塞了,这是由laravel valet添加的,如果要使用端口80,则需要停止valet,并在不需要该端口时重新启动它。我想是这样。

0
Docker nginx 端口问题:默认情况下,Ubuntu 安装的是运行在 80 端口上的 Apache。这也可能发生在 Nginx 上。因此,请遵循相同的过程。
sudo /etc/init.d/apache2 stop

docker-compose.yml 文件

nginx:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - '80:80'
    volumes:
      - static_volume:/home/pos/static/
      - ./docker/nginx/development:/etc/nginx/conf.d

0

您的设备上运行着 Nginx,正如您所说,它正在阻止 80 端口。

您自己安装了 Nginx 吗? 它是否作为系统服务安装,并在您启动设备时自动启动?

如果它作为系统服务运行,则可能需要逐步使用适当的系统命令关闭它,而不是尝试杀死进程。我不知道 Mac 上的命令是什么,但是如果您搜索一下,就会发现。

在 Linux 上,根据您的系统,这可以是例如 systemctl stop nginx

您知道 Nginx 进程来自哪里吗?


我认为这是因为我正在运行Laravel Valet,https://github.com/laravel/valet/issues/163 是一个相关的问题。我没有明确安装nginx。我已经重新启动了Mac和Docker。我会深入研究如何停止nginx,谢谢。Systemctl stop nginx是Linux命令(抱歉我没有说明,我在Mac上)。 - Jeremy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接