一、核心区别一句话总结
- Dockerfile:负责构建单个镜像 定义一个容器内部环境、依赖、运行程序,产出
image(镜像)。 - docker-compose.yml:负责编排多容器服务 调用已经构建好的镜像,批量启动、配置、关联多个容器,管理服务集群。
二、详细对比
1. Dockerfile(构建层)
作用:制作镜像模板
- 描述基础系统(如
php:8.4、nginx) - 安装扩展、代码拷贝、设置权限、环境变量、启动命令
- 执行
docker build生成唯一镜像文件 - 一个 Dockerfile只对应一个应用 / 一个容器
简单示例 Dockerfile
dockerfile
FROM php:8.4-fpm
COPY . /app
RUN composer install
CMD ["php-fpm"]
2. docker-compose.yml(编排运行层)
作用:调度、启动多个容器
- 可以同时管理 Nginx、PHP、Redis、MySQL 一堆容器
- 配置端口映射、目录挂载、网络互通、依赖顺序、重启策略
- 可以直接拉取公共镜像,也能指定用本地 Dockerfile 构建镜像
- 一条
docker-compose up一键启动整套项目
简单示例 compose
yaml
services:
php:
build: . # 调用当前目录Dockerfile构建镜像
volumes:
- ./:/app
nginx:
image: nginx:alpine # 直接拉取官方镜像
ports:
- "80:80"
depends_on:
- php
三、为什么需要两个文件,缺一不可
1. 分工完全不一样
- Dockerfile 解决:这个容器里面装什么
- Compose 解决:多个容器怎么一起跑、怎么通信、怎么对外暴露
2. 场景拆分
- 只有单一服务(只跑一个程序) 可以只用 Dockerfile,手动
docker run启动;但用 compose 写配置更方便。 - 多服务项目(Web 项目标配:nginx+php+mysql+redis)
- MySQL、Redis 直接用官方镜像,不需要 Dockerfile
- 自己写的业务代码(PHP/Java/Python)需要 Dockerfile 打包代码环境
- 全部交给 compose 统一调度启动
3. 复用与解耦
- Dockerfile 镜像可以单独打包、上传镜像仓库,服务器、多台机器都能用同一个镜像
- Compose 只是配置脚本,不打包环境,只规定运行参数,换机器只需复制 yml 即可部署整套服务
四、常见组合关系
- 业务服务(自己代码):
build: .→ 读取 Dockerfile 构建镜像再启动 - 中间件(mysql/redis/nginx):
image: xxx→ 直接拉取公共镜像,无 Dockerfile
五、极简流程
- Dockerfile →
docker build→ 业务镜像 - docker-compose.yml 引用镜像 →
docker-compose up→ 拉起整套容器集群
补充误区
- 不是必须成对出现:纯中间件集群可以只有 yml 没有 Dockerfile;单容器手动运行可以只有 Dockerfile 没有 yml。
- 生产环境集群大规模部署会用 Kubernetes 替代 Compose,但本地开发、中小型部署 Compose 依然首选。