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, 然後再進行其他操作
發佈了410 篇原創文章 · 獲贊 221 · 訪問量 69萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章