Overview

使用 Python Fask + Redis 來統計網頁點閱人數的專案。

會在專案下建立以下檔案:

  1. app.py : Python 程式
  2. requirements.txt : Python 依賴套件清單
  3. Dockerfile : Docker 環境描述檔案
  4. docker-compose.yml : 專案執行流程檔案

Usage

建立環境:

  1. 創建專案資料夾。

    $ mkdir wkdir
    $ cd wkdir
    
  2. 在資料夾下建立 app.py 當做 web app 進入點,裡面有 Flask 和 Redis 操作,當使用者瀏覽首頁時,Redis 會記錄次數,若有 Exception 則有 Retry 機制。

    import time
    import redis
    from flask import Flask
    
    app = Flask(__name__)
    cache = redis.Redis(host='redis', port=6379)
    
    def get_hit_count():
        retries = 5
        while True:
            try:
                return cache.incr('hits')
            except redis.exceptions.ConnectionError as exc:
                if retries == 0:
                    raise exc
                retries -= 1
                time.sleep(0.5)
    
    @app.route('/')
    def get_index():
        count = get_hit_count()
        return 'Yo! 你是第 {} 次瀏覽\\n'.format(count)
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", debug=True)
    
  3. 建立套件依賴包 requirements.txt,讓 Dockerfile 可以下指令安裝 Python 套件。

    flask
    redis
    
  4. 建立 Web App 的 Dockerfile,用來產生 Image。

    # 從 python3.4 基礎上加工
    FROM python:3.4-alpine
    # 將本地端程式碼複製到 container 裡面 ./code 資料夾
    ADD . /code
    # container 裡面的工作目錄
    WORKDIR /code
    RUN pip install -r requirements.txt
    CMD ["python", "app.py"]
    
  5. 用 Docker Compose file 描述 services 運作狀況,我們的專案共有 web 和 redis 兩個 service,建立以下 docker-compose.yml

    version: '3'
    services:
        web:
            build: .
            ports:
                - "5000:5000"
            volumes:
                # 把當前資料夾 mount 掛載進去 container,這樣可以直接在本地端專案資料夾改動檔案,container 裡面的檔案也會更動也不用重新 build image
                - .:/code
        redis:
            # 從 Docker Hub registry 來的 image
            image: "redis:alpine"
    
  6. 用 Docker Compose 執行你的 Web app

    $ docker-compose up -d
    
  7. http://127.0.0.1:5000/ 查看結果

  8. 終止並移除 Container

    $ docker-compose down
    

Reference

Docker Compose 建置 Web service 起步走入門教學