Docker for Mac的nginx示例无法运行。

5

我使用的是Mac 10.11.5系统。我想要安装的是 Docker for Mac (不是Docker Toolbox或其他任何版本)。我按照他们的 安装页面 上的所有步骤进行操作,一切都很顺利,直到他们要求您尝试运行nginx服务器(第3步:探索应用程序并运行示例)。

运行docker run hello-world非常顺利,没有出现任何问题。我能够看到该图像所期望的正确控制台输出。

然而,接着他们要求您尝试运行nginx实例:

docker run -d -p 80:80 --name webserver nginx

我运行了这个程序,没有出现错误。控制台输出如下:

Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx
51f5c6a04d83: Pull complete 
a3ed95caeb02: Pull complete 
51d229e136d0: Pull complete 
bcd41daec8cc: Pull complete 
Digest: sha256:0fe6413f3e30fcc5920bc8fa769280975b10b1c26721de956e1428b9e2f29d04
Status: Downloaded newer image for nginx:latest
ae8ee4595f47e7057e527342783d035b224afd17327b057331529e2820fe2b61

于是我运行了docker ps命令:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
ae8ee4595f47        nginx               "nginx -g 'daemon off"   12 seconds ago      Up 10 seconds       0.0.0.0:80->80/tcp, 443/tcp   webserver

到目前为止一切都很好。但是当我打开浏览器并将其指向http://localhost时,我会收到(在Chrome中):

enter image description here

有什么想法是我做错了吗?我等了5分钟,只是为了给nginx/docker足够的启动时间,但这并没有改变任何事情。


为了跟踪目的,相关的GitHub问题:

https://github.com/docker/for-mac/issues/393


2
容器是否存在,或者仍在运行中,如果您执行 docker ps 命令会显示吗?我首先尝试检查任何端口问题的方法是尝试使用不同的端口 -p 8080:80,然后尝试访问 localhost:8080 - jacks
谢谢 @Nio (+1) - 那个有效! - smeeb
使用netstat命令查看本地使用端口80的进程。Mac默认安装了Apache,可能正在运行但未配置主目录。 - jacks
你应该使用docker-machine ip命令来查找容器的IP地址,然后在主机的浏览器上访问http://{IP}/。 - DarkLeafyGreen
4个回答

5

更正

这张图片显示80端口是httpd端口https://github.com/nginxinc/docker-nginx/blob/11fc019b2be3ad51ba5d097b1857a099c4056213/mainline/jessie/Dockerfile#L25

因此使用 -p 80:80 应该可行,并且对我而言确实有效:

docker run -p 80:80 nginx
172.17.0.1 - - [22/Aug/2016:17:26:32 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" "-"

很有可能您在主机上运行了一个httpd容器,因此端口无法绑定(应该可以通过启动进行查看),或者您可能与localhost存在问题——是否可以使用127.0.0.1?这可能是由于ipv6引起的问题。或者更好的方法是使用docker-compose.yml文件。

version: '2'
services:
  webserver:
    image: nginx
    ports:
      - '80:80'

并使用docker-compose up 进行启动 - 您可以轻松添加其他服务,例如Tomcat,puma服务器或FPM upstream等,不管您可能有任何应用程序。


感谢@Eugene(加1),但即使那是真的,我仍然认为这是Docker for Mac的文档中的一个错误,有人反对吗?!对于刚接触Docker的新手来说,他们应该如何知道他们应该按照安装说明进行到第3步,然后转而去nginx的Docker Hub页面并按照那些说明进行呢?! 但更重要的是当我尝试访问http://localhost:8080时,没有任何变化,运行Docker Compose不是(也不应该是!)运行Docker for Mac更好或更容易的先决条件!还有其他想法吗? - smeeb
这不是真的。端口映射是主机:容器。检查Jessie上默认镜像的Dockerfile - https://github.com/nginxinc/docker-nginx/blob/master/mainline/jessie/Dockerfile。它将暴露标准HTTP Web端口80。 - jacks
有趣,你是对的,我混淆了一些东西。实际上,nginx容器确实会暴露80端口,详见https://github.com/nginxinc/docker-nginx/blob/11fc019b2be3ad51ba5d097b1857a099c4056213/mainline/jessie/Dockerfile#L25,所以这应该可以正常工作。 - Eugen Mayer
有趣,你是对的,我混淆了一些东西。实际上,nginx容器确实会暴露80端口https://github.com/nginxinc/docker-nginx/blob/11fc019b2be3ad51ba5d097b1857a099c4056213/mainline/jessie/Dockerfile#L25,所以这应该可以正常工作。使用`docker run -p 80:80 nginx`,我无法连接到本地主机上的nginx而没有问题 - 所以我无法重现您的问题。请确保您不在主机上运行httpd服务器。 - Eugen Mayer

1

尝试一下 curl -XGET `docker-machine ip`:80


0
如果您正在运行 docker-machine,则在终端中运行“docker-machine ls”并获取虚拟主机的 IP。不要输入 localhost,将虚拟主机的 IP 粘贴到您的 Internet 浏览器中,它应该可以工作。

我确认这个程序可行。但好奇为什么有些人的本地主机不能用。 - farhadf

-1

我在Chrome上运行时遇到了同样的问题,但在Safari上可以正常工作。

经过一段时间的苦思冥想,我发现我的机器连接了代理,这就是问题所在。 我必须停止服务器,删除图像,关闭代理,然后重新拉取。


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