首页  >  文章  >  后端开发  >  从传统到云无服务器 - 第 1 部分

从传统到云无服务器 - 第 1 部分

WBOY
WBOY原创
2024-09-04 20:30:02827浏览

注意:本文最初于 2023 年 11 月 4 日发表于此处。它已在这里重新发布,以覆盖更广泛的受众。

欢迎阅读系列中的第一篇文章,该文章将引导您完成将遗留应用程序从本地迁移到云的过程,重点关注现代化、无服务器平台和集成 DevOps 实践。

在本文中,我们将重点关注您的应用程序的容器化。但是,如果您从头开始构建应用程序,那就完全没问题(事实上,甚至更好)。在此示例中,我使用此 DigitalOcean 指南来构建一个简单的 TODO 应用程序,并使用 Python (Flask) 和 MongoDB 作为数据库。我进行了一些自定义以使其看起来更好,但要点是构建使用基于 NoSQL 文档的数据库的东西,因为这将是即将进行的工作所需要的。

如果您还没有构建自己的应用程序存储库,可以在 GitHub 上克隆该应用程序的存储库。

构建完应用程序后,让我们开始吧!

Dockerfile

这是我们将容器化的应用程序目录的结构,后面是 Dockerfile。

.
├── app.py
├── LICENSE
├── README.md
├── requirements.txt
├── static
│   └── style.css
└── templates
    └── index.html

app.py 文件是包含 Flask 应用代码的主应用程序文件。 requirements.txt 文件包含应用程序所需的 Python 依赖项列表。 static/ 目录包含静态文件,例如 CSS、JavaScript 和图像。 templates/ 目录包含 Flask 应用程序使用的 HTML 模板。

# Use a minimal base image
FROM python:3.9.7-slim-buster AS base

# Create a non-root user
RUN useradd -m -s /bin/bash flaskuser
USER flaskuser

# Set the working directory
WORKDIR /app

# Copy the requirements file and install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Add the directory containing the flask command to the PATH
ENV PATH="/home/flaskuser/.local/bin:${PATH}"

# Use a multi-stage build to minimize the size of the image
FROM base AS final

# Copy the app code
COPY app.py .
COPY templates templates/
COPY static static/

# Set environment variables
ENV FLASK_APP=app.py
ENV FLASK_ENV=production

# Expose the port
EXPOSE 5000

# Run the app
CMD ["flask", "run", "--host=0.0.0.0"]

这是 Dockerfile 的演练和细分:

  1. Dockerfile 以 FROM 指令开头,该指令指定要使用的基础映像。在本例中,它是 python:3.9.7-slim-buster,这是一个最小的基础映像,其中包括 Python 3.9.7 和一些基本库。

  2. 下一条指令使用 RUN 和 useradd 命令创建一个名为 Flaskuser 的非 root 用户。这是避免以 root 用户身份运行容器的安全最佳实践。

  3. WORKDIR 指令将工作目录设置为 /app,这是应用程序代码将被复制的位置。

  4. COPY 指令将requirements.txt 文件复制到容器的/app 目录。

  5. RUN指令使用pip安装requirements.txt中列出的依赖项。 --no-cache-dir 选项用于避免缓存下载的包,这有助于保持较小的图像大小。

  6. ENV指令将包含flask命令的目录添加到PATH环境变量中。这是稍后运行 Flask 命令所必需的。

  7. FROM 指令使用之前定义的基础镜像启动一个新的构建阶段。这是一个多阶段构建,有助于最小化最终图像的大小。

  8. COPY 指令将应用程序代码 (app.py)、模板 (templates/) 和静态文件 (static/) 复制到容器的 /app 目录。

  9. ENV 指令设置 FLASK_APP 和 FLASK_ENV 环境变量。 FLASK_APP 指定主应用程序文件的名称,FLASK_ENV 将环境设置为生产环境。

  10. EXPOSE 指令公开端口 5000,这是 Flask 使用的默认端口。

  11. CMD指令指定容器启动时运行的命令。在这种情况下,它使用 --host=0.0.0.0 选项运行 Flask run 命令来绑定到所有网络接口。

有了这个 Dockerfile,应用程序就可以被容器化并执行。但是,需要注意的是,我们的应用程序需要一个数据库来存储运行时创建或生成的数据。当然,您可以单独拉取 MongoDB 数据库镜像并独立运行。然后,在两侧进行调整,建立两个容器之间的通信,以便应用程序能够成功地将数据存储到数据库中。虽然这种方法有效,但可能会消耗时间并且有点乏味。为了简化流程,我们将继续使用 Docker Compose。在 Docker Compose 中,所有内容都在 YAML 文件中声明,通过使用 docker-compose up 命令,我们可以无缝地启动和操作不同的服务,节省时间和精力。

使用 Docker Compose 简化数据库集成

这是基本的 Docker Compose YAML 文件,我们将使用它来简化流程。

version: '3.9'

services:
  db:
    image: mongo:4.4.14
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db

  web:
    build: .
    container_name: "myflaskapp"
    ports:
      - "5000:5000"
    environment:
      - MONGO_URI=mongodb://db:27017
    depends_on:
      - db

volumes:
  mongo-data:

此 Docker Compose YAML 文件配置为设置两个服务:MongoDB 数据库 (db) 和 Web 应用程序 (web)。详细介绍如下:

  • 版本: 指定正在使用的 Docker Compose 文件格式的版本(本例中为 3.9)。

  • 服务:

    • 数据库(db):

      • 使用 MongoDB 版本 4.4.14 镜像。
      • 将主机端口 27017 映射到容器端口 27017。
      • 利用名为 mongo-data 的卷来持久存储 MongoDB 数据。
    • Web 应用程序 (web):

      • 从当前目录 (.) 构建 Docker 镜像。
      • 将容器名称设置为“myflaskapp”。
      • 将主机端口 5000 映射到容器端口 5000。
      • 定义环境变量 MONGO_URI,值为 mongodb://db:27017,建立与 MongoDB 服务的连接。
      • 指定对 db 服务的依赖,确保数据库在 Web 服务之前启动。
  • 音量:

    • 定义一个名为 mongo-data 的卷来保存 MongoDB 数据。

总之,这个 Docker Compose 文件协调了 MongoDB 数据库和 Flask Web 应用程序的部署,确保它们能够无缝通信和一起运行。

现在导航到包含 Docker Compose 文件的目录并运行 docker-compose up 以启动 MongoDB 和 Flask Web 应用程序。通过 http://localhost:5000 访问应用程序,确保一切按预期工作。

From legacy to cloud serverless - Part 1

要停止,请使用 docker-compose down。

一切都好吗?接下来:下一篇文章将工作流程迁移到 Kubernetes。

From legacy to cloud serverless - Part 1

以上是从传统到云无服务器 - 第 1 部分的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn