在实际应用中,当我们需要部署大量的 Docker 容器时,手动管理这些容器的配置和部署变得非常繁琐。每个容器可能需要不同的参数、端口映射、网络设置等,这导致了管理和维护的复杂性。为了解决这个问题,我们可以借助 Docker Compose 工具,它提供了一种简单、统一的方式来定义和管理多容器的 Docker 应用。
Docker Compose 是 Docker 公司提供的一个用于定义和运行多容器 Docker 应用程序的工具。通过 Docker Compose,可以使用简单的 YAML 文件来配置整个应用程序的服务、网络、卷等各种参数。这样,我们可以轻松实现一键部署和管理多个 Docker 容器,简化了多容器应用的配置和管理。
安装 Docker Compose 非常简单,可以按照以下步骤在 CentOS 上安装:
打开终端,以 root 用户身份登录。
使用以下命令下载 Docker Compose 的二进制文件:
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
赋予执行权限:
sudo chmod +x /usr/local/bin/docker-compose
验证安装:
docker-compose --version
如果安装成功,会显示 Docker Compose 的版本信息。
通过以上步骤,就成功在 CentOS 上安装了 Docker Compose。接下来,我们将深入探索如何使用 Docker Compose 编写和管理多容器的应用程序。
Docker Compose 文件是一个 YAML 文件,用于定义和配置多容器 Docker 应用程序的服务、网络、卷等。通过 Docker Compose 文件,我们可以以声明式的方式描述应用程序的结构和参数,从而简化容器化应用的部署和管理。
一个基本的 Docker Compose 文件通常包括以下几个部分:
version: 指定 Compose 文件的版本services: 定义各个服务,每个服务对应一个容器。networks: 定义网络设置。volumes: 定义卷,用于持久化数据。以下是一个简单的 Docker Compose 文件示例:
version: '3'
services:
web:
image: nginx:latest
ports:
- "8080:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
networks:
app_net:
volumes:
data_vol:
在这个示例中,定义了两个服务 web 和 db,以及一个网络 app_net 和一个卷 data_vol。
version指令
version 指令用于指定 Compose 文件的版本。不同的版本可能支持不同的特性和语法。常见的版本有 2, 2.1, 3, 等。根据需要选择适合的版本。
services指令
services 指令定义了各个服务,每个服务对应一个容器。每个服务可以包括以下一些常见配置项:
image: 指定使用的镜像。build: 指定 Dockerfile 的路径,用于构建镜像。ports: 指定端口映射。environment: 指定环境变量。volumes: 指定卷的挂载。以下是一个服务的示例:
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
在这个示例中,web 服务使用了 nginx:latest 镜像,将主机的 ./html 目录挂载到容器的 /usr/share/nginx/html 目录,并映射主机的 8080 端口到容器的 80 端口。
networks指令
networks 指令用于定义网络设置。可以为服务指定特定的网络。以下是一个网络的示例:
networks:
app_net:
在这个示例中,定义了一个名为 app_net 的网络。
volumes指令
volumes 指令用于定义卷,用于持久化数据。以下是一个卷的示例:
volumes:
data_vol:
在这个示例中,定义了一个名为 data_vol 的卷。
version: '3'
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
networks:
app_net:
volumes:
data_vol:
在这个示例中,定义了两个服务 web 和 db,以及一个网络 app_net 和一个卷 data_vol:
web 服务使用了 nginx:latest 镜像,将主机的 ./html 目录挂载到容器的 /usr/share/nginx/html 目录,并映射主机的 8080 端口到容器的 80 端口。db 服务使用了 mysql:5.7 镜像,并设置了 MySQL 的 root 密码。网络 app_net 和卷 data_vol 分别定义了一个网络和一个卷。通过这个示例,可以更好地理解 Docker Compose 文件的基本结构和语法。在接下来的学习中,我们将深入了解如何使用 Docker Compose 部署和管理多容器的应用程序。
Docker Compose 提供了一系列命令,用于管理多容器的应用程序。下面我们将介绍一些常用的 Docker Compose 命令,帮助更好地使用和管理容器化应用。
docker-compose up启动容器。在项目目录下执行该命令,Compose 将会根据 docker-compose.yml 文件启动相应的服务。如果没有 docker-compose.yml 文件,可以使用 -f 参数指定其他的 Compose 文件。
docker-compose up
docker-compose down停止并移除容器、网络、卷。在项目目录下执行该命令,Compose 将停止并删除与该项目关联的所有服务。同样可以使用 -f 参数指定其他的 Compose 文件。
docker-compose down
docker-compose ps列出项目中所有服务的状态。在项目目录下执行该命令,Compose 将列出项目中所有服务的状态,包括运行状态、端口映射等信息。
docker-compose ps
docker-compose logs显示服务的日志输出。在项目目录下执行该命令,Compose 将显示项目中所有服务的实时日志输出。
docker-compose logs
docker-compose exec在服务中执行命令。可以使用该命令在指定的服务中执行特定的命令,例如:
docker-compose exec web ls -l
以上是一些常用的 Docker Compose 命令,通过这些命令,我们可以方便地启动、停止、管理多容器的应用程序。
下面通过一个简单的示例来演示如何使用 Docker Compose 部署一个包含 Web 服务和数据库服务的应用程序。
创建一个名为 docker-compose.yml 的文件,并添加以下内容:
version: '3'
services:
web:
image: nginx:latest
ports:
- "8080:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
在这个示例中,定义了两个服务 web 和 db。web 服务使用了 nginx:latest 镜像,将主机的 8080 端口映射到容器的 80 端口。db 服务使用了 mysql:5.7 镜像,并设置了 MySQL 的 root 密码。
在包含 docker-compose.yml 文件的目录下,执行以下命令启动应用程序:
docker-compose up
Compose 将会启动两个服务,分别运行在两个容器中。web 服务使用 Nginx 提供 Web 服务,db 服务使用 MySQL 提供数据库服务。
在浏览器中访问 http://宿主机IP:8080,将看到 Nginx 提供的欢迎页面。至此,一个简单的多容器应用程序就成功部署和运行了。
当不再需要应用程序时,可以执行以下命令停止并清理容器、网络和卷:
docker-compose down
通过这个简单的示例,可以帮助我们如何编写 Docker Compose 文件,以及如何使用 Docker Compose 启动、停止和管理多容器的应用程序。这对于复杂的容器化应用程序管理将会非常实用。
目标:使用 Docker Compose 将 cloud-demo 微服务项目集群部署到 Docker 容器中。
gateway、mysql、order-service、user-service ,另外创建一个 docker-compose.yml 用于编写 Docker Compose 配置信息。
version: "3.2"
services:
nacos:
image: nacos/nacos-server
environment:
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"
说明:
这是一个 docker-compose.yml 文件,用于定义 Docker Compose 的配置信息,包含了多个服务的定义,每个服务都有特定的配置。
nacos 服务使用了 nacos/nacos-server 镜像,设置了环境变量 MODE 为 standalone,并将容器的 8848 端口映射到主机的 8848 端口。
mysql 服务使用了 mysql:5.7.25 镜像,设置了 MySQL 的 root 用户密码为 123,并将两个本地目录挂载到容器内,分别用于存储 MySQL 数据和配置文件。
userservice、orderservice、gateway 三个服务都使用了各自微服务目录中的 Dockerfile 进行构建。这意味着这三个服务的构建过程需要分别查看各自目录下的 Dockerfile 文件。
对于 gateway 服务,还将容器的 10010 端口映射到主机的 10010 端口。
此文件的作用是描述整个微服务架构中各个服务的配置和依赖关系,通过执行 docker-compose up -d 命令,Docker Compose 将按照这个配置信息创建、启动整个微服务集群。
cloud-demo 项目中的配置:将 MySQL 数据库、nacos地址,微服务的 IP 地址都命名为docker-compose中的服务名例如:

maven打包工具,将项目中的每个微服务都打包为app.jar即将所有微服务中的 build 改为如下形式:
<build>
<finalName>appfinalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
app.jar拷贝自己对应的目录中,并在自己的目录中创建 Dockerfile文件:Dockerfile文件内容:
FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar
cloud-demo目录结构:
其中,mysql 目录中存放的数据库的配置文件和数据库表文件。

cloud-demo微服务集群部署的命令:
docker-compose up -d

执行这个命令后,由于当前Docker中没有 Nacos 和 MySQL 镜像,因此首先会拉取这两个镜像。然后才会构建微服务的镜像,最后运行所有镜像。

注意,有可能会因为 Nacos 不是最先启动完成而导致其他服务启动失败,此时可以重启其他微服务来解决:
docker-compose restart gateway userservice orderservice
gateway网关访问微服务集群访问用户:

访问订单:

此时,我们的微服务集群便通过 Docker Compose 搭建成功了。