今天我们来使用docker来部署一个工作中可能会碰到的场景服务。
需求:
分别将业务服务和redis服务运行在不同的容器中,已知业务服务需要使用redis服务
准备工作
- 拉取python:2.7镜像
- 拉取redis镜像
- 编写业务服务代码app.py
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)
步骤
- 运行redis服务(此时一般不需要做端口映射,不对外提供服务)
docker run -d --name redis redis
- 编写Dockerfile
FROM python:2.7
LABEL maintaner="xxxxx@qq.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD ["python","app.py"]
- 构建镜像
docker build -t xxxx/flask-redis .
- 运行刚刚构建的镜像(docker run命令)
docker run -d -p 5000:5000 --link redis --name flask-redis -e REDIS_HOST=redis xxxx/flask-redis
对上述命令简要说明一下,--link
是允许另一个容器在不知道一个容器ip的情况下,可以使用其容器的name来进行连接访问。比如此处redis指的是之前运行的redis容器。-e REDIS_HOST=redis
表示的是在生成容器的时候可以生成一个环境变量,此时生成的环境变量为REDIS_HOST=redis。我们进入容器运行env
命令,查看一下:
--link redis
,我们再看app.py
代码中的redis连接部分:
就实现了无需知道redis所在容器的ip地址就可以连接到redis服务了。
- 运行结果
网友评论