后端flask+ docker + docker-compose 发布

99 阅读5分钟

我现在的理解就是dockerfile就是镜像文件,然后用docker-compose.yml去用这个镜像文件生成一个容器,然后容器文件就是映射到我上传文件的地方,当我修改上传文件的地方,容器里面的文件也会改变。

1.生成依赖文件

pip install -r requirement.txt

2.根目录写dockerfile文件,构建Docker镜像的文本文件

#-   **作用**:指定基础镜像为 **Python 3.10** 版本,使用 **slim** 版本。`slim` 版本较小,
#去除了不必要的包和工具,适合生产环境使用。
#-   **解释**:Docker镜像的构建从 `python:3.10-slim` 开始,意味着你的容器会基于 Python #3.10 的轻量版本构建。
FROM python:3.10-slim

#指定容器内的工作目录
#-   **作用**:指定容器内的工作目录。之后的所有命令(如 `COPY`、`RUN`)都将在此目录下执行。
#-   **解释**:`WORKDIR` 设置了工作目录为 `/foodmenu`。如果该目录不存在,Docker 会自动创建#它。如果之后的命令指定路径,则相对于这个工作目录。
WORKDIR /foodmenu   

#-   **作用**:将本地的 `requirements.txt` 文件复制到容器内的当前工作目录(即 #`/foodmenu`)中。
#-   **解释**:这个命令会把宿主机(本地)路径下的 `requirements.txt` 文件复制到容器内的工作#目录中,以便容器内能够通过它安装必要的 Python 包。
COPY requirements.txt .

#-   **作用**:运行 `pip install` 命令,安装容器内的依赖包。
#-   **解释**:在容器中运行 `pip install` 命令来安装 `requirements.txt` 文件中列出的所有
#依赖包。这是准备 Flask 应用的环境步骤。
RUN pip install -r requirements.txt

#-   **作用**:将当前上下文(即宿主机中的所有文件)复制到容器的当前工作目录。
#-   **解释**:将项目目录下的所有文件和文件夹(除了 `.dockerignore` 中列出的文件)复制到容
#器的 `/foodmenu` 目录中。
COPY . .

#-   **作用**:设置一个环境变量 `FLASK_APP`,告诉 Flask 应用要启动的主程序文件。
#-   **解释**:`FLASK_APP` 环境变量指定了 Flask 项目的入口文件,这里设置为 `app.py`,即启
#动 Flask 应用时会加载 `app.py`。
ENV FLASK_APP=app.py
ENV FLASK_ENV=development
ENV PYTHONPATH=/foodmenu

#-   **作用**:指定容器启动时执行的默认命令。
#-   **解释**:`CMD` 是容器启动时默认执行的命令,这里它指定 Flask 运行时使用 `flask run` 
#启动应用,并通过 `--host=0.0.0.0` 让应用在所有网络接口上都可访问,通常用于 Docker 容器中以#便外部可以访问应用。
CMD ["flask", "run", "--host=0.0.0.0"]

3.新建docker-compose.yml

version: '3.8'
services:
  flask_app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: flask_app
    ports:
      - "5000:5000"
    environment:
      FLASK_ENV: development
    volumes:
      - .:/foodmenu
    restart: always
    
### `version: '3.8'`

-   **作用**:指定 Docker Compose 文件的版本。`3.8` 版本适用于较新的 Docker 和 Docker Compose 版本,提供了许多新特性和改进。

* * *

### `services:`

-   **作用**:定义了容器化应用的服务部分。在一个 `docker-compose.yml` 文件中,`services` 部分定义了多个服务,每个服务对应一个 Docker 容器。

* * *

### `flask_app:`

-   **作用**:定义了一个名为 `flask_app` 的服务。该服务将运行一个 Flask 应用容器。
-   **解释**:这个服务的名字可以自定义,后续的配置都会在这个服务下定义。

* * *

### `build:`

-   **作用**:定义如何构建 Docker 镜像。`context``dockerfile` 是构建镜像的关键配置。

#### `context: .`

-   **作用**:设置 Docker 构建上下文为当前目录 (`.`)。
-   **解释**`context` 是指构建 Docker 镜像时要使用的目录。这里使用 `.` 表示当前目录。Docker 会使用这个目录下的所有文件来构建镜像。

#### `dockerfile: Dockerfile`

-   **作用**:指定用于构建镜像的 Dockerfile 文件名。
-   **解释**`dockerfile` 设置了 Docker 使用的构建文件,通常为 `Dockerfile`,但可以根据需要自定义。

* * *

### `container_name: flask_app`

-   **作用**:为容器指定一个自定义的名称。
-   **解释**:这里将容器的名称设置为 `flask_app`,便于识别和管理。

* * *

### `ports:`

-   **作用**:配置端口映射。通过此设置,容器内的端口将暴露到宿主机上的端口。

#### `- "5000:5000"`

-   **作用**:将容器内的 5000 端口映射到宿主机的 5000 端口。
-   **解释**:Flask 默认运行在 5000 端口,这一配置使得宿主机上的 5000 端口能够访问容器内的 Flask 应用。

* * *

### `environment:`

-   **作用**:定义环境变量。可以在容器中设置环境变量,以便 Flask 应用在运行时使用。

#### `FLASK_ENV: development`

-   **作用**:将 `FLASK_ENV` 设置为 `development`,表示 Flask 应用以开发模式运行。
-   **解释**:在开发模式下,Flask 会启用调试模式、自动重载等功能。生产环境中应将其设置为 `production`* * *

### `volumes:`

-   **作用**:定义挂载卷,将宿主机的文件或目录挂载到容器中,以实现文件同步或共享。

#### `- .:/foodmenu`

-   **作用**:将宿主机当前目录(`.`)挂载到容器内的 `/foodmenu` 目录。
-   **解释**:容器中的 `/foodmenu` 目录将映射到宿主机当前目录的文件,这样宿主机上的文件更新会实时反映到容器内。这通常用于开发环境下,使得代码变动能够实时生效。

* * *

### `restart: always`

-   **作用**:配置容器的重启策略。
-   **解释**`always` 表示如果容器停止运行,无论停止原因如何(如崩溃、手动停止等),Docker 都会尝试重新启动容器。这对于生产环境中的服务非常有用,以确保服务持续可用。

* * *

### 总结

这个 Docker Compose 配置文件定义了一个名为 `flask_app` 的 Flask 应用服务。它通过 Dockerfile 构建镜像,将容器的 5000 端口暴露到宿主机的 5000 端口,使用宿主机当前目录挂载到容器的 `/foodmenu` 目录,并通过环境变量设置开发模式。重启策略为 `always`,确保服务持续运行。

5. 构建和启动容器

在项目的根目录下,运行以下命令构建并启动容器:

docker-compose up --build

6.访问

http://localhost:5000

7. 停止和移除容器

要停止并移除容器,可以使用以下命令:

docker-compose down