架构师系列-Docker(八)-docker-compose任务编排

本文介绍了在管理微服务过程中遇到的问题,重点讨论了docker-compose和Kubernetes作为编排工具的重要性,涵盖了容器集群化、服务发现、任务编排、docker-compose的基本使用和与Kubernetes的比较,以及如何使用docker-compose进行容器的部署和管理。
摘要由CSDN通过智能技术生成

任务编排工具

我们发现我们现在管理微服务比较麻烦,现在只是三个微服务,如果更多会更加麻烦,怎么办呢,下面我们就来学习下docker编排工具

什么是任务编排

编排是一个新的词汇,经过阅读才明白编排指的是容器的集群化和调度,另一类含义指的是容器管理,负责管理容器化应用和组件任务。

docker毫无疑问是一个优秀的开源工具,但是,仅靠docker引擎和容器就不能进行复杂的应用程序部署,对于部署复杂的应用程序体系结构的容器群集,必须进行适当的配置,容器化的应用程序应该能够根据应用程序资源需求进行扩展和缩小。

需要考虑的因素

我们需要一个有效管理容器的良好框架,容器的生命周期很短,在进行容器编排时,要考虑的主要因素是

  1. 联网
  2. 高可用性
  3. 易于部署
  4. 良好的服务发现。

常见的任务编排工具

docker-compose

docker-compose是基于docker的编排工具,使容器的操作能够批量的,可视的执行,是一个管理多个容器的工具,比如可以解决容器之间的依赖关系,当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容器出错,这个时候推荐使用 docker的单机编排工具 docker-compose。

Kubernetes

Kubernetes是一个开源的,开箱即用的容器集群管理器和业务流程,它具有出色的构建 调度器 和资源管理器,用于以更有效和高度可用的方式部署容器,Kubernetes已成为许多组织事实上的容器编排工具,kubernetes项目由google与世界各地的贡献者维护,它提供了本机Docker工具不提供的许多功能,而且,使用kubernetes很容易上手。

OpenShift

 

Openshift建立在kubernetes之上,Openshift项目由Redhat维护,它同时具有开源(openshift orgin)和企业版(openshift容器平台),连同核心的Kubernetes功能,它提供了用于容器管理和编排的开箱即用组件。

Docker Swarm

Docker生态系统包括从开发到生产部署框架的工具,在该列表中,docker swarm适用于集群管理,可以使用docker-compose,swarm,overlay网络和良好的服务发现工具(例如etcd或consul)的组合来管理Docker容器集群。

与其他开源容器集群管理工具相比,Docker swarm在功能方面仍日趋成熟,考虑到庞大的Docker贡献者,Docker swarm拥有其他工具拥有的所有最佳功能不会太久,Docker记录了在生产中使用docker swarm 的良好生产计划。

环境准备

我们这里面主要讲解docker-composeswarm的编排工具

搭建Horbor仓库

我们刚才讲解了本地搭建Horbor仓库,但是我们本地搭建很占用资源,我们用了一台服务器专门来做Horbor的仓库

停止本地Harbor

 cd /usr/local/harbor/harbor/ && docker-compose down

因为使用了单独的Harbor服务器,本地的Harbor就可以停掉了

清理Docker环境
清理本地环境
因为使用任务编排,本地的服务都可以删除掉了

# 停止并删除所有容器
docker rm -f $(sudo docker ps -a -q)
# 删除所有镜像
docker rmi $(docker images -q)

查看本地环境
可以查看下本地的Docker环境

docker ps -a
docker images

删除网络配置
因为我们自己配置了Docker网络,我们删除掉

docker network rm learn-docker-network

修改Docker配置
因为我们使用了独立的Horbor仓库,可以将配置到Docker中的本地仓库地址替换为新的仓库地址

修改daemon
# 修改daemon文件删除本地仓库地址
vi /etc/docker/daemon.json
在daemon.json中增加如下内容

"insecure-registries": ["manager-hongbaoyu-java.test.net:8443"],
查看修改
# 查看daemon配置
cat /etc/docker/daemon.json
新的仓库地址是manager-hongbaoyu-java.test.net:8443

重启Docker
systemctl daemon-reload
service docker restart
初始化镜像
将服务器的需要的镜像初始化

docker pull mysql:5.7.33;\
docker pull nacos/nacos-server;\
docker pull manager-hongbaoyu-java.test.net:8443/library/learn-docker-web:1.0-SNAPSHOT;\
docker pull manager-hongbaoyu-java.test.net:8443/library/learn-docker-gateway:1.0-SNAPSHOT;\
docker pull manager-hongbaoyu-java.test.net:8443/library/learn-docker-storage:1.0-SNAPSHOT

