Docker下Python Flask + Redis的部署
准备工作:
-
准备一个python Flask的小程序:app.py
该程序会在网页端展示被访问的次数以及主机ID
from flask import Flask from redis import Redis import os import socket app = Flask(__name__) redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379) @app.route('/') def hello(): redis.incr('hits') return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname()) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=True)
-
准备好对应的Dockerfile:Dockerfile
FROM python:2.7 LABEL maintaner="Peng Xiao xiaoquwl@gmail.com" COPY . /app WORKDIR /app RUN pip install flask redis EXPOSE 5000 CMD [ "python", "app.py" ]
-
一台安装好Docker的机器(虚拟机/服务器)
第一步,创建Redis的容器。
sudo docker run -d --name redis redis
注意:此处不用使用-p参数将容器内Redis的6379接口暴露到容器外,因为该容器仅供Python-Flask在容器内访问,而应该禁止从外部对其进行访问。
第二步,创建Python Flask容器。
首先,创建Flask程序的镜像文件(Docker image)
sudo docker build -t test/flask-redis .
然后,通过这个新的镜像文件去创建容器。
sudo docker run -d -p 5000:5000 --link redis --name flask-redis -e REDIS_HOST=redis test/flask-redis
此处通过–link在容器内部连接上Redis容器,同时设置环境变量REDIS_HOST为Redis容器的名字。
此处可以进行一个小测试:
sudo docker exec -it flask-redis /bin/bash
进入容器内部,然后ping另一个容器。
ping redis
此时,在该容器内部:
curl 127.0.0.1:5000
即可得到打印出来的呈现效果:
Hello Container World! I have been seen 1 times and my hostname is e7fd318e75d6
反复多次尝试,可得到叠加结果。说明此处已经将访问次数存储到Redis数据库。
此时,退出容器(保持继续运行)。在容器外部进行尝试。由于暴露了容器内5000端口到容器外,所以在该机器内直接访问:
curl 127.0.0.1:5000
仍然能够得到预期的结果。
由此可以轻易推广到其他各类多容器复杂应用。