zoukankan      html  css  js  c++  java
  • Docker容器技术概览

                          Docker容器技术概览

                                         作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

    一.Docker容器的优缺点

    1>.Docker的优势

      快速部署:
        短时间内可以部署成百上千个应用,更快速交付到线上 。
      高效虚拟化:
        不需要额外的hypervisor支持,直接基于linux实现应用虚拟化,相比虚拟机大幅提高性能和效率。
      节省开支:
        提高服务器利用率,降低IT支出。
      简化配置:
        将运行环境打包保存至容器,使用时直接启动即可。
      快速迁移和扩展:
        可跨平台运行在物理机,虚拟公有云等环境,良好的兼容性可以方便将应用从A宿主机迁移到B宿主机,甚至是A平台迁移到B平台。

    2>.Docker的劣势

      隔离性:
        各应用之间的隔离不如虚拟机彻底,因为同一台宿主机所有Docker的容器公用宿主机内核。

    二.Docker容器的核心技术刨析

    1>.容器规范

      除了docker自带的docker容器管理技术,还有CentOS的rkt,还有阿里的Pouch,为了保证容器生态的标准性和健康可持续发展,包括Linux基金会,Docker,微软,红帽,谷歌和IBM等公司在2015年6月共同成立了一个叫open container(OCI)的组织,其目的就是制定开放标准容器规范。
    
      OCI一共发布了两个规范,发布了两个规范,分别是 分别是runtime spec和 image format spec。有了这两个规范,不同的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互可操作性。 

    2>.容器runtime

      runtime是真正运行容器的地方。因此为了运行不同的容器,runtime需要和操作系统内核紧密合作以便为容器提供相应的运行环境。

      目前主流的三种runtime:
        lxc:
          Linux上早期的runtime,Docker早期就是采用lxc作为runtime。
        runc:
          目前Docker默认的runtime,runc遵守OCI规范,因此可以兼容lxc,目前runc已经是docker生成环境使用的标准,包括阿里巴巴开源的pouch也是使用的runc。
        rkt:
          是CentOS开发的容器runtime,也符合OCI规范,所以使用rktruntime也可以运行Docker容器。
    root@docker101:~# hostname
    docker101.yinzhengjie.org.cn
    root@docker101:~# 
    root@docker101:~# uname -r
    4.15.0-74-generic
    root@docker101:~# 
    root@docker101:~# uname -m
    x86_64
    root@docker101:~# 
    root@docker101:~# docker info                                           #注意观察"Default Runtime"对应的值为"runc"
    Client:
     Debug Mode: false
    
    Server:
     Containers: 2
      Running: 2
      Paused: 0
      Stopped: 0
     Images: 2
     Server Version: 19.03.5
     Storage Driver: overlay2
      Backing Filesystem: extfs
      Supports d_type: true
      Native Overlay Diff: true
     Logging Driver: json-file
     Cgroup Driver: cgroupfs
     Plugins:
      Volume: local
      Network: bridge host ipvlan macvlan null overlay
      Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
     Swarm: inactive
     Runtimes: runc
     Default Runtime: runc
     Init Binary: docker-init
     containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
     runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
     init version: fec3683
     Security Options:
      apparmor
      seccomp
       Profile: default
     Kernel Version: 4.15.0-74-generic
     Operating System: Ubuntu 18.04.3 LTS
     OSType: linux
     Architecture: x86_64
     CPUs: 2
     Total Memory: 3.83GiB
     Name: docker101.yinzhengjie.org.cn
     ID: H7TH:LMVR:XQ66:F3JN:ALFO:2XKR:6W7W:MIRF:ZY6K:QAPJ:ZCA7:GD4B
     Docker Root Dir: /var/lib/docker
     Debug Mode: false
     Registry: https://index.docker.io/v1/
     Labels:
     Experimental: false
     Insecure Registries:
      127.0.0.0/8
     Registry Mirrors:
      https://tuv7rqqq.mirror.aliyuncs.com/
     Live Restore Enabled: false
    
    WARNING: No swap limit support
    root@docker101:~# 
     
    root@docker101:~# docker info                          #注意观察"Default Runtime"对应的值为"runc"
    [root@docker201.yinzhengjie.org.cn ~]# cat /etc/redhat-release 
    CentOS Linux release 7.6.1810 (Core) 
    [root@docker201.yinzhengjie.org.cn ~]# 
    [root@docker201.yinzhengjie.org.cn ~]# uname -r
    3.10.0-957.el7.x86_64
    [root@docker201.yinzhengjie.org.cn ~]# 
    [root@docker201.yinzhengjie.org.cn ~]# uname -m
    x86_64
    [root@docker201.yinzhengjie.org.cn ~]# 
    [root@docker201.yinzhengjie.org.cn ~]# pouch info              #注意观察"Default Runtime"的属性值
    Containers: 0
     Running: 0
     Paused: 0
     Stopped: 0
    Images: 0
    ID: 
    Name: docker201.yinzhengjie.org.cn
    Server Version: 1.3.0
    Storage Driver: overlayfs
    Driver Status: []
    Logging Driver: json-file
    Volume Drivers: [local tmpfs]
    Cgroup Driver: cgroupfs
    Default Runtime: runc
    Runtimes: runc
    runc: <nil>
    containerd: <nil>
    Security Options: [seccomp selinux]
    Kernel Version: 3.10.0-957.el7.x86_64
    Operating System: "CentOS Linux 7 (Core)"
    OSType: linux
    Architecture: amd64
    HTTP Proxy: 
    HTTPS Proxy: 
    Registry: https://index.docker.io/v1/
    Experimental: false
    Debug: false
    Labels:
      node_ip=192.168.6.201
      SN=VMware-56
    CPUs: 2
    Total Memory: 3.683GiB
    Pouch Root Dir: /var/lib/pouch
    LiveRestoreEnabled: true
    LxcfsEnabled: false
    CriEnabled: false
    Daemon Listen Addresses: [unix:///var/run/pouchd.sock]
    [root@docker201.yinzhengjie.org.cn ~]# 
    
    [root@docker201.yinzhengjie.org.cn ~]# pouch info              #注意观察"Default Runtime"的属性值
    [root@docker201.yinzhengjie.org.cn ~]# pouch info              #注意pouch观察"Default Runtime"的属性值为"runc"

    3>.容器管理工具

      管理工具连接runtime与用户,对用户提供图形或命令方式操作,然后管理工具将用户操作传递给runtime执行。

      lxc是lxd的管理工具。

      runc的管理工具是docker engine,docker engine包含后台deamon和cli两部分,大家经常提到的docker就是指的docker engine。

      rkt的管理该工具就是rkt cli。
    root@docker101:~# docker version
    Client: Docker Engine - Community
     Version:           19.03.5
     API version:       1.40
     Go version:        go1.12.12
     Git commit:        633a0ea838
     Built:             Wed Nov 13 07:29:52 2019
     OS/Arch:           linux/amd64
     Experimental:      false
    
    Server: Docker Engine - Community
     Engine:
      Version:          19.03.5
      API version:      1.40 (minimum version 1.12)
      Go version:       go1.12.12
      Git commit:       633a0ea838
      Built:            Wed Nov 13 07:28:22 2019
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          1.2.10
      GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
     runc:
      Version:          1.0.0-rc8+dev
      GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
     docker-init:
      Version:          0.18.0
      GitCommit:        fec3683
    root@docker101:~# 
    root@docker101:~# 
    root@docker101:~# docker version

    4>.容器定义工具

      容器定义工具允许用户定义容器的属性和内容,以方便容器能够被保存,共享和重建。
    
      docker image:
        是docker容器的模板,runtime依据docker image创建容器。
    
      dockerfile:
        包含N个命令的文本文件,通过docker创建出docker image。
    
      ACI(App container image):
        与docker image类似,是CentOS开发的rkt容器的镜像格式。

    5>.Registry

      统一保存镜像而且是多个不同镜像版本的地方,叫做镜像仓库。
    
      Image registry:
        docker官方提供私人仓库部署工具,由于它没有提供友好的管理界面,因此使用的人较少,生产环境中更多人愿意使用Harbor。
    
      Docker hub:
        docker官方的公共仓库,已经保存了大量常用镜像,可以方便大家直接使用。
    
      Harbor:
        vmware提供的自带web界面自带认证功能的镜像仓库,目前很多公司使用。

    6>.编排工具

      当多个容器在多个主机运行的时候,单独管理容器是相当复杂而且很容易出错,而且也无法实现动态伸缩的功能。

      因此需要有一种工具可以实现统一管理,动态伸缩,故障自愈,批量执行等功能,这就是容器编排引擎。
      容器编排通常包括容器管理,调度,集群定义和服务发现等功能,常见的容器编排工具如下:     Docker swarm:       docker开发的容器编排引擎,目前使用较少。     Kubernetes:       Google领导开发的容器编排引擎,内部项目为Borg,且其同时支持docker,CoreOS和pouch。目前是主流,它已经击败了"Docker swarm"和"Mesos+Marathon"的使用量。     Mesos
    +Marathon:       通用的集群资源调度平台,mesos(资源分配)与marathon(容器编排平台)一起提供容器编排引擎功能,目前使用较少。

     

    三.Docker容器所依赖的技术刨析

    1>.容器网络

      docker自带的网络docker network仅支持管理单机上的容器网络,当多主机运行的时候需要使用第三方开源网络,例如calico,flanel等。

    2>.服务发现

      容器的动态扩容性决定了容器IP也会随之变化,因此需要有一种机制开源自动识别并将用户请求动态转发到新创建的容器上,kubernetes自带服务发现功能,需要结合kube-dns服务解析内部域名。

    3>.容器监控

      开源通过原生命令"docker ps/top/stats"等命令查看容器运行状态,另外也可以使用heapster/Prometheus等第三方监控容器的运行状态。

    4>.数据管理

      容器的动态迁移会导致其在不同的HOST之间迁移,因此如何保证与容器相关的数据也能随时迁移或随时访问,开源使用逻辑卷/存储挂载等方式解决。

    5>.日志收集

      docker原生的日志查看工具docker logs,但是容器内部的日志需要通过ELK等专门的日志收集分析和展示工具进行处理。
  • 相关阅读:
    网页尺寸scrollHeight
    浏览器窗口可视区域大小
    创建文本节点createTextNode
    创建元素节点createElement
    faster rcnn需要理解的地方
    3d点云
    多维的vector定义和初始化
    写代码的可扩展性
    1111
    tmux命令
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/12185520.html
Copyright © 2011-2022 走看看