Docker Compose
1.简介
Dockerfile适合打包单个应用,docker run一次通常只能启动一个容器。
实际项目中经常包含多个服务,例如:
- 1个Java后端
- 1个Vue前端
- 1个MySQL
- 1个Redis
如果只使用普通Docker命令,需要手动执行多次docker run,还要处理容器之间的通信,效率比较低。
Docker Compose是Docker官方的批量容器编排工具。它可以通过一个YAML文件描述所有服务,然后用一条命令启动整个项目。
2.核心层级
| 层级 | 说明 |
|---|---|
| 工程 | 最大单位,代表要运行的整个项目,通常以所在文件夹命名 |
| 服务 | 工程中的组件,例如数据库服务、Web应用服务,一个服务可以包含一个或多个相同容器实例 |
| 容器 | 最小运行单元,真正执行任务的Docker实例 |
3.使用三步骤
使用Compose通常分为三步:
1.定义个体:编写Dockerfile,保证代码可以打包成镜像并在任何地方运行。
2.定义群体:编写docker-compose.yml,声明项目需要哪些服务、端口如何映射、磁盘如何挂载。
3.一键启动:在docker-compose.yml所在目录执行启动命令。
bash
docker compose up -d4.docker-compose.yml语法
docker-compose.yml是Compose的核心配置文件。
示例:
yaml
version: '3.8'
services:
web:
build: .
ports:
- "8080:8080"
depends_on:
- redis
redis:
image: "redis:alpine"
volumes:
- ./redis-data:/data配置说明:
| 配置 | 作用 |
|---|---|
version | Compose文件版本,新版Docker中可以不写 |
services | 开始定义服务 |
web | 服务名,可以自定义,例如web、app、backend |
build: . | 根据当前目录的Dockerfile构建镜像 |
ports | 端口映射,格式为宿主机端口:容器端口 |
depends_on | 启动顺序依赖,例如先启动redis再启动web |
image | 使用现成镜像,不现场构建 |
volumes | 数据卷挂载,用于数据持久化 |
注意:原笔记中的docker-conpose.yml应为docker-compose.yml。
5.日常高频命令
bash
#1.启动并后台运行
docker compose up -d
#2.关闭并清理容器
docker compose down
#3.重新构建镜像并启动
docker compose up -d --build
#4.查看指定服务日志
docker compose logs -f web说明:修改代码或者Dockerfile后,通常需要加--build重新构建镜像,否则可能运行的还是旧代码。
6.Compose网络连通
Compose的一个核心能力是自带内部局域网和DNS。
普通Docker中,如果Java应用要连接Redis,通常需要知道Redis容器的真实IP。但在Compose中:
- Compose会自动创建一个名为
项目名_default的网络。 - 所有在YAML里定义的服务都会加入这个网络。
- 服务名就是主机名,可以直接通过服务名访问其他容器。
示例:
text
redis://redis:6379含义:Java代码连接Redis时,不需要写Redis容器IP,直接写服务名redis即可,Compose会自动解析到对应容器。