自用docker、compose、swarm、hadoop笔记

Docker虚拟化平台 *****
1、容器的概念,他的主要应用场景

概念:
Docker 是一个开源的应用容器引擎 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统的机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统。

应用场景:
1、Web 应用的自动化打包和发布。
2、自动化测试和持续集成、发布。
3、在服务型环境中部署和调整数据库或其他的后台应用。
4、从头编译或者搭建自己的 PaaS 环境。


2、LXC: Linux 容器概念

LXC:Linux 容器,这也是一种操作系统级别的虚拟化技术,允许使用单个 Linux 内核在宿主机上运行多个独立的系统。


3、Docker VS VM对比区别

                            容器技术                                         虚拟机技术

占用磁盘空间            小,几十到几百M                                        非常大,上GB
启动速度                快,几秒钟                                            慢,几分钟
运行形态        直接运行于宿主机的内核上,不同容器共享同一个linux内核        运行于Hypervisior
开发性                    一台宿主机可以启动成千上百个容器                    最多几十个虚拟机
性能                    接近宿主机本地进程                                    逊于宿主机
资源利用率                    高                                                    低

4、Docker文件系统概念

OverlayFS
    OverlayFS 的发展分为两个阶段。2014 年,OverlayFS 第一个版本被合并到 Linux 内核 3.18 版本中,此时的 OverlayFS 在 Docker 中被称为overlay文件驱动。由于第一版的overlay文件系统存在很多弊端(例如运行一段时间后Docker 会报 "too many links problem" 的错误), Linux 内核在 4.0 版本对overlay做了很多必要的改进,此时的 OverlayFS 被称之为overlay2。

overlay2 工作原理
    overlay2 和 AUFS 类似,它将所有目录称之为层(layer),overlay2 的目录是镜像和容器分层的基础,而把这些层统一展现到同一的目录下的过程称为联合挂载(union mount)。overlay2 把目录的下一层叫作lowerdir,上一层叫作upperdir,联合挂载后的结果叫作merged。

AUFS的特点:
    简单的来说,AUFS能将一台机器上的多个目录或文件,以联合的方式提供统一视图进行管理。下面是它的一些特点

Docker AUFS特性
·Docker镜像位于bootfs之上
·每一层镜像的下面一层称之为其父镜像(父子关系)·第一层镜像为Base image
·容器在最顶层
·其下的所有层都为readonly
·Docker将readonly的FS层成为“image”

5、Docker三大核心

容器:Container
镜像:images
仓库:Repositories(公共仓库、私有仓库)

########################################################################################################################################################

Docker镜像管理*****
1、Docker 镜像基础概念特点

概念:
Docker 镜像就是一个只读的模板。含有启动docker容器所需的文件系统结构及其内容。这个文件系统就是rootfs。
例如:一个镜像可以包含一个完整的 CentOS 操作系统环境,里面仅安装了 httpd或用户需要的其它应用程序。
镜像可以用来创建 Docker 容器。

特点:
·分层机制。
·方便管理。
·体积小,直接使得docker在使用中占用资源小。

2、特性:分层 写时复制 内容寻址 联合挂载 本地存储

分层:
Docker镜像采用分层的方式构建,每个镜像都由一系列的“镜像层”组成。分层结构是docker镜像如此轻量的重要原因,当需要修改容器镜像内的某个文件时,只需要对最上方的读写层进行变动,不覆写下层已有的系统文件。

写时复制:
Docker镜像使用写时复制(copy-on-write)策略,在多个容器间共享镜像,每个容器在启动的时候并不需要复制一镜像文件,而是将所有镜像层以只读的方式挂载到一个挂载点,在再上面覆盖一个可读写的容器层。当写入数据时,会把变化的文件内容写到可读写层。

内容寻址:
在dockerl.10版本后,引入一个重要的特性内容寻址存储机制。与之前版本对每一个镜像层随机生成一个UUID不同。新模型对镜像层的内容计算检验和生成一个哈希值,并以此哈希值代替之前的UUID作为镜像层的唯一标志。

联合挂载:
联合挂载(union filesystem)技术可以在一个挂载点同时挂载多个文件系统,将挂载点的原目录与被挂载内容进行整合,使得最终可见文件系统将会包含整合之后的各层的文件和目录。

本地存储:
Docker.镜像通过将镜像文件系统存储于repository(仓库),最后下放到volume(磁盘)存储中。

3、Commit方式制作镜像

docker commit :从容器创建一个新的镜像。

语法:
docker commit [container的ID] [新的image_name]

4、Build方式制作镜像(Dockerfile文件编辑是重点)

