在前面的课程中,我们学习了如何使用 Docker 容器来运行单个服务。
通过 docker run 命令,我们可以快速启动一个数据库、一个 Web 服务器或者一个缓存服务。这种方式在开发简单应用时非常有效。
然而,随着应用架构的演进,微服务的理念逐渐流行,一个应用由多个服务共同组成。
本节课我们准备了 一个多服务的web应用 的案例如下:
四个服务共同组成了应用,整体架构图如下:
┌─────────────┐ │ Nginx │ │ :8080 │ └─────┬───────┘ │ ┌────────┴────────┐ │ │ ┌───────▼─────┐ ┌──────▼──────┐ │ Frontend │ │ Backend │ │ (React) │ │ (Node.js) │ │ :3000 │ │ :3001 │ └─────────────┘ └──────┬───────┘ │ ┌───────▼───────┐ │ MongoDB │ │ Database │ │ :27017 │ └───────────────┘
试想一下,我们为了部署这个web应用,需要完成哪些工作?
1.为四个服务分别构建镜像 1.1 拉取nginx镜像 1.2 拉取mongodb镜像 1.3 手动书写前端服务的 Dockerfile,构建镜像 1.4 手动书写后端服务的 Dockerfile,构建镜像 2.配置容器见公共的基础设置 如Docker网络、存储卷等 3.配置服务间的依赖关系 如前端服务依赖后端服务,后端服务依赖数据库等 4.启动容器
可以看到,随着工程复杂度的提升,服务数量增加,手动管理服务容器会变得越来越复杂。 这不仅增加了运维的复杂度,还增加了手动操作出错的概率。
所以我们需要一个工具来对多容器应用进行管理。 于是Docker Compose应运而生。
Docker Compose 是一个用于定义和运行多容器的工具。 它允许我们使用 YAML 文件来定义各容器,然后通过一个命令来启动所有服务。
docker compose up: 创建和启动所有服务Docker Compose 使用 YAML 文件来定义服务。 YAML 是一种人类可读的数据序列化语言,它支持多种数据类型,如字符串、数字、列表、映射等。 Docker Compose 使用 YAML 文件来定义服务,因此我们需要了解 YAML 的基本语法。
流程:
cb959100/pkg/compose/up.go#L39nginx 服务
frontend 服务
backend 服务
mongodb 服务
mongodb_data 持久化数据库数据docker compose build: 构建镜像docker compose up: 创建和启动所有服务docker compose down: 停止和删除所有服务docker compose ps: 查看服务状态docker compose logs: 查看服务日志在后台启动服务
docker compose up -d
查看服务状态
docker compose ps
查看服务日志
docker compose logs frontend docker compose logs backend docker compose logs mongodb
停止所有服务
docker compose down
重新构建服务
docker compose build [${service}]
当 service 省略时,默认构建所有配置了 build 的服务。
重启单个服务
docker compose restart frontend