注意:本文最初于 2023 年 11 月 4 日发表于此处。它已在这里重新发布,以覆盖更广泛的受众。
欢迎阅读系列中的第一篇文章,该文章将引导您完成将遗留应用程序从本地迁移到云的过程,重点关注现代化、无服务器平台和集成 DevOps 实践。
在本文中,我们将重点关注您的应用程序的容器化。但是,如果您从头开始构建应用程序,那就完全没问题(事实上,甚至更好)。在此示例中,我使用此 DigitalOcean 指南来构建一个简单的 TODO 应用程序,并使用 Python (Flask) 和 MongoDB 作为数据库。我进行了一些自定义以使其看起来更好,但要点是构建使用基于 NoSQL 文档的数据库的东西,因为这将是即将进行的工作所需要的。
如果您还没有构建自己的应用程序存储库,可以在 GitHub 上克隆该应用程序的存储库。
构建完应用程序后,让我们开始吧!
这是我们将容器化的应用程序目录的结构,后面是 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 的演练和细分:
Dockerfile 以 FROM 指令开头,该指令指定要使用的基础映像。在本例中,它是 python:3.9.7-slim-buster,这是一个最小的基础映像,其中包括 Python 3.9.7 和一些基本库。
下一条指令使用 RUN 和 useradd 命令创建一个名为 Flaskuser 的非 root 用户。这是避免以 root 用户身份运行容器的安全最佳实践。
WORKDIR 指令将工作目录设置为 /app,这是应用程序代码将被复制的位置。
COPY 指令将requirements.txt 文件复制到容器的/app 目录。
RUN指令使用pip安装requirements.txt中列出的依赖项。 --no-cache-dir 选项用于避免缓存下载的包,这有助于保持较小的图像大小。
ENV指令将包含flask命令的目录添加到PATH环境变量中。这是稍后运行 Flask 命令所必需的。
FROM 指令使用之前定义的基础镜像启动一个新的构建阶段。这是一个多阶段构建,有助于最小化最终图像的大小。
COPY 指令将应用程序代码 (app.py)、模板 (templates/) 和静态文件 (static/) 复制到容器的 /app 目录。
ENV 指令设置 FLASK_APP 和 FLASK_ENV 环境变量。 FLASK_APP 指定主应用程序文件的名称,FLASK_ENV 将环境设置为生产环境。
EXPOSE 指令公开端口 5000,这是 Flask 使用的默认端口。
CMD指令指定容器启动时运行的命令。在这种情况下,它使用 --host=0.0.0.0 选项运行 Flask run 命令来绑定到所有网络接口。
有了这个 Dockerfile,应用程序就可以被容器化并执行。但是,需要注意的是,我们的应用程序需要一个数据库来存储运行时创建或生成的数据。当然,您可以单独拉取 MongoDB 数据库镜像并独立运行。然后,在两侧进行调整,建立两个容器之间的通信,以便应用程序能够成功地将数据存储到数据库中。虽然这种方法有效,但可能会消耗时间并且有点乏味。为了简化流程,我们将继续使用 Docker Compose。在 Docker Compose 中,所有内容都在 YAML 文件中声明,通过使用 docker-compose up 命令,我们可以无缝地启动和操作不同的服务,节省时间和精力。
这是基本的 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):
Web 应用程序 (web):
音量:
总之,这个 Docker Compose 文件协调了 MongoDB 数据库和 Flask Web 应用程序的部署,确保它们能够无缝通信和一起运行。
现在导航到包含 Docker Compose 文件的目录并运行 docker-compose up 以启动 MongoDB 和 Flask Web 应用程序。通过 http://localhost:5000 访问应用程序,确保一切按预期工作。
要停止,请使用 docker-compose down。
一切都好吗?接下来:下一篇文章将工作流程迁移到 Kubernetes。
以上是从传统到云无服务器 - 第 1 部分的详细内容。更多信息请关注PHP中文网其他相关文章!