docker多容器的应用
1 ) 任务
- 使用python写个web页面,将数据存放于redis
- 在docker开发中,我们应该遵循每个容器只做一件事情的原则
- 在这一任务中我们使用两个容器:一个用于运行python代码, 另一个跑redis数据库
2 ) 准备redis容器
- 在hub.docker.com中查阅关于redis的镜像信息,可以找到alpine版本的
- 拉取镜像, $
docker pull redis:alpine
- 查看拉取的镜像信息, $
docker inspect redis:alpine
, 以下是主要信息"Volumes": { "/data": {} }, "Cmd": [ "redis-server" ], "ExposedPorts": { "6379/tcp": {} }
- 我们需要通过
-v
将/data
目录挂载出来,映射到物理机上的目录 - 我们创建目录, $
mkdir /redis-data
来对应容器的redis的/data目录 - 启动redis容器, $
docker run -d --name redis -v /redis-data:/data redis:alpine
--name
表示给容器指定名字
3 ) 准备python页面
- 创建一个目录用于编写web程序, $
mkdir myweb && cd myweb
- 编写
app.py
程序from flask import Flask import redis app = Flask(__name__) rd = redis.Redis(host='redis', port=6379) @app.route('/') def hello(): count = rd.incr("hits") return 'Hello World! {}'.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)
4 ) 编写Dockerfile准备构建镜像
- 编写
Dockerfile
, $vi Dockerfile
# FROM alpine # docker已经帮我们制作好了一个python镜像,我们没有必要自己制作镜像 FROM python:alpine COPY . /code # 在redis镜像中并不是pip3, 这里直接使用pip RUN pip install flask redis WORKDIR /code # 将flask的5000端口暴露出来 EXPOSE 5000 # 注意CMD这里不是python3, 使用python即可 CMD ["python", "app.py"]
- 开始构建我们的镜像
myweb
, $docker build -t myweb .
5 ) 连接两个镜像进行容器间通信
- 运行我们的服务, $
docker run --rm -p 80:5000 myweb
发现报错, 无法连接redis, 原因在于容器与容器之间没有连接 - 再次运行我们的服务, $
docker run -d --rm --link redis -p 80:5000 myweb
--link
用于连接其他容器, 这里我们连接的是redis容器
- 在浏览器访问:服务器ip地址, 即可发现页面上显示
Hello World! 1
- 每刷新一次页面,后面的值就会自增1次, 因为它是存放在redis中的
6 ) 其他说明
- 查看docker容器, $
docker ps
可以查看到我们的两个容器:myweb
、redis
- 当我们结束redis容器, 再次运行redis容器时发现数据还在, 原因在于redis存放数据的/data目录挂载到了物理机的/redis-data目录下了
- 注意以后在使用容器的时候, 如果有需要保存的数据, 先查看在容器中将数据保存的目录, 再通过
-v
挂载映射到物理机对应的相关目录上, 即可持久化数据了 - 如果在使用redis的时候,要停止服务,不要直接使用
docker kill
来结束 - redis是基于内存的数据库, 有可能数据没正常保存完, 一定先要使用
docker stop
来停止redis, 然后再进行其他操作