在实际应用中,当我们需要部署大量的 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 搭建成功了。