通过使用dockerfile可以自定义属于自己的镜像。Dockfile是一种被Docker程序解释的脚本。Dockerfile有自己书写格式和支持的命令,Dockex程序解决这些命令间的依赖关系。Docker程序将读取Dockerfile,根据指令生成定制的image。它明确的表明image是怎么产生的。

Dockerfile 指令选项:
FROM              #指定构建镜像的基础源镜像。
MAINTAINER        #指定创建镜像的用户。
RUN               #是在docker build时执行的命令。
COPY              #复制本地主机文件到镜像中。
ADD               #复制本地主机文件到镜像中,压缩包会被解压。
CMD               #在docker run运行时执行的命令。
EXPOSE            #仅仅只是声明端口。
ENV               #设置环境变量,且只能设置一个。
ENTRYPOINT        #配置容器启动后执行的命令。
VOLUME            #定义匿名数据卷。
WORKDIR           #指定工作目录。
USER              #用于指定执行后续命令的用户和用户组。
ONBUILD           #用于延迟构建命令的执行。

###############################################################################################################################################################

Cgroup资源管理*****

    Docker通过Cgroup 来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制
为什么做资源管理
    当多个容器运行时,防止某容器把所有的硬件都占用

1、容器主机名和启动管理(启动策略重点)

容器主机名
语法:
    docker run -it --name 容器名 -h 主机名 镜像  要执行的命令

启动管理的重启策略
参数:
    --restart=[value] #参数可以指定一个重启策略

Docker容器的重启策略([value])如下:
    no  默认策略,守护进程启动时不自动重新启动容器。
    on-failure[:max-retries] 仅当容器以非零状态退出时才重新启动。[:max-retries]可选项,限制Docker守护进程尝试的重启重试次数。若超过指定次数未能启动容器则放弃。
    always  无论容器的当前状态如何,容器也总是在守护进程启动时启动。
    unless-stopped  容器在守护进程启动之前已被置于停止状态(0),则不在守护进程启动时启动它。
如果创建时未指定重启策略(--restart) 可以用update更新配置

2、CPU控制(权重概念,亲和力)

权重
参数:
    -c, --cpu-shares int   #指定容器所使用的CPU权重值(相对)
    默认每个docker容器的CPU权重值都是1024,在同一个CPU核心上,同时运行多个容器时,容器的CPU加权的效果才能体现出来。

亲和力
taskset 工具:
    -c, --cpu-list       #以列表格式显示并指定CPU
    -p, --pid             #在现有给定pid上运行
    taskset设定CPU亲和力,taskset能够将一个或多个进程绑定到一个或多个处理器上运行。
例1:设置只在cupid是1和2的CPU上运行sshd进程程序(第一个CPU的ID是0以此类推)。
    taskset -cp 1,2 [sshdpid]

3、内存管理

内存限制
参数:
    -m, --memory bytes #限制容器的内存使用大小

例子:
     例1:允许容器使用的内存上限为128M
            docker run -it -m 128m centos bash
     例2:容器只使用2个CPU 核心,只能使用128M内存
            docker run -it --cpuset-cpus 0,1 -m 128m centos

4、I/O控制(硬盘读写通道控制)

参数:
    --device-read-bps list #限制此设备上的每秒读速度
    --device-write-bps list #限制此设备上的每秒写速度

    一台存储给2000台云主机使用,需要控制一下。防止某台云主机吃光你的磁盘I/O资源。

例:
限制容器实例对硬盘的最高写入速度设定为1MB/s
    1、创建容器
    docker run -it --device-write-bps /dev/sda:1mb centos bash
    2、测试容器写速度
    time dd if=/dev/zero of=/mnt/test.out bs=2M count=25 oflag=direct,nonblack

    注:dd参数:
       direct:读写数据采用直接IO方式,不走缓存。直接从内存写硬盘上。
       nonblock:读写数据采用非阻塞IO方式,优先写dd命令的数据

############################################################################################################################################

Docker容器私有仓库搭建*****
1、没有证书的仓库如何使用。(daemon.json:insecure-registries)

修改docker配置文件(/etc/docker/daemon.json),指定docker镜像加速结点为:私有仓库的地址
写入以下内容:
    {
    "insecure-registries": ["192.168.xx.xx:5000"]
    }
insecure-registry不安全的注册。这里的不安全指的是走http协议,要想安全传输镜像,需要使用https协议。我们的私有仓库一般是局域中使用,所以直接使用http协议就可以了。

2、harbor安装使用(过程中docker-compose作用,)启动关闭harbor方法 

安装要求

