docker build 和compose 学习笔记
目录
docker build 笔记
1. 路径解析
2. 关键注意事项
2. docker compose up -d
核心区别对比
常见工作流
补充说明
1. 功能区别
2. 协作关系
场景 1:Compose 自动调用 Build
场景 2:先 Build 后 Compose
3. 关键区别
4. 为什么需要协作?
5. 实际工作流示例
开发阶段
生产部署
总结
docker build
和 docker compose up -d
是 Docker 生态系统中两个不同的命令,用于不同的场景。以下是它们的核心区别:
docker build 笔记
docker build -t my-app:1.0 .
是的,docker build -t my-app:1.0 .
命令会自动读取当前目录下的 Dockerfile
(文件名必须严格为 Dockerfile
,大小写敏感)。以下是详细说明:
1. 路径解析
-
.
表示“当前目录”:
命令最后的.
是构建上下文(Build Context)的路径,Docker 会将该目录下的所有文件(递归)发送给 Docker 守护进程(daemon),并在其中查找Dockerfile
。-
例如:若在
/home/user/project
下执行命令,则默认读取/home/user/project/Dockerfile
。
-
-
自定义
Dockerfile
路径:
如果Dockerfile
不在当前目录,或使用了其他文件名,需通过-f
指定:docker build -t my-app:1.0 -f ./subdir/CustomDockerfile .
-
此时仍以
.
(当前目录)为构建上下文,但使用指定文件作为构建指令。
-
2. 关键注意事项
-
Dockerfile
必须存在:
如果当前目录没有Dockerfile
,会报错:ERROR: Cannot locate specified Dockerfile: Dockerfile
-
构建上下文的影响:
-
Docker 会将上下文目录的所有文件发送给守护进程(可能导致传输量大)。
-
通过
.dockerignore
文件可排除不需要的文件(类似.gitignore
)。
-
-
镜像标签(
-t
):
-t my-app:1.0
为生成的镜像指定名称和标签,后续可通过docker run my-app:1.0
运行。
2. docker compose up -d
作用:
根据 docker-compose.yml
文件启动和管理多容器应用(包括构建镜像、创建网络、挂载卷等)。
关键特点:
-
输入:需要一个
docker-compose.yml
文件(定义多容器服务的配置)。 -
输出:启动一个或多个容器(基于现有镜像或自动构建镜像)。
-
典型用途:
-
启动复杂的多服务应用(如 Web + 数据库 + Redis)。
-
管理容器间的依赖关系和网络配置。
-
一键启停整个应用环境。
-
示例:
docker compose up -d # 根据 docker-compose.yml 启动所有服务(-d 表示后台运行)
核心区别对比
特性 | docker build | docker compose up -d |
---|---|---|
作用对象 | 单个镜像 | 多容器应用(服务、网络、卷等) |
输入文件 | Dockerfile | docker-compose.yml |
输出结果 | 生成镜像 | 启动容器(可能包含构建镜像的步骤) |
典型场景 | 构建自定义镜像 | 部署完整的多服务环境 |
依赖关系 | 不涉及其他容器 | 可定义服务间的依赖(如数据库先启动) |
网络/卷管理 | 无 | 自动创建网络和卷 |
常见工作流
-
开发阶段:
-
用
docker build
构建镜像。 -
用
docker compose up
测试多服务交互。
-
-
生产部署:
-
直接使用
docker compose up -d
(如果docker-compose.yml
中已定义镜像来源)。
-
-
调试:
-
docker build
失败时检查Dockerfile
。 -
docker compose up
失败时检查服务配置或日志。
-
补充说明
-
如果
docker-compose.yml
中包含build
字段,docker compose up
会自动构建镜像(相当于隐式调用docker build
)。 -
-d
参数表示“后台运行”(detached mode),不加则会附着到容器日志输出。 -
推荐组合使用:先
build
测试镜像,再通过compose
编排完整环境。
1. 功能区别
命令/工具 | docker build | docker compose |
---|---|---|
核心职责 | 构建镜像(从 Dockerfile 生成镜像) | 编排多容器应用(定义和运行多服务环境) |
输入文件 | Dockerfile | docker-compose.yml |
操作对象 | 单个镜像 | 多个容器、网络、存储卷等资源 |
典型场景 | 将代码打包成可运行的镜像 | 一键启动完整的应用栈(如 Web + DB + Redis) |
2. 协作关系
场景 1:Compose 自动调用 Build
如果 docker-compose.yml
中定义了 build
字段,运行 docker compose up
时会自动触发 docker build
:
services:webapp:build: . # 根据当前目录的 Dockerfile 构建镜像ports:- "8000:8000"
执行命令:
docker compose up -d # 自动构建镜像并启动容器
场景 2:先 Build 后 Compose
-
手动构建镜像:
docker build -t my-app:1.0 .
-
在 Compose 中引用已有镜像:
services:webapp:image: my-app:1.0 # 直接使用已构建的镜像ports:- "8000:8000"
-
启动服务:
docker compose up -d
3. 关键区别
维度 | docker build | docker compose |
---|---|---|
层级 | 底层命令(镜像构建) | 高层工具(应用编排) |
依赖 | 只需要 Dockerfile | 依赖 docker-compose.yml 和镜像 |
是否管理容器 | 否 | 是(创建、启动、停止容器) |
网络/卷 | 不涉及 | 自动管理网络和存储卷 |
4. 为什么需要协作?
-
开发效率:
docker compose
通过一个命令即可完成镜像构建(如果需要)和容器启动,简化流程。 -
环境一致性:
docker-compose.yml
可定义完整的服务依赖(如数据库先于应用启动),避免手动操作错误。 -
复用性:
构建好的镜像(docker build
生成)可被多个 Compose 项目共享。
5. 实际工作流示例
开发阶段
-
编写
Dockerfile
定义应用环境。 -
编写
docker-compose.yml
配置服务依赖。 -
运行:
docker compose up --build # 强制重新构建镜像并启动
生产部署
-
构建生产镜像:
docker build -t my-app:prod .
-
通过 Compose 部署:
# docker-compose.prod.yml services:app:image: my-app:prod # 直接使用构建好的镜像deploy:replicas: 3
-
启动:
docker compose -f docker-compose.prod.yml up -d
总结
-
docker build
是构建镜像的工具,docker compose
是编排多容器应用的工具。 -
Compose 可以依赖 Build(通过
build:
字段),但也可以直接使用已存在的镜像(通过image:
字段)。 -
两者结合使用能实现从代码到完整应用环境的无缝管理。