无法在OSX上访问端口80的Docker容器

11

在我目前的工作中,我们使用Docker Compose创建了开发环境。其中一个容器是Nginx,它提供其他容器的路由。一切似乎都很好,我的同事在Windows和OSX上正常工作,但在我的系统(OSX El Capitan)上,访问端口80的Nginx容器存在问题。

这是从docker-compose.yml文件中设置的容器。

nginx:
    build: ./dockerbuild/nginx
    ports:
        - 80:80
    links:
        - php
    volumes_from:
        - app
... and more

./dockerbuild/nginx 中,没有什么特别的地方,只是我们从各个地方都熟知的nginx配置。

当我使用 docker-compose create docker-compose start 运行一切时,然后 docker ps 给我

3b296c1e4775        docker_nginx           "nginx -g 'daemon off"   About an hour ago   Up 47 minutes       0.0.0.0:80->80/tcp, 443/tcp        docker_nginx_1

但是,当我尝试通过curl访问它时,我会收到错误信息:curl: (7) Failed to connect to localhost port 80: Connection refused

我尝试使用端口81运行容器,一切正常。

端口确实已经绑定到了docker。

22:47 $ sudo lsof -i -n -P | grep TCP
...
com.docke 14718         schovi   38u  IPv4 0x6e9c93c51ec4b617      0t0    TCP *:80 (LISTEN)
...

我的osx防火墙已经关闭,我没有其他的安全措施。


1
请仔细检查主机上是否有另一个进程正在使用端口80。使用 sudo lsof -iTCP -sTCP:LISTEN -Pnl | grep 80 命令进行确认。 - Bernard
没有,只有Docker。 - Schovi
3个回答

7

如果你正在使用docker-for-mac:

使用localhost:80访问是正确的,但仍需确保没有本地运行的apache/nginx服务。由于开发人员以前经常这样做,因此boxen/homebrew中可能存在残留的绑定该端口的服务。

如果你正在使用dockertoolbox/virtualbox/任何虚拟机:

你将无法通过localhost访问它,而是通过docker-machine IP来访问,所以在浏览器中输入docker-machine ip default,然后使用http://$ip:80进行访问。

如果以上方法都无效:

请确保您的nginx容器实际上可以工作,连接到容器:docker exec -i -t <containerid> bash

然后运行ps aux nginx或者如果已安装telnet则尝试连接到localhost。


1
正如我在问题中所写的,我尝试将容器切换到端口81,然后在另一个容器中打开localhost:81应用程序。但由于某种原因,即使容器和nginx运行,并且docker进程在端口80的列表中,端口80也无法访问。 - Schovi
请确保您没有本地运行的基于Web服务器,如上所述。 - Eugen Mayer
已经从Brew安装了Docker。 - user136776
我之前也是通过brew安装了docker,但连接容器时遇到了问题。后来我通过brew卸载了docker,并重新通过docker for mac进行了安装,现在它可以正常工作了。 - Paul Vincent Beigang

6

问题已解决!

问题出在我很久以前安装了pow(一个超级简单的自动化rails服务器,可以在app_name.local域上运行应用程序)。这个怪物留下了LaunchAgent脚本,该脚本会更新pf以将端口80转发到pow端口。


3
你的问题非常笼统,但答案却非常具体,不适合作为一般性回答。在你的情况下,可能是软件A,而对于其他人可能是B,因此解释可能更有意义。尽管我在给出以上答案时感觉很奇怪,但这个答案根本没有帮助到任何人,所以我会按反对投票。 - Eugen Mayer
2
我想补充一点,如果你想卸载pow,你需要在终端中运行以下命令:curl get.pow.cx/uninstall.sh | sh 或者在 http://pow.cx/manual.html#section_1.2 上了解更多信息。 - Andrew K
我遇到了类似的问题,但是是与puma-dev有关的:https://github.com/puma/puma-dev#uninstall - aNoble
在我的情况下,问题是由MongoDB Compass引起的。我关闭了这个应用程序,一切都正常工作了。以防万一有人遇到这种情况。谢谢。 - Jean Manzo

0
在我的现职工作中,我们使用docker-compose构建开发环境。这是一种非常有幸使用的工具。
例如,当我尝试通过curl访问端口80上的nginx时,却遇到了错误。如果你没有任何阻碍从主机操作系统访问docker的问题,那么你应该查看容器内运行的应用程序,确保它绑定到正确的主机上,比如0.0.0.0而不是localhost。
举个例子,如果你在一个带有nuxt-ts的容器中运行Nuxt,观察到Nuxt会默认使用“localhost”,从而导致容器无法连接到docker网络,而使用“npx nuxt-ts -H 0.0.0.0”则可以解决容器内部服务器连接到所使用的docker网络的IP的问题(像“docker container inspect d8af01990363”验证IP一样)。

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