docker官方要求linux内核版本至少3.8以上,建议3.10以上(ubuntu下要linux内核3.8以上,
RHEL/Centos 的内核修补过, centos6.8的版本就可以——这个可以试试)

安装
-安装文件下载,安装之前确保前置条件是否满足,需要安装docker-compose、docker以及python2.7以上还有openssl
-解压完,进入目录,修改 harbor.cfg
-执行prepare和install脚本

使用
配置docker使用端
修改daemon.json并写入以下内容
     {
          "insecure-registries": [ "192.168.xx.xx" ]
      }

登录harbor默认用户名,密码为 admin/Harbor12345


docker compose作用
-Harbor 的日常运维管理是通过docker-compose来完成的。管理命令需要在harbor安装目录执行
-docker compose是一个工具,这个工具可以通过一个yml文件定义多容器的docker应用,通过一条命令就可以根据yml文件的定义去创建或者管理这多个容器

启动harbor
安装目录下 docker-compose start

关闭harbor
安装目录下 docker-compose stop

3、私有仓库的应用(docker tag , docker login)

Push 镜像到仓库
    1、登录到仓库
docker login 192.168.xx.xx
    2、给镜像打tag标签名称
docker tag SOURCE_IMAGE[:TAG] 原镜像 TARGET_IMAGE[:TAG] 新镜像

#############################################################################################################################################

Docker容器网络和数据存储*****

docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:

单个容器通信:
host 模式,使用 --net=host 指定。 
container 模式,使用 --net=container:NAMEorID 指定。 
none 模式,使用 --net=none 指定。 
bridge 模式,使用 --net=bridge 指定,为docker默认设置。 

多个容器通信:
Overlay模式
Macvlan模式

1、network 常用命令

docker network create        #创建网络
docker network connect       #连接容器网络
docker network disconnect    #断开容器网络
docker network ls            #查看信息列表
docker network inspect       #查看网络信息
docker network prune         #删除所有未使用的网络
docker network rm            #删除网络

2、Docker4种网络模式概念特性。

Bridge桥接模式
        1、Docker Daemon利用veth pair技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0和veth1。而veth pair技术的特性可以保证无论哪一个veth接收到网络报文,都会将报文传输给另一方。
        2、Docker Daemon将veth0附加到Docker Daemon创建的docker0网桥上。保证宿主机的网络报文可以发往veth0
        3、Docker Daemon将veth1添加到Docker Container所属的namespace下,并被改名为eth0。
        容器拥有独立、隔离的网络栈
        容器和宿主机以外的世界通过NAT建立通信

Host模式
        Docker Container与宿主机共享同一个网络环境,即实现host网络模式,其优缺点:
    优势:
        可以直接使用宿主机的IP地址与外界进行通信,若宿主机的eth0是一个公有IP,那么容器也拥有这个公有IP。
        同时容器内服务的端口也可以使用宿主机的端口,无需额外进行NAT转换。
    缺点:
        容器的网络缺少隔离性。
    
None模式
        none模式是指禁用网络功能,只有lo接口,在容器创建时使用,也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

container模式
        Container模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。
        即新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的。

#######################################################################################################################################################

Hadoop大数据*****
1、大数据概念(4v)

大数据本身是一个抽象的概念。从一般意义上讲,大数据是指无法在有限时间内用常规软件工具对其进行获取、存储、管理和处理的数据集合。

目前,业界对大数据还没有一个统一的定义,但是大家普遍认为,大数据具备Volume、Velocity、Variety 和 Value 四个特征,简称“4V”,即
数据体量巨大
数据速度快
数据类型繁多
数据价值密度低

2、hadoop概念作用

概念:
Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构,它可以使用户在不了解分布式底层细节的情況下开发分布式程序,充分利用集群的威力进行高速运算和存储。
从其定义就可以发现,它解決了两大问题:大数据存储、大数据分析。也就是 Hadoop 的两大核心:HDFS 和 MapReduce。

作用:
能搭建大型数据仓库,PB级数据的存储、处理、分析、统计等业务(绝大部分都是从日志分析)

3、hadoop的核心组成

第二代版本核心组件
    MapReduce(计算)
    Yarn(资源调度)
    HDFS(数据存储)
    common(辅助工具)
    
4、计算模块工作原理组成,调度模块工作原理组成,存储模块工作原理组成

计算模块:MapReduce
    Hadoop的MapReduce是对google三大论文的MapReduce的开源实现,实际上是一种编程模型,是一个分布式的计算框架,用于处理海量数据的运算。
    MapReduce将计算过程分为两个阶段:Map和Reduce
        1)Map阶段并行处理输入数据
        2)Reduce阶段对Map结果进行汇总

