容器化

什么是容器

可以放很多东西的就是容器,在微服务中,我们可以在容器中放操作系统,放jdk,放我们想要的工具,应用等,一般他们有先后的层级关系,把他们打包到一起形成一个更大的镜像,运行起来就是一个容器。

微服务为什么要容器化

行为标准:容器有标准化行为抽象,以一致的命令运行和管理;
环境一致:镜像使运行时环境一致,可以在任何地方运行;
因为上面的标准和一致性,容器化使开发者专注于应用逻辑和依赖关系,而运营团队专注于部署和管理。也为运维自动化的弹性伸缩,应用自愈打下了基础。
还包括,相比虚拟机更轻,启动速度更快 等方面。
所以说,微服务,容器是天生一对,与持续集成,调度编排等构成了开发运维devops的最佳实践。

容器介绍

容器提供了一种逻辑打包机制,可以脱离实际运行的环境,不管目标环境是私有数据中心的虚拟机,物理机、还是公有云。

容器相关规范和技术:

名称 解释
OCI Open Container Initiative致力于建立一个容器运行时和镜像格式的规范
runC docker 捐赠给 OCI 的一个符合标准的 runtime 实现,起源于libcontainer ,LXC 。使用Linux内核提供的相关隔离技术,比如cgroups,namespace等
containerd 容器运行时管理,用于集成到更上层的系统里,比如Swarm, Kubernetes, Mesos等容器编排系统
CRI kubernetes引入了CRI(Container Runtime Interface),目的在于通过一种标准的方式来集成各种不同容器runtime
CRI-containerd 是基于containerd的CRI实现
Hyper 解决隔离性不强的安全问题,hyper container使用OCI镜像规范,hyper的runtime是基于hypervisor的runV,兼容OCI runtime规范.

容器相关内容:

名称 解释 英文
镜像 文件的层次结构,以及包含如何运行容器的元数据 image
容器 是一个从镜像中启动,包含正在运行的程序的进程 container
仓库 仓库镜像,有公共Docker Hub,私有Harbor registry
容器外的存储 volume
Dockerfile 用于创建镜像的脚本 Dockerfile

有哪些容器的实现:

  • docker
    Docker公司红遍大江南北的docker容器产品,逐渐发展为容器云平台(提供用于构建、发布和运行分布式应用的平台)
  • rocket/rkt
    专为容器设计的操作系统CoreOS,开发的容器引擎Rocket
  • 其它
    OpenVZ/Odin , Hyper

安全对比

名称 docker rkt
镜像安全 默认无签名验证,可设置签名验证 默认强制验证签名
系统安全 Namespace隔离性, Cgroups配额资源限制, Capability权限划分,SELinux/AppArmor访问控制权限 Namespace隔离性, Cgroups配额资源限制,Capability权限划分,SELinux/AppArmor,TPM(Trusted Platform Module)
运行时容器隔离 其他方案和厂家提供 支持KVM虚拟机中运行pod时,基于OS内核级和hypervisor级的隔离,非容器宿主机的cgroups和namespace隔离

docker

构建,运行和操作

Build,Dockerfile文件中的指令详解

  • FROM 镜像基准
  • RUN 镜像的顶层执行任何命令 ,RUN是在build成镜像时就运行的,先于CMD和ENTRYPOINT的,而RUN只在创建镜像时执行一次
  • CMD 启动容器时提供默认命令或参数,会被覆盖
  • ENTRYPOINT 容器启动时执行命令,不会对命令覆盖
  • LABEL 用于为镜像添加元数据,元数以键值对的形式指定,指定后可以通过docker inspect查看
  • EXPOSE 容器在运行时要监听的端口
  • ENV 设置环境变量,供 r un ,cmd, ENTRYPOINT 使用
  • ADD 拷贝到container的文件系统对应的路径 ,支持上面讲到的是远程URL、自动解压这两个特性
  • COPY 仅拷贝
  • VOLUME 挂载点
  • USER RUN指令指定运行用户名或UID
  • WORKDIR 设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录
  • ARG ENV 的效果一样,不同的是,在将来容器运行时是不会存在这些环境变量的
  • ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。
  • STOPSIGNAL 用于设置停止容器所要发送的系统调用信号
  • SHELL 用于设置执行命令(shell式)所使用的的默认shell类型:SHELL在Windows环境下比较有用,Windows下通常会有cmd和powershell两种shell,可能还会有sh。

容器(生命周期管理)交互的命令

  • docker create # 创建一个容器,但不启动它
  • docker run # 创建并启动一个容器
  • docker stop # 停止容器
  • docker start # 启动容器
  • docker restart # 重启容器
  • docker rm # 删除容器
  • docker kill # 给容器发送kill信号
  • docker wait # 阻塞直到容器停止为止
  • docker exec # 在运行的容器中执行一条命令

