首頁 > 軟體

Docker Compose 搭建簡單的Python網路應用程式(步驟詳解)

2022-07-26 14:00:35

在這個頁面上,你可以建立一個簡單的Python網路應用程式,執行在Docker Compose上。該應用使用Flask框架,並在Redis中維護一個點選計數器。雖然樣本使用了Python,但即使你不熟悉它,這裡展示的概念也應該是可以理解的。(官網教學翻譯)

前提條件

請確保你已經安裝了Docker Engine和Docker Compose。你不需要安裝Python或Redis,因為兩者都是由Docker映象提供的。

第1步:設定

定義應用程式的依賴。

  • 為該專案建立一個目錄。
$ mkdir composetest
$ cd composetest
  • 在你的專案目錄下建立一個名為 app.py 的檔案,並把以下內容貼上進去:
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 hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.n'.format(count)

在這個例子中,redis 是應用程式網路中的redis容器的主機名。我們使用Redis的預設埠,6379。

處理瞬時錯誤 注意 get_hit_count 函數的編寫方式。這個基本的重試迴圈讓我們在redis服務不可用時多次嘗試我們的請求。這在應用程式上線的時候很有用,而且如果Redis服務需要在應用程式的生命週期內隨時重啟,這也使我們的應用程式更具彈性。在一個叢集中,這也有助於處理節點之間的瞬間連線中斷。

  • 在你的專案目錄下建立另一個名為 requirements.txt 的檔案,並將以下內容貼上進去:
flask
redis

第2步:建立一個Dockerfile

在這一步,你要寫一個Dockerfile來構建一個Docker映象。這個映象包含了Python應用程式所需的所有依賴項,包括Python本身。

在你的專案目錄中,建立一個名為 Dockerfile 的檔案並貼上以下內容:

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

這告訴Docker:

  • 從Python 3.7映象開始構建一個映象。

  • 設定工作目錄為 /code

  • 設定 flask 命令使用的環境變數。

  • 安裝gcc和其他依賴項

  • 複製 requirements.txt 並安裝Python依賴項。

  • 給映象新增後設資料,描述容器在5000埠上監聽

  • 將專案中的當前目錄.複製到映象中的工作目錄.。

  • 將容器的預設命令設定為 flask run

第3步:在Compose檔案中定義服務

在你的專案目錄下建立一個名為 docker-compose.yml 的檔案,並貼上以下內容:

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

這個 Compose 檔案定義了兩個服務:webredis

Web服務

web 服務使用一個從當前目錄下的 Dockerfile 檔案構建的映象。然後它將容器和主機繫結到暴露的埠8000上。本例服務使用Flask網路伺服器的預設埠,即5000。

Redis服務

redis 服務使用了一個從Docker Hub倉庫中拉取的公共Redis映象。

第4步:用Compose構建和執行你的應用

  • 在你的專案目錄中,通過執行 docker-compose up 來啟動你的應用程式。
$ docker-compose up

Creating network "composetest_default" with the default driver
Creating composetest_web_1 ...
Creating composetest_redis_1 ...
Creating composetest_web_1
Creating composetest_redis_1 ... done
Attaching to composetest_web_1, composetest_redis_1
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
redis_1  | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 17 Aug 22:11:10.480 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
web_1    |  * Restarting with stat
redis_1  | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379.
redis_1  | 1:M 17 Aug 22:11:10.483 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
web_1    |  * Debugger is active!
redis_1  | 1:M 17 Aug 22:11:10.483 # Server initialized
redis_1  | 1:M 17 Aug 22:11:10.483 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
web_1    |  * Debugger PIN: 330-787-903
redis_1  | 1:M 17 Aug 22:11:10.483 * Ready to accept connections

Compose會拉取一個Redis映象,為你的程式碼構建一個映象,並啟動你定義的服務。在這種情況下,程式碼在構建時被靜態地複製到映象中。

如果你在本地Linux上使用Docker、Docker Desktop for Mac或Docker Desktop for Windows,那麼網路應用現在應該在你的Docker守護主機上監聽8000埠。將你的網路瀏覽器指向http://localhost:8000,找到`Hello World` 訊息。如果這還沒有解決,你也可以試試http://127.0.0.1:8000。

你應該在你的瀏覽器中看到一條訊息說:

Hello World! I have been seen 1 times.

3. 重新整理頁面。

