Docker 容器发布的端口无法访问?
Docker container published ports not accessible?
情况是这样的,我有一个用这个 dockerfile 构建的容器 运行ning:
FROM python:2-onbuild
EXPOSE 8888
CMD [ "nohup", "mock-server", "--dir=/usr/src/app", "&" ]
我运行它用这个命令:
docker build -t mock_server .
docker run -d -p 8888:8888 --name mocky mock_server
我在 mac 上使用它,所以 boot2docker 正在运行,我从 8888 上的 boot2docker ip 访问它。我尝试了 boot2docker ssh 并从那里访问容器。我 运行 docker exec -it mocky bash
和 ps aux
显示:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.9 113316 18576 ? Ss 15:16 0:00 /usr/local/bin/python2 /usr/local/bin/mock-server --dir=/usr/src/app &
root 5 1.6 0.1 21916 3440 ? Ss 17:52 0:00 bash
root 9 0.0 0.1 19180 2404 ? R+ 17:53 0:00 ps aux
当我卷曲它时:
curl -I -XGET localhost:8888/__manage
HTTP/1.1 200 OK
Content-Length: 183108
Set-Cookie: flash_msg_success=; expires=Thu, 04 Sep 2014 17:54:58 GMT; Path=/
Set-Cookie: flash_msg_error=; expires=Thu, 04 Sep 2014 17:54:58 GMT; Path=/
Server: TornadoServer/4.2.1
Etag: "efdb5b362491b8e4b8347b97ccafeca02db8d27d"
Date: Fri, 04 Sep 2015 17:54:58 GMT
Content-Type: text/html; charset=UTF-8
所以我的应用 运行 在容器内,但我无法从容器外获取任何东西。这里可以做什么?
第一个猜测是 python 程序明确绑定到不允许任何远程连接的环回 IP 地址 127.0.0.1
。检查 python 模拟龙卷风服务器的文档,了解类似 --bind=0.0.0.0
的内容并相应地进行调整。
您可以通过执行 docker exec 并在容器 运行 netstat -ntlp | grep 8888
中查看绑定了哪个 IP 来确认是否属于这种情况。如果是 127.0.0.1
,则确认确实是问题所在。
Docker 在 OS 之上运行,docker 机器有自己的 IP 地址。无法访问该端口的一个可能原因是您正在使用试图访问 127.0.0.1 的本地主机:但是您的 docker 机器可能是 运行 另一个 ip 地址,因此通过替换您的 curl 的 ip 地址应该可以。
$ docker-机器ip默认
这应该给你 docker 机器的 ip 地址,用 localhost 替换它。
情况是这样的,我有一个用这个 dockerfile 构建的容器 运行ning:
FROM python:2-onbuild
EXPOSE 8888
CMD [ "nohup", "mock-server", "--dir=/usr/src/app", "&" ]
我运行它用这个命令:
docker build -t mock_server .
docker run -d -p 8888:8888 --name mocky mock_server
我在 mac 上使用它,所以 boot2docker 正在运行,我从 8888 上的 boot2docker ip 访问它。我尝试了 boot2docker ssh 并从那里访问容器。我 运行 docker exec -it mocky bash
和 ps aux
显示:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.9 113316 18576 ? Ss 15:16 0:00 /usr/local/bin/python2 /usr/local/bin/mock-server --dir=/usr/src/app &
root 5 1.6 0.1 21916 3440 ? Ss 17:52 0:00 bash
root 9 0.0 0.1 19180 2404 ? R+ 17:53 0:00 ps aux
当我卷曲它时:
curl -I -XGET localhost:8888/__manage
HTTP/1.1 200 OK
Content-Length: 183108
Set-Cookie: flash_msg_success=; expires=Thu, 04 Sep 2014 17:54:58 GMT; Path=/
Set-Cookie: flash_msg_error=; expires=Thu, 04 Sep 2014 17:54:58 GMT; Path=/
Server: TornadoServer/4.2.1
Etag: "efdb5b362491b8e4b8347b97ccafeca02db8d27d"
Date: Fri, 04 Sep 2015 17:54:58 GMT
Content-Type: text/html; charset=UTF-8
所以我的应用 运行 在容器内,但我无法从容器外获取任何东西。这里可以做什么?
第一个猜测是 python 程序明确绑定到不允许任何远程连接的环回 IP 地址 127.0.0.1
。检查 python 模拟龙卷风服务器的文档,了解类似 --bind=0.0.0.0
的内容并相应地进行调整。
您可以通过执行 docker exec 并在容器 运行 netstat -ntlp | grep 8888
中查看绑定了哪个 IP 来确认是否属于这种情况。如果是 127.0.0.1
,则确认确实是问题所在。
Docker 在 OS 之上运行,docker 机器有自己的 IP 地址。无法访问该端口的一个可能原因是您正在使用试图访问 127.0.0.1 的本地主机:但是您的 docker 机器可能是 运行 另一个 ip 地址,因此通过替换您的 curl 的 ip 地址应该可以。
$ docker-机器ip默认
这应该给你 docker 机器的 ip 地址,用 localhost 替换它。