检查容器

  • docker ps # 显示运行的容器
  • docker inspect # 显示容器信息(包括ip地址)
  • docker logs # 获取容器中的日志
  • docker events # 获取容器事件
  • docker port # 显示容器的公开端口
  • docker top # 显示容器中运行的进程
  • docker diff # 查看容器文件系统中改变的文件
  • docker stats # 查看各种纬度数据、内存、CPU、文件系统等

更多常用命令

分类 命令
生命周期管理 docker [run,start,stop,restart,kill,rm,pause,unpause]
容器检查操作 docker [ps,inspect,top,attach,events,logs,wait,export,port]
容器rootfs命令 docker [commit,cp,diff]
镜像仓库 docker [login,pull,push,search]
本地镜像管理 docker [images,rmi,tag,build,history,save,import]
其他命令 docker [info,version]

docker 技术栈发展

  • Docker machine,Docker compose,Docker Swarm 三大编排工具并称docker三剑客。
    Docker Machine - 轻松部署Docker引擎到不同的平台
    Docker Compose - 定义和运行包含多容器的工具
    Docker Swarm - 原生集群,目前已经由Swarm mode 代替
  • Docker Swarm(过时)
    独立于Docker engine,需要额外的KV存储,没有服务模型
  • Swarmkit(过时)
    独立的、开源的容器编排,没有服务发现、负载均衡和路由功能
  • Swarm mode(当前)
    集成到了Docker engine中,不需要额外的KV存储,支持服务模型(及task概念)以及相应的扩容缩容、服务发现、滚动升级、路由和负载均衡等。
    新的Swarm mode 是在docker 1.12版本中集成到 Docker 引擎中的,引入服务的概念,而不是再以容器作为主要管理对象单元,而是以更符合逻辑的服务为单位进行管理和调度提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得Docker 原生的Swarm mode集群具备与Mesos、Kubernetes叫板的实力。

Swarm Mode API

Swarm的API之上,多提供了两类的API:
集群管理类:

  • init、join、leave
  • token

服务类:

  • get/list
  • create、delete、update
  • inspect、ps

Service

提供了三级的概念:

  • Service:相同功能的一组容器
  • Task:任务调度单元,由Manager生成,同步至Worker
  • Container:Task落地

在Swarm mode里面Service分为两类,一类是有Replicated Service,一类是Global Service。

  • Replicated Service:

    用户指定副本数
    Reconciled:自动确保副本数
    可附加constraint
    
  • Global Service:

    每个节点有且仅有一个容器
    添加加点时自动扩展
    可附加constraint
    

Routing Mesh

Swarm自带的负载均衡,它取的名字叫做Routing Mesh,Service自带的负载均衡是基于LVS,主要有两种模式:

VIP模式:每个服务一个VIP,通过LVS实现;服务名解析至VIP;

DNS模式:服务名解析至容器IP,RoundRobin方式。另外,服务发生变化时,自动调整后端。

Stack

stack是一组相互关联的服务,它们共享依赖关系,并且可以一起orchestrated(编排)和缩放。
Compose使用时,实际上也是在使用堆栈docker stack deploy。 Docker 1.13引入的Docker Compose v3 规范和操作方式。

功能操作方式对比:

命令 Docker Compose v1/v2 Docker 1.13
启动服务 docker-compose up -d docker stack deploy –compose-file=docker-compose.yml ?
伸缩服务 docker-compose scale xxx=n docker service scale xxx=n
停止服务 docker-compose down docker stack rm
跨宿主机

docker常用网络类型

  • host 共享Host network namespace,直接使用host的网络资源进行通信
  • container 新建容器与一个已有的容器共享network namespace,直接使用host的网络资源进行通信
  • none 新建容器有独立的network namespace,但是不会配置任何网络参数
  • bridge 新建容器有独立的network namespace
  • Overlay 是libnetwork默认的multi-host网络模式,通过VxLAN完成跨主机。
  • Flannel k8s的网络,采用L3 Overlay的方式

网络更多请参考:https://www.sdnlab.com/17141.html

微服务容器化需要考虑的问题和方案

  • 合适的大小
    镜像可以选择满足需求的操作系统即可,避免安装不必要的包,可以降低镜像的大小,提高持续集成,部署等的效率。
  • 合适的资源
    容器分配合适的CPU,内存大小,在这个基础上再分配给应用,满足应用运行的前提下,提高资源利用率。
  • 镜像的版本规范
    标准和规范的版本号才能便于使用,如:repo/name:tag
  • 统一的镜像仓库
    使用公共的,或者私有的仓库统一进行镜像管理,也便于持续集成的镜像推送,部署时的镜像查找与选择
  • 日志的收集
    统一日志格式与文件格式,统一采集上报,docker console 就可以不用输出,一般有:fluentd ,ELK等
  • 容器的管理
    容器的日常运维管理一般使用容器管理平台,进行可视化操作
  • 调用编排
    建立集群管理资源,调度到合适的资源,自动伸缩和自愈,这个需要容器调用平台,如swarm mode , k8s等。