写点什么

〖Docker 指南⑦〗docker-compose 快速入门

作者:步尔斯特
  • 2022 年 6 月 08 日
  • 本文字数:3076 字

    阅读完需:约 10 分钟

〖Docker指南⑦〗docker-compose快速入门

一、简介

由 Docker 引领先锋,容器在过去的一年里得到了飞速发展。容器技术提供了组件化环境,帮助应用在云之间轻松迁移而无需显著的返工。当谈到构建云以及非云的应用时,容器的战斗口号是可移植性和简单性。

随着容器在企业持续获得发展,厂商将增加新的功能让用户可以创建可扩展的基于容器的环境,这些功能很大程度上都集中于容器编排上。

容器编排工具提供调度和集群的技术,提供用于基于容器应用可扩展性的基本机制。这些工具使用容器服务,并编排他们以决定容器之间如何进行交互。此外,编排允许容器可以存在并执行在集群上,这使得他们能够扩展来适应增加的处理负荷。

docker-compose 是 docker 官方提供的容器编排工具,但市面上使用得较多的容器编排工具是 k8s。什么是容器编排?容器编排就是管理宿主机部署容器的过程。docker-compose 只支持单机多容器部署,通过 yml 文件配置你自己的服务,然后通过一个命令,你能使用配置文件创建和运行所有的服务,重点可以启动多个容器!!!

二、安装

2.1 版本选择

我们所选择的 docker-compose 版本要和 docker engine 版本对应:友情链接

在这里插入图片描述

2.2 下载

友好链接

在 Linux 系统上将 Compose 安装为独立的二进制文件

  1. 运行以下命令下载 Docker Compose 的当前稳定版本:curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

  2. 对二进制文件应用可执行权限:chmod +x /usr/local/bin/docker-compose

  3. 测试安装:docker-compose --version

在这里插入图片描述

三、原理

Compose 项目是由 Python 编写的,实际上就是调用了 Docker 服务提供的 API 来对容器进行管理,因此,只要所在的操作系统的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

compose 中常常提及的概念:

project通过 docker compose 管理的一个项目被抽象称为一个 project,它是由一组关联的应用容器组成的一个完整的业务单元。简单点说就是一个 docker-compose.yml 文件定义一个 project。我们可以在执行 docker-compose 命令时通过 -p 选项指定 project 的名称,如果不指定,则默认是 docker-compose.yml 文件所在的目录名称。

service运行一个应用的容器,实际上可以是一个或多个运行相同镜像的容器。可以通过 docker-compose up 命令的 --scale 选项指定某个 service 运行的容器个数,比如:

docker-compose up -d --scale redis=2

了解了上面的基本概念之后,让我们一起看看 compose 的一次调用流程:

在这里插入图片描述

右上角的 docker-compose 定义了一组 service 来组成一个 project,通过 docker-compose.yml 中 service 的定义与 container 建立关系(service 与容器的对应关系),最后使用 container 来完成对 docker-py(Python 版的 docker client) 的调用,向 docker daemon 发起 http 请求。

注意,这里的 project, service 和 container 对应的都是 docker-compose 实现中的数据结构。下面让我们结合上图来介绍 docker-compose 工作的大致流程。

首先,用户执行的 docker-compose up 命令调用了命令行中的启动方法,功能非常简单。一个 docker-compose.yml 文件定义了一个 project,docker-compose up 提供的命令行参数则作为这个 project 的启动参数交由 project 模块处理。

然后,如果当前宿主机已经存在与该应用对应的容器,docker-compose 则进行行为逻辑判断。如果用户指定可以重新启动已有服务,docker-compose 就会执行 service 模块的容器重启方法,否则就直接启动已有容器。这两种操作的区别在于前者会停止旧的容器,创建并启动新的容器,并把旧容器移除掉。在这个过程中创建容器的各项自定义参数都是从 docker-compose up 命令和 docker-compose.yml 中传入的。

接下来,启动容器的方法也很简洁,这个方法中完成了一个 docker 容器启动所需的主要参数的封装,并在 container 模块执行启动。

最后,contaier 模块会调用 docker-py 客户端来执行向 docker daemon 发起创建容器的 POST 请求。

由此可见 docker-compose 工作的整体流程非常清晰、简洁!

重新启动 services前面我们提到当前宿主机已经存在与该应用对应的容器,docker-compose 会进行判断并决定是否重新启动已有服务。

强制 recreateRecreate 就是删除现有的容器并且重新创建新的容器,为 docker-compose up 命令指定 --force-recreate 选项可以强制 recreate 容器。

创建个别容器如果应用中的个别 service 对应的容器被删除了,docker-compose up 命令会新建相关的容器。

启动个别容器与上面类似,如果应用中的个别 service 对应的容器被停止(stop)了,docker-compose up 命令会重新启动相关的容器。

四、常用命令

Compose 大部分命令的对象即可以是项目的本身,也可以是指定为项目中的服务或者容器执行docker-compose [COMMAND] --help或者docker-compose help [COMMAND]可以查看命令的帮助信息

具体的使用格式docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS]

参数选项

Compose 所支持的命令

五、实战

编写docker-compose.yml

version: "3"
services:  ossa-service-producer:    image: ossa-service-producer-9001    container_name: ossa-service-producer-9001    ports:      - "9001:9001"    volumes:      - /app/ossa-service-producer:/data    networks:      - ossa_net    depends_on:      - nacos      - sentinel          nacos:    image: ossa-nacos    ports:    - "8848:8848"    - "9848:9848"    volumes:    - /app/nacos:/data    networks:      - ossa_net    command:         sentinel:    image: ossa-sentinel    ports:      - "8858:8858"    volumes:      - /app/sentinel:/data    networks:      - ossa_net    command: 
复制代码

修改项目中的相关配置文件

server:  port: 9001spring:  application:    name: ossa-service-producer  cloud:    nacos:      # nacos踩坑:docker run --name nacos -itd -e MODE=standalone -p 8848:8848 -p 9848:9848 nacos/nacos-server:v2.0.3      discovery:        server-addr: nacos:8848        namespace: a3915605-1084-43cb-911e-d206afa6c032        group: DEV_GROUP      config:        server-addr: nacos:8848        file-extension: yml        refresh-enabled: true        group: DEV_GROUP        namespace: a3915605-1084-43cb-911e-d206afa6c032    sentinel:      transport:        dashboard: sentinel:8858        port: 8719#        clientIp: 127.0.0.1
复制代码

执行配置文件检查

在这里插入图片描述

有问题修改,没问题执行 yml 文件docker-compose up -d

此时查看我们的 docker 网络docker network ls

会发现我们的自定义的网络名字ossa_net变成了docker-compose-test_ossa_net

「对于网络名称,会在自定的网络前加上当前文件夹名字+_,对于没有指定容器名字的服务,会在服务的前面加上当前文件夹名字+_,在后面加上数字1,如存在 1,则递增」

最后,停止服务docker-compose stop


文献参考:徐珉. Docker 环境下容器编排工具的选择. 《 集成电路应用 》 , 2017

发布于: 刚刚阅读数: 3
用户头像

步尔斯特

关注

还未添加个人签名 2022.05.07 加入

还未添加个人简介

评论

发布
暂无评论
〖Docker指南⑦〗docker-compose快速入门_Docker_步尔斯特_InfoQ写作社区