Docker 端口暴露在 Mac OS X 中失败

Ser*_*nky 8 docker macos

首先,我完成了教程并从容器中的教程启动了 Flask 应用程序。它确实奏效了。

seraf$ docker run -d -P training/webapp python app.py
Run Code Online (Sandbox Code Playgroud)

然后我找到了我的虚拟机的 ip

seraf$ boot2docker ip
192.168.59.103
Run Code Online (Sandbox Code Playgroud)

并且可以访问示例应用程序http://192.168.59.103:49157

这是教程的图像 Dockerfile:

FROM ubuntu:12.04
MAINTAINER Docker Education Team <education@docker.com>
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -q curl python-all python-pip wget
ADD ./webapp /opt/webapp/
WORKDIR /opt/webapp
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python", "app.py"]
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试在 docker 容器中运行我自己的烧瓶应用程序。我正在构建一个图像:

FROM ubuntu:12.04
MAINTAINER Serafim Suhenky <email@example.com>
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install -y python-dev
RUN apt-get install -y python-pip
RUN pip install gunicorn
RUN pip install flask
#VOLUME /web
ADD ./casa-web /web
WORKDIR /web
EXPOSE 5000
ENTRYPOINT python casa-web.py
Run Code Online (Sandbox Code Playgroud)

然后我正在制作一个容器:

docker run -d -P seraf1m/web-app
Run Code Online (Sandbox Code Playgroud)

或者使用更简单的图像:

docker run -d -P seraf1m/web-app python casa-web.py
Run Code Online (Sandbox Code Playgroud)

或这个:

docker run -d -p 5000:5000 seraf1m/web-app python casa-web.py
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利;容器启动,端口暴露,我可以看到应用程序的日志。

但我无法通过http://192.168.59.103:49158或其他docker ps显示我的端口访问我的应用程序。

同时我可以访问教程应用程序。

我的形象可能有什么问题?也许与虚拟机有关?

seraf$ docker -v
Docker version 1.5.0, build a8a31ef
Run Code Online (Sandbox Code Playgroud)

我也试过这个修复;不知道它是如何工作的:

#!/bin/bash
for i in {49000..49900}; do
 VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port$i,tcp,,$i,,$i";
 VBoxManage modifyvm "boot2docker-vm" --natpf1 "udp-port$i,udp,,$i,,$i";
done
Run Code Online (Sandbox Code Playgroud)

在运行之前关闭虚拟机。然后打开,什么都没有改变。我把它回滚了。

Ser*_*nky 9

那是一个愚蠢的错误。一切都与 docker 配合得很好。

问题在于 Flask 应用程序,默认情况下它仅侦听 localhost。要使其侦听您需要设置的网络

app.run(host='0.0.0.0')

所以这就是它的工作原理:

  1. Boot2docker 为您的 mac 安装虚拟机。你可以用 ssh 进入它boot2docker ssh
  2. 该虚拟机就像运行容器的网关。每个容器都是该网关后面的虚拟 PC。如果您通过 ssh 连接到虚拟机,则可以 ping 容器。要找出容器的 ip,您应该附加到它

docker exec -it bash

现在你在容器内。您可以运行ifconfigip addr show查看容器的 ip。

  1. 一旦你有了容器的 ip,你就可以从 vm ping 它。并尝试连接到暴露的端口。(如果你看到0.0.0.0:49155->5000/tcpdocker ps,然后到5000)

curl container_ip:container_port

对我来说它拒绝连接,但是我可以通过容器本身连接 curl localhost:5000

我就是这样想出来的。