dockerfile和docker-compose

dockerfile

一个简单的dockerfile怎么写,必须包含什么,简单来讲就五步

# 1. 基础镜像
FROM python:3.10-slim

# 2. 工作目录
WORKDIR /app

# 3. 复制代码
COPY . /app

# 4. 安装依赖(可选,但是项目一般都需要)
RUN pip install --no-cache-dir -r requirements.txt

# 5. 容器启动时执行的命令
CMD ["python", "main.py"]

一般都是这五步骤.

一是导入基础镜像,没什么说的.

二和三是创建代码存放文件目录,然后将当前位置下的所有文件copy进自己创建的文件目录当中去.

四是安装依赖,也没什么说的

五是项目的启动指令了

dockerfile默认位置为项目根目录

项目根目录/
│── Dockerfile
│── requirements.txt
│── main.py
│── src/
│── config/

RUN pip install –no-cache-dir -r requirements.txt

•	--no-cache-dir:让 pip 安装时不保留下载缓存
• 主要用在 Dockerfile 中
• 作用:减小镜像体积,不积累垃圾

Dockerfile 里写多个含参数的 CMD 的推荐用JSON 数组形式

开发环境

uvicorn main:app --reload --host 0.0.0.0 --port 8000

docker的cmd

CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "8000"]

运行

先构建镜像

docker build -t my_fastapi_app .

-t是取名字

然后是运行容器

docker run -d -p 8000:8000 --name fastapi_app my_fastapi_app
  • -d → 后台运行
  • -p 8000:8000 → 映射端口,宿主机 8000 对应容器 8000
  • –name fastapi_app → 容器名字
  • my_fastapi_app → 使用刚才构建的镜像

docker-compose

它就是让你不用一个个 docker run,直接用一个 docker-compose.yml 文件就能管理整个多容器应用。

文件位置

my_project/
├─ app/
│ └─ main.py
├─ requirements.txt
├─ Dockerfile
└─ docker-compose.yml

docker-compose基于dockerfile的,必须要有dockerfile才能使用dockerfile

一个最简单的完整的docker-compose

version: "3.9"

services:
web:
build: .
container_name: fastapi_app
ports:
- "8000:8000"
volumes:
- ./app:/app
  1. version:告诉 Compose 文件语法版本,3.9 支持大部分功能。
  2. services:容器服务集合,定义你的应用里有多少个服务。
  3. web:服务名称,也就是容器实例的逻辑标识。
  • 可以自己写,随你命名
  • 开发环境 → 短小好记,如 web、api、db
  • 生产环境 → 语义化清楚,如 fastapi_backend、postgres_db
  • 注意 → 避免空格、特殊字符,否则网络解析可能出问题
  1. build:告诉 Compose 用 Dockerfile 构建镜像。build: .就是同级的dockerfile,和上面文件位置的形式一样.

  2. container_name:指定容器名字,方便管理。

    自己取

  3. ports:端口映射,让宿主机访问容器里的服务。

  4. volumes:文件同步,实现代码修改容器即时生效。

my_fastapi_project/          # 项目根目录
├─ app/ # 代码目录(挂载到容器 /app)
│ ├─ main.py # FastAPI 主入口
│ ├─ __init__.py
│ └─ ... # 其他模块代码
├─ res/ # 保存文件目录(挂载到容器 /app/res)
│ └─ ... # 项目生成的文件会存这里
├─ requirements.txt # Python 依赖文件
├─ Dockerfile # 容器镜像构建文件
└─ docker-compose.yml # Docker Compose 配置文件

代码都放在了docker的/app文件里面了嘛,假如项目有保存文件的功能,比如说在项目的根目录下的res保存文件,运用volumes就是可以将此文件和我电脑的一个文件关联起来,就可以永久保存文件了

volumes:
- ./res:/app/res

前面是本地电脑的,后面是docker里面的位置

如果我的项目当中有需要配置的呢,docker-compose当中怎么直接配置好啊

1、环境变量直接写

services:
web:
build: .
container_name: fastapi_app
ports:
- "8000:8000"
volumes:
- ./app:/app
- ./res:/app/res
environment:
- REDIS_HOST=redis
- REDIS_PORT=6379
- ENV=development

py文件

import os

redis_host = os.getenv("REDIS_HOST", "localhost")
redis_port = int(os.getenv("REDIS_PORT", 6379))

2、用配置文件挂载

services:
web:
build: .
volumes:
- ./app:/app
- ./res:/app/res
- ./config.yaml:/app/config.yaml # 把本地配置文件挂载到容器

也就是我在本地改配置,docker里面的配置就会变为我本地的

启动,在docker-compose文件同级目录运行 -d是后台运行

docker-compose up -d