我现在的理解就是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