调度模块:yarn(集群资源管理器):
  Resource Manager:资源调度器,处理客户端请求。
  Node Manager:负责自己本身节点资源管理和使用,定时向RM汇报本节点的资源使用情况,接收并处理来自RM的各种命令:启动Container
  Application Manager:应用程序管理器,每运行一个作业,会生成一个AM,由AM进行管理,并向RM申请资源生成一个或多个container运行任务,并监控container的健康状况。
  container:资源容器,作业在资源容器里面运行,namespace+cgroup

存储模块:HDFS
    HDFS集群分为两大角色:NameNode、DataNode (Secondary NameNode)
    NameNode 存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。
    DataNode 在本地文件系统存储文件块数据,以及块数据的校验和。
    文件会按照固定的大小(blocksize)切成若干块后分布式存储在若干台DataNode上
    每一个文件块可以有多个副本,并存放在不同的DataNode上
    DataNode会定期向NameNode汇报自身所保存的文件block信息,而NameNode则会负责保持文件的副本数量
    HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向NameNode申请来进行
    Secondary NameNode 来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。
    
5、Hadoop完全分布式部署,基本管理命令(容器方式部署)

集群单点启动
    如果集群是第一次启动,需要格式化
        hadoop namenode -format
    启动namenode
        hadoop-daemon.sh start namenode
    启动Datanode
        hadoop-daemon.sh start datanode
    查看
        jps
群起集群
    如果集群是第一次启动,需要格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)
        hdfs namenode -format
    启动HDFS
        start-dfs.sh
    启动YARN(注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动YARN,应该在 ResouceManager所在的机器上启动YARN。)
        start-yarn.sh
    
集群启动停止方式总结
    1、各个服务组件逐一启动/停止 
        a)分别启动/停止HDFS组件 hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode 
        b)启动/停止YARN yarn-daemon.sh start|stop resourcemanager|nodemanager
    
    2、各个模块分开启动/停止(配置ssh是前提)常用 
    a)整体启动/停止HDFS start-dfs.sh / stop-dfs.sh 
    b)整体启动/停止YARN start-yarn.sh / stop-yarn.sh        

###########################################################################################################################################################

Docker-compose容器编排*****
1、docker-compose概念(服务,项目),应用场景

概念:
    Compose 中有两个重要的概念:
        服务(service):一个应用的容器,实际上可以包括若干运行相同或者不同镜像的容器实例。
        项目(project):由一组关联的应用容器(service)组成的一个完整业务单元,在docker-compose.yml中定义

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

2、docker-compose常用命令(up scale)

语法格式:
    docker-compose [options] [COMMAND] [ARGS...]
        选项 [options] 
        -- verbose         输出更多执行信息。
        -f,  --file FILE     使用特定的compose模板文件,默认为docker-compose.yml。
        -p,  --project-name NAME     指定项目名称,默认使用目录名称。
        -v, --version               显示版本信息
        build       Build or rebuild services (构建项目中build指定的dockerfile的服务容器)
        config     Validate and view the Compose file (验证并查看Compose文件)
        create     Create services (为服务创建容器)
        down      Stop and remove containers,networks,images,and volumes(停止容器并删除容器,网络,卷和图像)
        events    Receive real time events from containers (从容器接收实时事件)
        exec       Execute a command in a running container (在运行的容器中执行命令)
        help       Get help on a command (获得一个命令的帮助)
        images   List images (显示镜像列表)
        kill         Kill containers (强制停止运行的容器)
        logs       View output from containers (查看容器的日志输出)
        pause    Pause services (暂停一个容器)
        port      Print the public port for a port binding (打印某个容器端口所映射的公共端口)
        ps               List containers (列出项目中目前所有的容器)
        pull             Pull service images (拉取服务依赖镜像)
        push           Push service images (推送服务镜像)
        restart        Restart services (重启项目中的服务)
        rm               Remove stopped containers (删除所有停止状态的服务容器)
        run              Run a one-off command (在服务上运行一个一次性命令)
        scale            Set number of containers for a service (设置指定服务执行的容器个数)
        start             Start services (启动已存在的服务容器)
        stop             Stop services (停止已存在的服务容器)
        top               Display the running processes (显示容器正在运行的进程)
        unpause       Unpause services (恢复处于暂停状态的容器)
        up                 Create and start containers (根据yml文件创建并启动容器)
        version         Show the Docker-Compose version information (输出版本)


3、ymal(docker-compose.yml)语法,编写

