帮助中心 >
  关于独立服务器 >
  Docker Compose用于Python Web 应用程序的开发
Docker Compose用于Python Web 应用程序的开发
时间 : 2024-10-21 14:50:32
编辑 : Jtti

本文为大家分享如何使用  Docker Compose完成Python Web 应用程序的开发。应用程序使用的是Flask框架,在Redis中有一个点击计数器,提供了 Docker Compose如何应用于web开发场景的实际例子。突出 Docker Compose可执行相关关键操作。

需要先安装好最新版本的 Docker Compose,对 Docker 概念及 Docker的工作原理有基本了解。先为项目创建目录:

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默认端口6379。

在项目目录中创建另一个名为requirements.txt文件添加以下命令:

flask

Redis

创建一个Dockerfile并粘贴以下代码:

# syntax=docker/dockerfile:1

FROM python:3.10-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", "--debug"]

要注意Dockerfile文件扩展名是否为.txt。一些编辑器可能会自动附加此文件扩展名,导致运行应用程序时出现错误。

Compose 文件中定义服务。Compose 简化了整个应用程序堆栈的控制,轻松地在单个易于理解的YAML配置文件中管理服务、网络和卷。在项目目录中创建一个名为compose.yaml文件,添加以下内容:

services:

  web:

    build: .

    ports:

      - "8000:5000"

  redis:

    image: "redis:alpine"

Compose文件定义了两个服务:web和redis。该web服务器使用从当前目录中构建的镜像Dockerfile。然后把容器和主机绑定在开放端口800。其中使用FIask Web服务器的默认端口5000。其中redis的服务使用的是Docker Hub注册表中提取的公共镜像。

使用单个命令,可以配置文件并启动全部服务。用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/即可看到应用程序正在运行。

如果这不能解决,您还可以尝试http://127.0.0.1:8000。

你应该会在浏览器中看到一条消息:

Hello World! I have been seen 1 times.

刷新页面,这个数字还会增加:

Hello World! I have been seen 2 times.

切换到另一个终端窗口,输入docker image ls列出本地图像,应该返回redis并web

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启动该应用程序的原始终端来停止。

编辑compose.yaml项目目录中要使用的文件watch,以便您可以预览正在运行的 Compose 服务,这些服务会在您编辑和保存代码时自动更新:

services:

  web:

    build: .

    ports:

      - "8000:5000"

    develop:

      watch:

        - action: sync

          path: .

          target: /code

  redis:

image: "redis:alpine"

在项目目录中,键入docker compose watch或docker compose up --watch以构建并启动应用程序和文件监视模式。

docker compose watch

[+] Running 2/2

 âœ” Container docs-redis-1 Created                                                                                                                                                                                                        0.0s

 âœ” Container docs-web-1    Recreated                                                                                                                                                                                                      0.1s

Attaching to redis-1, web-1

         â¦¿ watch enabled

...再次在网络浏览器中检查Hello World消息,然后刷新以查看计数增量。

更改问候语app.py并保存。例如,将Hello World! 消息更改为Hello from Docker!:

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

在浏览器中刷新,问候会更新,计数器也会递增。完成后运行:

docker compose down

JTTI-Defl
JTTI-COCO
JTTI-Selina
JTTI-Ellis
JTTI-Eom