【Docker技术】docker-compose.yml与Dockerfile解析
Dockerfile
和 docker-compose.yml
是 Docker 生态中相互协作的两个核心文件,它们共同定义并启动了您的整个应用环境。
如以下Dockerfile
# Use lightweight Python image
FROM python:3.11-slim# Set working directory
WORKDIR /app# Install system dependencies (minimal)
RUN apt-get update && apt-get install -y --no-install-recommends \gcc \&& rm -rf /var/lib/apt/lists/*# Copy requirements first for better caching
COPY requirements.txt .# Install Python dependencies
RUN pip install --no-cache-dir -r requirements.txt# Copy application code
COPY . .# Create directory for database
RUN mkdir -p /app/data# Expose port
EXPOSE 8000# Run the application
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
docker-compose.yml
version: '3.8'services:web:build: .ports:- "8000:8000"volumes:- ./data:/app/dataenvironment:- DATABASE_URL=sqlite:///./data/reservoir_emissions.dbrestart: unless-stoppedcontainer_name: reservoir-emissions-tool
1. 执行命令
docker compose up --build -d
--build
(强制重建): Docker 忽略本地已有的镜像缓存,重新执行 Dockerfile
中的所有指令,构建一个新的镜像。
up
(服务启动): 使用新构建的镜像,创建名为 reservoir-emissions-tool
的容器实例,并设置好端口映射和数据卷挂载。
-d
(后台运行): 容器在后台(detached mode)启动并运行,将控制台释放给您,让您可以继续使用命令行。
文件 | 角色 | 关键指令 |
docker-compose.yml | 服务定义与配置 | build: . |
Dockerfile | 镜像构建步骤 | FROM、RUN、COPY 等 |
当您运行 docker compose up --build -d
时,Compose 工具会读取 docker-compose.yml
文件。它看到 web
服务下的:
build: .
这条指令告诉 Docker Compose:“要运行这个服务,你必须先在当前目录(.
)下找到 Dockerfile
,并用它来构建一个镜像。”
2. Dockerfile
执行制造任务
Docker 接收到构建任务后,开始执行 Dockerfile
中的所有步骤:
拉取基础系统:
FROM python:3.11-slim
安装依赖:
RUN ... gcc
和RUN pip install ...
复制代码:
COPY . .
声明入口:
CMD ["uvicorn", ...]
这一系列步骤的结果,就是一个名为 reservoir-emissions-tool_web
(默认名称) 的 Docker 镜像,这个镜像就是您应用的“可执行包”。
默认自动命名规则:
当您在 docker-compose.yml
中使用 build: .
而没有明确指定 image:
字段时,Docker Compose 会自动生成一个名称,格式通常是:
<项目目录名>_<服务名>
项目目录名: 假设您的
docker-compose.yml
位于IPCC-Tier-2
文件夹下。服务名: 在
docker-compose.yml
中,您服务的名字是web
。
所以,当您运行 docker compose up --build -d
时,生成的镜像名称通常会是:ipcc-tier-2_web
3. docker-compose.yml
运行配置环境
镜像构建完成后,Docker Compose 使用这个新镜像来启动容器,同时应用 docker-compose.yml
中定义的运行时环境配置:
配置项 | 作用 | 对应 Dockerfile 的声明 | |||
ports: "8000:8000" | 外部访问:将容器的 8000 端口映射到宿主机。 | 对应 Dockerfile 中的 EXPOSE 8000 声明(让外部知道容器会用到这个端口)。 | |||
volumes: ./data:/app/data | 数据持久化:将本地目录挂载到容器内的 /app/data。 | 对应 Dockerfile 中的 RUN mkdir -p /app/data(确保容器内存在该目录)。 | |||
environment: DATABASE_URL=... | 配置注入:告诉应用数据库在哪。 | 应用的 CMD 命令启动后,会读取这个变量来连接数据库。 |