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

Can't access docker container on port 80 on OSX

在我目前的工作中,我们有使用 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 createdocker-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 中的防火墙已关闭,我没有其他安全措施。

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

通过 localhost:80 访问是正确的,但您仍然必须确保您没有本地 apache/nginx 服务 运行ning。通常 boxen/homebrew 的遗留物绑定了那个端口,因为那是开发人员当时所做的:)

如果您正在使用 dockertoolbox/virtualbox/whatever 管理程序

你将无法通过本地主机访问它,通过 docker-machine ip,所以写 docker-machine ip default 并在你的中使用 http://$ip:80浏览器

如果这没有帮助

确保你的 nginx 容器确实工作,所以连接到容器:docker exec -i -t <containerid> bash

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

已解决!

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

In my current job we have development environment made with docker-compose.

使用特权。

[W]hen I try to access [nginx on port 80] for example via curl I get error.

鉴于没有任何原因导致您在 host os 上访问 docker,您应该查看容器内的应用程序 运行 以确保它具有绑定性到正确的 host,例如0.0.0.0 而不是 localhost

例如,如果你在 运行 Nuxt 的容器中 nuxt-ts 观察 Nuxt 将默认为 localhost 从而导致容器无法连接到docker 网络,而 npx nuxt-ts -H 0.0.0.0 将容器的内部服务器连接到所用 docker 网络的 ip(验证 ip,如 docker container inspect d8af01990363)。