docker-compose容器编排

为什么使用docker-compose

我们学会了使用 dockerfile 构建 docker 镜像,看起来已经能够满足我们的日常需求了,无论需要什么环境,在 dockerfile 里逐步构建,然后 build、run,就 ok 了,也满足了我们docker 隔离性、快速部署的要求,为什么还需要docker-compose呢?

我们来看一个网站开发最常见的场景:我们要有数据库,网站应用,nginx,互相配合才是完整的环境,是的,我们完全可以以 ubuntu 为基础镜像,把这些一股脑全装进去,然后运行,但是这样有很多缺点,比如我们每次都要重新装 mysql 而不是直接利用 mysql 官方的基础镜像,升级维护不方便;如果我们的应用要扩展也很难,因为每个应用都连接的自己内部的数据库,无法共享数据;事实上,这种方式是典型的虚拟机的使用方式,不是 docker 的正确打开方式

docker 是轻量化的应用程序,docker 官方推荐每个 docker 容器中只运行一个进程,那么就是说,我们需要分别为我们的应用、数据库、nginx 创建单独的 docker 容器,然后分别启动它,想象一下,构建好 docker 之后,每次启动我们的网站,都要至少 docker run 三次,是不是很繁琐?而且此时这几个 docker 是分散独立的,很不方便管理,既然这几个 docker 都是为了同一个网站服务,是不是应该把它们放到一起?这就引出了 docker-compose 项目。

什么是docker-compose

docker-compose是 docker 官方的开源项目,使用 python 编写,实现上调用了 Docker 服务的 API 进行容器管理,其官方定义为为 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)),其实就是上面所讲的功能。

安装Docker-Compose

Docker Compose是一个用来定义和运行复杂应用的Docker工具,一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。

Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。

查找最新版的docker-compose

Releases · docker/compose · GitHub 地址查找最新的docker-compose版本

 

安装docker-compose

下载最新版的docker-compose文件

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/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概述

类似 docker 的Dockerfile文件,docker-compose使用 YAML 文件对容器进行管理。

相关概念

对于 docker-compose 有两个基本的概念:

  • 服务(service):一个应用容器,即 docker 容器,比如之前所说的mysql 容器、nginx 容器
  • 项目(project):由一组关联的应用容器组成的一个完整业务单元,比如上面所讲的由 mysql、web app、nginx 容器组成的网站,docker-compose 面向项目进行管理。

YAML 文件格式

  1. 大小写敏感,缩进表示表示层级关系
  2. 缩进空格数不重要,相同层级左侧对齐即可。(不允许使用 tab 缩进!)
  3. 由冒号分隔的键值对表示对象;一组连词线开头的行,构成一个数组;字符串默认不使用引号

Compose和Docker兼容性

Docker Engine 与docker-compose version 之间的有以下关系

compose文件格式版本docker版本
3.417.09.0+
3.317.06.0+
3.217.04.0+
3.11.13.1+
31.13.0+
2.317.06.0+
2.21.13.0+
2.11.12.0+
21.10.0+
11.9.1.+

基本使用

接下来我们使用 docker-compose 构建我们的微服务以及mysql,并逐步讲解其使用。

准备工作

在项目文件夹下创建 docker-compose.yml文件

cd /usr/local/docker-learn/ && touch docker-compose.yml && ll

编写配置文件
先在 docker-compose.yml 文件里添加如下代码,构建我们的项目

version: '2'   
services:
    mysql:
        image: mysql:5.7.38
        hostname: mysql
        container_name: mysql
        restart: always
        networks:
            - learn-docker-network
        volumes:
            - "/tmp/etc/mysql:/etc/mysql/mysql.conf.d/"
            - "/tmp/data/mysql:/var/lib/mysql"
        environment:
            MYSQL_ROOT_PASSWORD: 'root'
    nacos:
        image: nacos/nacos-server
        hostname: nacos
        container_name: nacos
        restart: always
        ports:
            - "8848:8848"
        networks:
            - learn-docker-network
        environment:
            MODE: 'standalone'
            JVM_XMS: '128m'
            JVM_XMX: '128m'
    
    learn-docker-web:
        image: manager-hongbaoyu-java.test.net:8443/library/learn-docker-web:1.0-SNAPSHOT
        restart: always
        networks:
            - learn-docker-network
        depends_on:
            - nacos
            - mysql
        volumes:
            - "/tmp/data/logs:/logs"
    learn-docker-storage:
        image: manager-hongbaoyu-java.test.net:8443/library/learn-docker-storage:1.0-SNAPSHOT
        restart: always
        networks:
            - learn-docker-network
        depends_on:
            - nacos
            - mysql
        volumes:
            - "/tmp/data/logs:/logs"
    learn-docker-gateway:
        image: manager-hongbaoyu-java.test.net:8443/library/learn-docker-gateway:1.0-SNAPSHOT
        restart: always
        ports:
            - "8888:8888"
        networks:
            - learn-docker-network
        depends_on:
            - nacos
            - mysql
        volumes:
            - "/tmp/data/logs:/logs"
