中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Docker?Compose搭建簡單的Python網絡應用程序

發布時間:2022-07-27 10:03:06 來源:億速云 閱讀:134 作者:iii 欄目:開發技術

這篇文章主要介紹“怎么使用Docker Compose搭建簡單的Python網絡應用程序”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么使用Docker Compose搭建簡單的Python網絡應用程序”文章能幫助大家解決問題。

    在這個頁面上,你可以建立一個簡單的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鏡像,為你的代碼構建一個鏡像,并啟動你定義的服務。在這種情況下,代碼在構建時被靜態地復制到鏡像中。

    • 在瀏覽器中輸入http://localhost:8000/,可以看到應用程序正在運行。

    如果你在本地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.

    怎么使用Docker?Compose搭建簡單的Python網絡應用程序

    3. 刷新頁面。

    這個數字應該是遞增的。

    Hello World! I have been seen 2 times.

    怎么使用Docker?Compose搭建簡單的Python網絡應用程序

    • 切換到另一個終端窗口,并輸入 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)

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

    怎么使用Docker?Compose搭建簡單的Python網絡應用程序

    第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

    關于“怎么使用Docker Compose搭建簡單的Python網絡應用程序”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    宜州市| 乌拉特后旗| 太谷县| 临潭县| 汽车| 宝鸡市| 中超| 长岭县| 江源县| 梅河口市| 长顺县| 乌兰浩特市| 新化县| 嘉定区| 沅陵县| 北川| 迁西县| 兴安盟| 高密市| 法库县| 长葛市| 麻城市| 益阳市| 苗栗市| 都兰县| 余庆县| 茂名市| 洪泽县| 晋州市| 罗定市| 卢湾区| 昌平区| 西畴县| 云霄县| 陇南市| 凭祥市| 秀山| 永丰县| 康马县| 杭锦后旗| 金湖县|