存档:
2019 年 07 月 (25)
分布式系统中多容器管理的困难 生产环境中同一种类型的容器往往散落在各个主机节点上,因此无法回避下列问题: 怎么去管理这么多容器? 怎么能方便的横向扩展? 如果容器down了,怎么能自动恢复? 如何去更新容器而不影响业务? 如何去监控追踪这些容器? 怎么去调度容器的创建? 保护隐私数据? Docker Swarm Mode Architecture 综上所述,容器编排应运而生,docker的容器编排工具的实现有很多,只不过swarm是内置于docker的容器编排工具,由docker公司内置到docker中。 Service & Replicas * 在docker swarm模式下Service的概念和Docker Compose中的概念基本一致。 * 在Replicas横向扩展模式下,每个Replicas都是一个实际的容器,每个容器都会根据调度系统的计算,被分配在不同的node上运行。也就是说,通过Swarm Manager部署去部署一个Service时候,其实是不知道容器最终会运行在哪些swarm节点上的,这取决于Swarm的调度算法的计算结果(例如:根据节点....
多容器的APP的痛点 要从Dockerfile build image或者Dockerhub拉取iage 要创建多个container 要管理这些container(启动停止删除) 一个应用可能由多个容器之间相互配合完成,追个容器进行管理成本高,将多个容器定义为一个组,对组进行统一的管理。 微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。 Docker Compose简介 使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。 Docker Compose是一个工具。 这个工具可以通过yml文件定义多容器的docker APP。 通过一条命令就可以根据yml文件的定义去创建或管理多容器。 yml概念 Services 一个service代表一个container,这个container可以从dockerhub的image创建而来,或是从本地的Dockerfile build构建的image创建而来。 Service的....
Container Layer 数据默认会写在Container Layer层,如果删除容器则应用数据也会随之消失,应用数据的生命周期随容器的生命周期。 Docker持久化数据的方案 基于本地文件系统的Volume。可以在执行Docker create或Docker run时,通过-v参数将主机的目录作为容器的数据卷。 基于plugin的Volume,支持第三方的存储方案,比如NAS,AWS。 数据持久化:Data Volume * 受管理的Data Volume,由docker后台自动创建。 * 绑定挂载的Volume,具体挂载位置可以由用户指定。 不管以上哪种方式都需要在Dockerfile内指定VOLUME。 [root@localhost ~]# docker run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql # 查看volume [root@localhost ~]# docker volume ls local d4c4991c29f14a193f87460de0b847ec30f5f4d1....
私有镜像仓库 开通镜像服务 登录阿里云开通容器镜像服务。点击管理控制台-》初次使用会提示开通,然后设置密码。 点击管理 # 登录阿里云Docker Registry docker login --username=soulboy1990116 registry.cn-shanghai.aliyuncs.com # 从Registry中拉取镜像(拉取) [root@localhost ~]# docker pull registry.cn-shanghai.aliyuncs.com/abc1024/soulboy_images:flask-hello-world flask-hello-world: Pulling from abc1024/soulboy_images [root@localhost ~]# docker run -d -p 5000:5000 registry.cn-shanghai.aliyuncs.com/abc1024/soulboy_images:flask-hello-world Digest: sha256:8c4f6441a730d5abff5838....
Linux namespace 的概念 Linux 内核从版本 2.4.19 开始陆续引入了 namespace 的概念。其目的是将某个特定的全局系统资源(global system resource)通过抽象方法使得namespace 中的进程看起来拥有它们自己的隔离的全局系统资源实例(The purpose of each namespace is to wrap a particular global system resource in an abstraction that makes it appear to the processes within the namespace that they have their own isolated instance of the global resource. )。Linux 内核中实现了六种 namespace,按照引入的先后顺序,列表如下: namespace 引入的相关内核版本 被隔离的全局系统资源 在容器语境下的隔离效果 Mount namespaces Linux 2.4.19 ....
Docke Architecture Docker客户端 Docker Client的主要目的是提供一种方法来指导从注册中心里提取镜像并使其在Docker主机上运行。 DockerHost Docker主机提供了一个完整的环境来执行和运行应用程序。它包括Docker守护程序,镜像,容器,网络和存储。如前所述,守护进程负责所有与容器相关的操作,并通过CLI或REST API接收命令。它还可以与其他守护进程通信,以管理其服务。Docker守护程序根据客户端的请求提取和构建容器镜像。一旦它提取了请求的镜像,它就会利用一组称为构建文件的指令为容器构建一个工作模型。构建文件还可以包括守护程序在运行容器之前预加载其他组件的指令,或者在构建容器之后将指令发送到本地命令行的指令。 Docker对象 各种对象用于组装应用,docker的主要对象如下: Images:用于构建容器的只读二进制模版,可以通过私有或公共注册中心获取。 Containers:容器是运行应用程序的封装环境。容器由映像和启动容器时提供的任何其他配置选项定义,包括但不限于网络连接和存储选项。容器只能访问映像中定义的资源,除非....
Bus 简介 Spring Cloud Bus(消息总线)通过一个轻量级的消息中间件可以连接分布式系统中的各个节点。可以使用该总线来广播某些状态的改变(比如配置信息发生变更)或其他管理指令,以下是 Bus 适用的场景: 一个事件,需要广播或者单独传递给某个接口。 配置更新了,但是其他系统不知道是否更新。 SpringCloud 默认使用 RabbitMQ 作为消息队列组件。 分布式配置中心 Config 结合 Bus 部署 MQ 服务 这里基于 Docker 部署 RabbitMQ docker pull rabbitmq:management #拉取镜像 docker run -d --hostname rabbit-host --name="myrabbitmq" -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 5672:5672 -p 15672:15672 rabbitmq:3-management 访问控制台 http://192.168.31.210:15672/ config-c....