Docker 端口公开在 Mac OS X 中失败

Docker 端口公开在 Mac OS X 中失败

首先,我按照教程操作,并从教程中启动了容器中的 Flask 应用程序。它确实有效。

seraf$ docker run -d -P training/webapp python app.py

然后我用以下命令找到了我的虚拟机的 IP

seraf$ boot2docker ip
192.168.59.103

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

以下是教程的图像 Dockerfile:

FROM ubuntu:12.04
MAINTAINER Docker Education Team <[email protected]>
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"]

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

FROM ubuntu:12.04
MAINTAINER Serafim Suhenky <[email protected]>
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

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

docker run -d -P seraf1m/web-app

或者使用更简单的图像:

docker run -d -P seraf1m/web-app python casa-web.py

或这个:

docker run -d -p 5000:5000 seraf1m/web-app python casa-web.py

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

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

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

我的图像可能出了什么问题?也许是虚拟机出了问题?

seraf$ docker -v
Docker version 1.5.0, build a8a31ef

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

#!/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

在运行虚拟机之前将其关闭。然后打开,没有任何变化。我将其恢复了。

答案1

那是个愚蠢的错误。使用 docker 一切都运行良好。

问题出在 Flask 应用上,默认情况下它只监听本地主机。要让它监听网络,你需要设置

应用程序.运行(主机='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,您就可以从虚拟机对其进行 ping 操作。并尝试连接到公开的端口。(如果您看到,0.0.0.0:49155->5000/tcp则为docker ps5000)

curl 容器 IP:容器端口

对我来说,它拒绝连接,但我可以通过以下方式从容器本身进行连接curl localhost:5000

我就是这样想出来的。

相关内容