這個數位應該是遞增的。

Hello World! I have been seen 2 times.

  • 切換到另一個終端視窗,並輸入 docker image ls 來列出本地影象。

在這一點上,列出影象應該返回 redisweb

$ docker image ls
REPOSITORY        TAG           IMAGE ID      CREATED        SIZE
composetest_web   latest        e2c21aa48cc1  4 minutes ago  93.8MB
python            3.4-alpine    84e6077c7ab6  7 days ago     82.5MB
redis             alpine        9d8fa9aa0e5b  3 weeks ago    27.5MB

你可以用 docker inspect <tag or id> 檢查映象。

  • 停止應用程式,可以在第二個終端中的專案目錄中執行 docker-compose down,或者在啟動應用程式的原始終端中點選CTRL+C。

第5步:編輯Compose檔案以新增繫結掛載

在你的專案目錄中編輯 docker-compose.yml,為 web 服務新增一個繫結掛載。

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  redis:
    image: "redis:alpine"

新的 volumes 鍵將主機上的專案目錄(當前目錄)掛載到容器內的 /code,允許你即時修改程式碼,而不需要重建映象。environment 鍵設定 FLASK_ENV 環境變數,它告訴 flask run 在開發模式下執行,並在程式碼變化時重新載入。這種模式只應在開發中使用。

第6步:用Compose重新構建並執行應用程式

在你的專案目錄下,輸入 docker-compose up,用更新的Compose檔案構建應用程式,並執行它。

$ docker-compose up
Creating network "composetest_default" with the default driver
Creating composetest_web_1 ...
Creating composetest_redis_1 ...
Creating composetest_web_1
Creating composetest_redis_1 ... done
Attaching to composetest_web_1, composetest_redis_1
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
...

再次在網路瀏覽器中檢查 Hello World 訊息,並重新整理以看到計數的增加。

共用資料夾、卷和繫結掛載

  • 如果你的專案在 Users 目錄之外(cd ~),那麼你需要共用你正在使用的Dockerfile檔案和volume的驅動器或位置。如果你得到執行時的錯誤,表明找不到應用檔案,卷掛載被拒絕,或服務無法啟動,請嘗試啟用檔案或驅動器共用。卷掛載需要在 C:Users(Windows)或 /Users(Mac)之外的專案共用驅動器,而且對於Docker Desktop for Windows上任何使用Linux容器的專案都是必需的。

  • 如果你在舊的Windows作業系統上使用Oracle VirtualBox,你可能會遇到這個VB故障單中描述的共用資料夾的問題。較新的Windows系統符合Docker Desktop for Windows的要求並且不需要VirtualBox。

第7步:更新應用程式

因為應用程式程式碼現在是用volume裝入容器的,所以你可以對其程式碼進行修改,並立即看到變化,而不需要重建映象。

改變 app.py 中的問候語,並儲存它。例如,將 Hello World!的資訊改為 Hello from Docker!

return 'Hello from Docker! I have been seen {} times.n'.format(count)

在你的瀏覽器中重新整理該應用程式。問候語應該被更新,而計數器應該仍然在遞增。

第8步:試驗一些其他命令

如果你想在後臺執行你的服務,你可以向 docker-compose up 傳遞 -d 標誌(用於 "分離 "模式),並使用docker-compose ps 來檢視當前正在執行的內容:

$ docker-compose up -d
Starting composetest_redis_1...
Starting composetest_web_1...
$ docker-compose ps
       Name                      Command               State           Ports         
-------------------------------------------------------------------------------------
composetest_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp              
composetest_web_1     flask run                        Up      0.0.0.0:8000->5000/tcp

docker-compose 的執行命令允許你為你的服務執行一次性的命令。例如,看看 web 服務有哪些環境變數可用:

$ docker-compose run web env

參見 docker-compose --help 以檢視其他可用的命令。

如果你用 docker-compose up -d 啟動了Compose,一旦你完成了你的服務,就停止它們:

$ docker-compose stop

你可以用 down 命令來關閉一切,完全刪除容器。通過 --volumes,也可以刪除Redis容器所使用的資料卷:

$ docker-compose down --volumes

在這一點上,你已經明白了 Compose 是如何工作的。

到此這篇關於Docker Compose 搭建簡單的Python網路應用程式的詳細步驟的文章就介紹到這了,更多相關Docker Compose 搭建Python網路應用程式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com