网络知识 娱乐 〖Docker指南⑦〗docker-compose快速入门

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

docker-compose

  • 一、简介
  • 二、安装
    • 2.1 版本选择
    • 2.2 下载
  • 三、原理
  • 四、常用命令
  • 五、实战

一、简介

由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 会进行判断并决定是否重新启动已有服务。

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

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

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

四、常用命令

命令注释
docker-compose -h 查看帮助
docker-composeup启动所有docker-compose服务
docker-composeup -d启动所有docker-compose服务并后台运行
docker-composedown停止并删除容器、网络、卷、镜像
docker-composeexec ${yml内服务的id} /bin/bash进入容器实例内部
docker-composeps展示当前docker-compose编排过的运行的所有容器
docker-composetop展示当前docker-compose编排过的容器进程
docker-composelogs ${yml内服务的id}查看容器输出日志
docker-composeconfig检查配置
docker-composeconfig -q检查配置,有问题才输出
docker-composerestart重启服务
docker-composestart启动服务
docker-composestop停止服务

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

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

参数选项

12
-f,--filefile指定模板文件,默认是docker-compose.yml模板文件,可以多次指定
-p,--project-namename指定项目名称,默认使用所在目录名称作为项目名称
--x-networking使用Docker的后端可插拔网络特性
--x-networking-driverdriver指定网络的后端驱动,默认使用bridge
--verbose输入更多的调试信息
-v,--version输出版本信息

Compose所支持的命令

12
buildBuild or rebuild services (构建项目中的服务容器)
bundleGenerate a Docker bundle from the Compose file (从Compose文件生成分布式应用程序包)
configValidate and view the Compose file (验证并查看Compose文件)
createCreate services (为服务创建容器)
downStop and remove containers, networks, images, and volumes (停止容器并删除由其创建的容器,网络,卷和图像up)
eventsReceive real time events from containers (为项目中的每个容器流式传输容器事件)
execExecute a command in a running container (这相当于docker exec。使用此子命令,您可以在服务中运行任意命令。默认情况下,命令分配TTY,因此您可以使用命令docker-compose exec web sh来获取交互式提示。)
helpGet help on a command (获得一个命令的帮助)
imagesList images ()
killKill containers (通过发送SIGKILL信号来强制停止服务容器)
logsView output from containers (查看服务容器的输出)
pausePause services (暂停一个容器)
portPrint the public port for a port binding (打印某个容器端口所映射的公共端口)
psList containers (列出项目中目前所有的容器)
pullPull service images (拉取服务依赖镜像)
pushPush service images (推送服务镜像)
restartRestart services (重启项目中的服务)
rmRemove stopped containers (删除所有停止状态的服务容器)
runRun a one-off command (在指定服务上执行一个命令)
scaleSet number of containers for a service (设置指定服务执行的容器个数)
startStart services (启动已存在的服务容器)
stopStop services (停止已存在的服务容器)
topDisplay the running processes (显示容器正在运行的进程)
unpauseUnpause services (恢复处于暂停状态的容器)
upCreate and start containers (自动完成包括构建镜像、创建服务、启动服务并关联服务相关容器的一系列操作)
versionShow the Docker-Compose version information (输出版本)

五、实战

编写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: 9001
spring:
  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