networks:
    learn-docker-network:
        driver: bridge
运行测试
在项目的文件中执行docker-compose up -d命令就可以启动了

docker-compose up -d

微服务访问测试
通过网关地址访问测试微服务

curl http://192.168.64.153:8888/employeapi/find/10001| python -m json.tool

 

参数解释(手册)

version

指定 docker-compose.yml 文件的写法格式

docker-compose.yml的version版本号应该和docker的版本进行匹配,如果不匹配可能出现问题。

services

表示多个容器的集合

服务对象

docker-compose.yml管理是以服务为单位管理的,一个services下面可以有多个服务,mysql,app都代表一个服务

image

image是指定服务的镜像名称或镜像 ID,如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。

hostname

配置容器的host名称,在容器的hosts文件中加入了映射

4ed81dac527a48dbbca96560531975eb.png 

container_name

配置启动后的容器名称和docker的--name xxx效果是一样的

restart

restart参数能够使我们在重启docker时,自动启动相关容器,和docker的--restart效果一致

Docker容器的重启策略如下

  • no,默认策略,在容器退出时不重启容器
  • on-failure,在容器非正常退出时(退出状态非0),才会重启容器
  • on-failure:3,在容器非正常退出时重启容器,最多重启3次
  • always,在容器退出时总是重启容器
  • unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

ports

映射端口的标签,对外暴露的端口定义,和 expose 对应,和docker的-p效果一致

depends_on

这个是依赖配置的选项,意思是如果 服务启动是如果有依赖于其他服务的,先启动被依赖的服务,启动完成后在启动该服务

networks

配置容器所使用的网络

volumes

挂载一个目录或者一个已存在的数据卷容器,和docker -v效果一致

environment

配置环境变量,和docker的 -e效果一致

常用命令

docker-compose up

用于部署一个 Compose 应用

默认情况下该命令会读取名为 docker-compose.yml 或 docker-compose.yaml 的文件

,用户也可以使用 -f 指定其他文件名。通常情况下,会使用 -d 参数令应用在后台启动。

docker-compose stop

停止 Compose 应用相关的所有容器,但不会删除它们。

被停止的应用可以很容易地通过 docker-compose restart 命令重新启动。

如果带有服务命则停止该服务 ,否则停止所有服务

8b5ec24195d047f385f8e5db7c9a79d2.png 

docker-compose rm

用于删除已停止的 Compose 应用

它会删除容器和网络,但是不会删除卷和镜像

如果带有服务命则删除该服务 ,否则删除所有服务

docker-compose restart

重启已停止的 Compose 应用。

如果用户在停止该应用后对其进行了变更,那么变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效。

docker-compose ps

用于列出 Compose 应用中的各个容器。

输出内容包括当前状态、容器运行的命令以及网络端口。

bbbfd154bb0f4871991c143eac046555.png

docker-compose down

停止并删除运行中的 Compose 应用。

它会删除容器和网络,但是不会删除卷和镜像。

4a86591d0cb04e8ab686d6ddc5789e9f.png 

扩缩容

nacos查看集群情况

我们可以查看nacos,查看当服务器集群的一个部署情况

11924134abc14927a93bb0b56f11ae7c.png 

扩容节点

我们现在对learn-docker-storage节点进行扩容

语法格式:docker-compose up -d --scale 服务名=节点数

docker-compose up -d --scale learn-docker-storage=2

启动后查看nacos节点信息

edf509dfbfcc464b84c62abeebe03018.png

缩容节点

和扩容一样指定节点数量就可以的

docker-compose up -d --scale learn-docker-storage=1

 停止后后查看nacos节点信息

51d167234ff4429598e92600192e6233.png

 

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值