我已经构建了一个包含简单Flask测试应用程序的Docker镜像:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "Hello World!"
if __name__ == "__main__":
app.run(debug=True,host='0.0.0.0')
使用Dockerfile
:
FROM ubuntu:latest
RUN apt-get update -y
RUN apt-get install -y python-pip python-dev build-essential
COPY . /app
WORKDIR /app
RUN pip install -r /app/requirements.txt
ENTRYPOINT ["python"]
CMD ["app.py"]
Docker镜像是使用docker build -t flask-app .
构建的,并且已成功创建:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
flask-app latest fab0d79fd7ac 8 minutes ago 642.2 MB
ubuntu latest 104bec311bcd 5 weeks ago 129 MB
我用它来运行它:
$ docker run -d -p 5000:5000 flask-app
e92b249dd02ca44489069b783fa9be713c7a14ea893061194e37c80f16d8c931
我假设我可以通过将浏览器指向http://localhost:5000/
来测试应用程序但是我会超时。可能出现什么问题?
答案 0 :(得分:4)
从这里看,一切都很好看。我们来做一些调试。
让我们从一个名字开始我们的容器开始:
docker run -d -p 5000:5000 --name flask-app-test flask-app
您还可以避开-d
标记并将日志直接显示在屏幕上。
首先检查Flask应用程序是否真的在运行,或者它是否已经崩溃。从一个简单的docker ps
开始(看看你是否注意到有什么奇怪的事情)然后是docker logs flask-app-test
(这些将是Flask应用程序的日志,它是否崩溃?有什么奇怪的吗?)
如果在此之前一切都很好,那么现在是时候进入容器了。让我们试试docker exec -ti flask-app-test bash
。进入后,按wget
安装apt-get install wget
,然后通过执行wget http://localhost:5000
和cat
测试网络服务器是否在内部运行 - 希望下载的文件({{ 1}}后跟ls
,或其他任何内容。
答案 1 :(得分:3)
[sudo] docker ps -qf "name=<containername>"
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container_id>
http://<the_resulting_ip>:5000/
答案 2 :(得分:1)
我在我的系统上执行了以下步骤:
flask
的requirements.txt文件它对我很好:
$ curl localhost:5000
Hello World!
docker进程运行没问题,日志结帐正常:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c0228a88719 flask-app "python app.py" 25 seconds ago Up 24 seconds 0.0.0.0:5000->5000/tcp frosty_borg
$ docker logs 0c0228a88719
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger pin code: 216-035-222
172.17.0.1 - - [22/Jan/2017 12:56:37] "GET / HTTP/1.1" 200 -
当您启动docker容器时,请检查它是否是侦听端口5000.例如,在我的系统上:
$ netstat -atn | grep 5000
tcp6 0 0 ::1.5000 *.* LISTEN
tcp4 0 0 *.5000 *.* LISTEN
$ docker stop 0c0228a88719
0c0228a88719
$ netstat -atn | grep 5000
$ # stops listening
重要的是,如何运行dpcker,它是在Linux桌面机器上本机运行的吗?或者您是在Mac / Windows主机上的Linux虚拟机中运行它(通过像docker机器或其他方法这样的服务)?如果是这样,那么问题可能是你应该访问的IP不是localhost,而是虚拟机的IP地址。
答案 3 :(得分:1)
也许您的docker引擎没有在启动命令的同一操作系统上运行。例如。如果您将docker与windows一起使用,则docker引擎(通常)在具有不同IP的虚拟机内运行,因此您需要编写http://[IP虚拟机]:5000 /
在某些配置中,正确的URL为http://192.168.99.100:5000/(因为默认情况下,在某些配置中,该虚拟机的IP地址为192.168.99.100)
答案 4 :(得分:0)
在Dockerfile中缺少此部分
COPY ./requirements.txt /app/requirements.txt
Add this line to your Dockerfile before
<强> app.py 强>
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "Hello World!"
if __name__ == "__main__":
app.run(debug=True,host='0.0.0.0')
<强> requirements.txt 强>
Flask==0.10.1
#or it can be any version
<强> Dockerfile 强>
FROM ubuntu:16.04
MAINTANER Your Name "youremail@domain.tld"
RUN apt-get update -y && \
apt-get install -y python-pip python-dev
#your Dockerfile is missing this line
COPY ./requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip install -r requirements.txt
COPY . /app
ENTRYPOINT [ "python" ]
CMD [ "app.py" ]
要运行的泊坞窗命令
docker build -t flaskapp:latest .
#flask runs in default port 5000
docker run -d -p 5000:5000 flaskapp