基本语法:
    大小写敏感
    使用缩进表示层级关系
    缩进不允许使用tab,只允许空格
    缩进的空格数不重要,只要相同层级的元素左对齐即可
    '#'表示注释


Docker swarm容器编排*****
1、swarm概念特点,应用场景

概念:
    Docker Compose是一个在单个服务器或主机上创建多个容器的工具;
    节点分为管理(manager)节点和工作(worker)节点;
    任务(Task)是Swarm中的最小的调度单位,目前来说就是一个单一的容器;
    服务(Service)是指一组任务的集合,服务定义了任务的属性。

特点:
    Swarm mode内置Key-value数据库存储功能,提供了众多的新特性,比如具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。

应用场景:
    管理多台物理机上的多台容器

2、swarm与docker-compose及k8s的区别

Docker-Compose
    Docker-Compose 是用来管理你的容器的,有点像一个容器的管家,想象一下当你的Docker中有成百上千的容器需要启动,如果一个一个的启动那得多费时间。有了Docker-Compose你只需要编写一个文件,在这个文件里面声明好要启动的容器,配置一些参数,执行一下这个文件,Docker就会按照你声明的配置去把所有的容器启动起来,但是Docker-Compose只能管理当前主机上的Docker,也就是说不能去启动其他主机上的Docker容器
Docker Swarm
    Docker Swarm 是一款用来管理多主机上的Docker容器的工具,可以负责帮你启动容器,监控容器状态,如果容器的状态不正常它会帮你重新帮你启动一个新的容器,来提供服务,同时也提供服务之间的负载均衡,而这些东西Docker-Compose 是做不到的
Kubernetes
    Kubernetes它本身的角色定位是和Docker Swarm 是一样的,也就是说他们负责的工作在容器领域来说是相同的部分,当然也有自己一些不一样的特点。这个就像是Eclipse和IDEA一样,也是一个跨主机的容器管理平台。它是谷歌公司根据自身的多年的运维经验研发的一款容器管理平台。而Docker Swarm则是由Docker 公司研发的。

总结:
    Docker是容器技术的核心、基础,Docker Compose是一个基于Docker的单主机容器编排工具,功能并不像Docker Swarm和Kubernetes是基于Dcoker的跨主机的容器管理平台那么丰富。
    
    
3、swarm集群概念(节点(Manager、worker) 服务 任务)和优点

节点:
    节点:一个节点是docker集群的一个安装有docker的物理计算机或云服务器。
        Manager管理器节点
            Manager:接收客户端服务定义(命令),将任务发送到worker节点;维护集群期望状态和集群管理功能及Leader选举。默认情况下manager节点也会运行任务,也可以配置只做管理任务。
        worker工作节点
            接收并执行从管理节点分配的任务,并报告任务当前状态,以便管理节点维护每个服务期望状态。
    服务:
        服务(Service)是指一组任务的集合,服务定义了任务的属性
    任务:
        任务(Task)是Swarm中的最小的调度单位,目前来说就是一个单一的容器
        
集群的优点:
    Docker Swarm采取集群管理,统一部署
    弹性伸缩:可以通过策略的方式随意增加、删减容器数量
多主机网络:Swarm内置多主机网络,实现多主机中的容器间互通。(overlay网络)
服务发现:可以通过Swarm内置的DNS服务器的功能查询集群中每个运行的容器。
负载均衡:实现服务副本负载均衡,提供入口访问。也可以将服务入口暴露给外部负载均衡器再次负载均衡。
滚动更新:升级时,逐步将应用服务更新到节点,如果出现问题,可以将任务回滚到先前版本
安全传输:Swarm中的每个节点使用验证方式加入集群,确保安全的和其他节点通信

4、swarm集群搭建,Swarm集群管理命令(swarm node service)

Swarm:
    docker swarm [COMMAND]
        init                  初始化集群环境
        join                 节点加入集群环境
        join-token       查看加入环境的识别字符串
        leave               脱离集群

Node:
    docker node [COMMAND]
        demote           降级节点权限
        inspect            查看节点详细信息
        ls                     查看节点列表
        promote          升级节点权限
        ps                     列举节点运行的任务
        rm                    删除无效的节点
        update             更新节点信息
Service:
    docker service [COMMAND]
        create                     创建新的容器服务集群
        Inspect                   查看容器服务详细信息
        logs                        查看服务运行日志
        ls                            查看服务列表
        ps                           查看服务运行情况
        rm                          删除容器服务集群
        scale                       修改容器服务副本个数
        update                   更新服务参数

##################################################################################################################################################

上一篇:11 Docker Swarm


下一篇:Docker Swarm 认识与使用