程序准备
准备一个Python文件,名字为
app.py内容如下:from flask import Flaskfrom redis import Redisimport osimport socketapp = Flask(__name__)redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)@app.route('/')def hello():redis.incr('hits')return f"Hello Container World! I have been seen {redis.get('hits').decode('utf-8')} times and my hostname is {socket.gethostname()}.\n"
准备一个Dockerfile
FROM python:3.9.5-slimRUN pip install flask redis && \groupadd -r flask && useradd -r -g flask flask && \mkdir /src && \chown -R flask:flask /srcUSER flaskCOPY app.py /src/app.pyWORKDIR /srcENV FLASK_APP=app.py REDIS_HOST=redisEXPOSE 5000CMD ["flask", "run", "-h", "0.0.0.0"]
镜像准备
构建flask镜像,准备一个redis镜像。
$ docker image pull redis$ docker image build -t flask-demo .$ docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEflask-demo latest 4778411a24c5 About a minute ago 126MBpython 3.9.5-slim c71955050276 8 days ago 115MBredis latest 08502081bff6 2 weeks ago 105MB
创建一个docker bridge
$ docker network create -d bridge demo-network8005f4348c44ffe3cdcbbda165beea2b0cb520179d3745b24e8f9e05a3e6456d$ docker network lsNETWORK ID NAME DRIVER SCOPE2a464c0b8ec7 bridge bridge local8005f4348c44 demo-network bridge local80b63f711a37 host host localfae746a75be1 none null local$
创建redis container
创建一个叫
redis-server的container,连到 demo-network上$ docker container run -d --name redis-server --network demo-network redis002800c265020310231d689e6fd35bc084a0fa015e8b0a3174aa2c5e29824c0e$ docker container lsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES002800c26502 redis "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 6379/tcp redis-server$
创建flask container
$ docker container run -d --network demo-network --name flask-demo --env REDIS_HOST=redis-server -p 5000:5000 flask-demo
打开浏览器访问 http://127.0.0.1:5000
应该能看到类似下面的内容,每次刷新页面,计数加1Hello Container World! I have been seen 36 times and my hostname is 925ecb8d111a.总结
如果把上面的步骤合并到一起,成为一个部署脚本
# prepare imagedocker image pull redisdocker image build -t flask-demo .# create networkdocker network create -d bridge demo-network# create containerdocker container run -d --name redis-server --network demo-network redisdocker container run -d --network demo-network --name flask-demo --env REDIS_HOST=redis-server -p 5000:5000 flask-demo
