【Docker技术】docker-compose.yml与Dockerfile解析

Dockerfiledocker-compose.yml 是 Docker 生态中相互协作的两个核心文件,它们共同定义并启动了您的整个应用环境。

如以下Dockerfile

bash 复制代码
# 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

bash 复制代码
version: '3.8'

services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - ./data:/app/data
    environment:
      - DATABASE_URL=sqlite:///./data/reservoir_emissions.db
    restart: unless-stopped
    container_name: reservoir-emissions-tool

1. 执行命令

bash 复制代码
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 服务下的:

bash 复制代码
build: .

这条指令告诉 Docker Compose:"要运行这个服务,你必须先在当前目录(.)下找到 Dockerfile,并用它来构建一个镜像。"

2. Dockerfile 执行制造任务

Docker 接收到构建任务后,开始执行 Dockerfile 中的所有步骤:

  1. 拉取基础系统: FROM python:3.11-slim

  2. 安装依赖: RUN ... gccRUN pip install ...

  3. 复制代码: COPY . .

  4. 声明入口: 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 命令启动后,会读取这个变量来连接数据库。 | | | |

相关推荐
phltxy4 小时前
C语言操作符详解
java·c语言·算法
毕竟是shy哥4 小时前
vs code连接远程服务器docker环境及配置免密登录
服务器·docker·vs code
步行cgn5 小时前
@Configuration 详解:Spring 配置类的核心注解
java·后端·spring
sunshine22 girl5 小时前
Java学习一 环境配置2 安装和基本使用Idea
java·学习·intellij-idea
java_logo5 小时前
Docker 部署 Rocky Linux:轻松搭建 RHEL 兼容企业级基础镜像平台
linux·docker·容器·rocky linux·基础镜像·轩辕镜像·rhel 兼容
嘿嘿-667 小时前
Windows 一键使用 GPT-6 Astra:Codex CLI 配置教程
java·人工智能·windows·gpt·chatgpt·web
cloudfantasy7 小时前
docker直接二进制安装,非编译。KylinV10SP3 aarch64有效
运维·docker
策案案案8 小时前
YOLO: 将AI Agents嵌入到IntelliJ IDEA
java·大数据·人工智能·笔记·yolo·microsoft·intellij-idea
辰烨chenye9 小时前
LeetCode Hot 100 题解 · 堆篇
java·算法·leetcode
M--Y10 小时前
Docker数据持久化与网络架构
网络·docker·架构