Docker笔记:多容器的应用:基于python框架Flask的web应用与redis容器进行通信

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 可以查看到我们的两个容器:mywebredis
  • 当我们结束redis容器, 再次运行redis容器时发现数据还在, 原因在于redis存放数据的/data目录挂载到了物理机的/redis-data目录下了
  • 注意以后在使用容器的时候, 如果有需要保存的数据, 先查看在容器中将数据保存的目录, 再通过-v 挂载映射到物理机对应的相关目录上, 即可持久化数据了
  • 如果在使用redis的时候,要停止服务,不要直接使用docker kill来结束
  • redis是基于内存的数据库, 有可能数据没正常保存完, 一定先要使用docker stop来停止redis, 然后再进行其他操作
发布了403 篇原创文章 · 获赞 198 · 访问量 69万+

猜你喜欢

转载自blog.csdn.net/Tyro_java/article/details/104215639
今日推荐