zoukankan      html  css  js  c++  java
  • docker1

    一、docker 简介

    1.1 docker的组成

    官网:https://docs.docker.com/engine/docker-overview/

    docker主机(host):一个物理机或虚拟机,用于运行docker服务进程和容器

    docker服务端(server):docker守护进程,运行docker容器。

    docker客户端(client):客户端使用docker命令或其他工具调用dockerAPI

    docker仓库(Registry):保存镜像的仓库,类似于git或svn这样的版本控制系统。官方仓库:https://hub.docker.com/

    docker镜像(images):镜像可以理解为创建实例使用的模板

    docker容器(container):容器是从镜像生成对外提供服务的一个或一组服务

    1.2:docker对比虚拟机

    1、资源利用率更高:一 台物理机可以运行数百个容器,但是般只能运行数十个虚拟机 。

    2、开销更小:不需要启动单独的 虚拟机 占用硬件资源。

    3、启动速度更快:可以在数秒内完成启动

    1.3:docker的底层隔离实现技术

    1.3.1:Linux Namespace

    namespace 是 Linux系统的底层概念,系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内 ,各个docker容器运行在同一个docker 主进程并且共用同一个宿主机系统内核 ,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间 ,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络进程等,目前主要通过以下技术实现容器运行空间的相互隔离:

    目前Linux中提供了六类系统资源的隔离机制,分别是:

    Mount: 隔离文件系统挂载点。Mount Namespace用来隔离文件系统的挂载点,不同Mount Namespace的进程拥有不同的挂载点,同时也拥有了不同的文件系统视图。

    宿主机是使用了chroot技术把容器锁定到一个指的运行目录里面。例如上图中:/var/lib/containerd/io.containerd.runtime.v1.linux/moby/容器ID

    UTS: 隔离主机名和域名信息。由于主机名和域名可以用来代替IP地址,如果没有这一层隔离,同一主机上不同的容器的网络访问就可能出问题。UTS Namespace提供了主机名和域名的隔离,也就是struct utsname里的nodenamedomainname两个字段。不同Namespace中可以拥有独立的主机名和域名。

     默认容器ID,一般不建议去改,容器访问不是通过主机名访问,不利于横向扩展。

    IPC: 隔离进程间通信。IPC Namespace是对不同容器跨容器进程间通信的隔离,进程间通信常见的方法有信号量、消息队列和共享内存。IPC Namespace要达到的目标是相同的标识符在不同的Namepspace中代表不同的通信介质(比如信号量、消息队列和共享内存)。

    PID: 隔离进程的ID。PID Namespace对进程PID重新标号,即不同的Namespace下的进程可以有同一个PID。新创建的PID Namespace中的第一个进程PID为1,成为新Namespace的systemd进程。一个 容器内的进程间通信 ,允许 一个 容器内的不同进程 的(内存 、缓存等 )数据访 问,但是不能夸容器访问其他 容器的数据 。

      

      

    容器内核版本高于宿主机内核版本,容器内的命令照样可以运行,因为是基于二进制文件,只要cpu可以解析二进制文件即可,另外官方也有考虑。

    Network: 隔离网络资源。不同Namespace种可以拥有独立的网络资源,包括网络设备(网卡、网桥)、IPV4或IPV6协议栈、路由表、防火墙、端口等信息。如果需要打通不同Namespace的通信,可以通过创建vnet pair虚拟网络设备对的形式。

    容器内网卡显示

    宿主机网卡信息

     网桥信息

    开启:net.ipv4.ip_forward = 1跨网段

     iptables

     

    网络拓扑图:

    User: 隔离用户和用户组的ID。·一个普通进程(Namespace外面的用户ID非0)在Namespace里面的用户和用户组ID可以为0,换句话说这个普通进程在Namespace里面可以拥有root特权的权限。

    涉及到Namespace的操作接口包括clone()setns()unshare()以及还有/proc下的部分文件。可以通过clone系统调用来创建一个独立Namespace的进程,setns()函数可以把进程加入到指定的Namespace中,unshare()系统调用用于将当前进程和所在的Namespace分离,并加入到一个新的Namespace中,相对于setns()系统调用来说,unshare()不用关联之前存在的Namespace,只需要指定需要分离的Namespace就行,该调用会自动创建一个新的Namespace。通过/proc文件查看进程所属的namespace。

    1.3.2:Linux control groups

    Cgroups全称Control Groups,是Linux内核提供的物理资源隔离机制,通过这种机制,可以实现对Linux进程或者进程组的资源限制、隔离和统计功能。它最主要的作用, 就是限制一个进程组能够使用的资源上,包括 CPUCPU 、内存磁盘网络带宽等。此外,还能够对进程行优先级设置以及将挂起和恢复操作

     groups中内存模块:

    查看系统cgroups:

    root@ubuntu:~# ll /sys/fs/cgroup/
    total 0
    drwxr-xr-x 15 root root 380 Feb 15 11:06 ./
    drwxr-xr-x 10 root root   0 Feb 15 11:06 ../
    dr-xr-xr-x  5 root root   0 Feb 15 11:06 blkio/      #块设备IO限制
    lrwxrwxrwx  1 root root  11 Feb 15 11:06 cpu -> cpu,cpuacct/  #使用调度程序为 cgroup任务提供cpu的访问
    lrwxrwxrwx  1 root root  11 Feb 15 11:06 cpuacct -> cpu,cpuacct/  #产生cgroup任务的cpu资源报告
    dr-xr-xr-x  5 root root   0 Feb 15 11:06 cpu,cpuacct/
    dr-xr-xr-x  3 root root   0 Feb 15 11:06 cpuset/  #如果是多核心的cpu,这个子系统会为cgroup任务分配单独的任务分配单独的cpu和内存。
    dr-xr-xr-x  5 root root   0 Feb 15 11:06 devices/  #允许或拒绝cgroup任务对设备的访问
    dr-xr-xr-x  3 root root   0 Feb 15 11:06 freezer/ #暂停和恢复cgroup任务
    dr-xr-xr-x  3 root root   0 Feb 15 11:06 hugetlb/
    dr-xr-xr-x  5 root root   0 Feb 15 11:06 memory/  #设置每个cgroup的内存限制以及产生资源报告
    lrwxrwxrwx  1 root root  16 Feb 15 11:06 net_cls -> net_cls,net_prio/ #标记每个网络包以供cgroup方便使用
    dr-xr-xr-x  3 root root   0 Feb 15 11:06 net_cls,net_prio/
    lrwxrwxrwx  1 root root  16 Feb 15 11:06 net_prio -> net_cls,net_prio/
    dr-xr-xr-x  3 root root   0 Feb 15 11:06 perf_event/  #增加了对每group的 、监测跟踪能力,可以属于某个特定的group的所有线程以及运行在特定CPU上的线程
    dr-xr-xr-x  5 root root   0 Feb 15 11:06 pids/
    dr-xr-xr-x  2 root root   0 Feb 15 11:06 rdma/
    dr-xr-xr-x  6 root root   0 Feb 15 11:06 systemd/
    dr-xr-xr-x  5 root root   0 Feb 15 11:06 unified/

    1.4:容器管理工具

    1.4.1:docker

    Docker启动一个容器也需要一个外部模板但是较多镜像, docker的镜像可以 保 存在一 个公共的地方享使用, 只要 把镜像下载来就可以使用 ,最主要的是可以在镜像基础之上做自定义配置 并且 可以 再把其提交 为一个镜像 ,可以被 启动 为多个容器。

    Docker的镜像是分层,镜像底层为库文件且只读层即不能写入也不能删除数据,从镜像加载启动为一个容器后会生成一个可写层,其写入的数据会复制到容器目录 ,但是容器内的数据在删除后也会被随之删除。

    容器内文件显示:

    宿主机文件显示:

     

      

     1.4.2:pouch

    https://www.infoq.cn/article/alibaba-pouch

    https://github.com/alibaba/pouch
    1.5:docker(容器)的核心技术

    容器 runtime:

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

    目前主流的三种 runtime:

    Lxc:linux上早期的runtime ,Docker早期 就是采用 lxc作为runtime。
    runc :目前 Docker默认的runtime 。
    rkt:是 CoreOS开发的容器runtime,也符合OCI规范,所以使用rktruntime也可以运行 Docker容器

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

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

    容器定义工具:容器定义工具允许用户容器的属性和内容,以方便容器能够被保存、共享和重建 。

    Docker image :是docker容器 的模板, runtime依据 docker image创建容器。

    Dockerfile :包含 N个命令的文本文件,通过 dockerfile创建出 docker image。

    Registry:统一 保存镜像而且是多个不同镜像版的地方叫做镜像仓库 。

    Docker hub:docker官方的公共仓库 ,已经保存了大量的常用镜像,可以方便大家直接使用。

    Harbor:vmware提供的自带 web界面自带认证功能的镜像仓库,目前的镜像仓库,目前有很多公司在使用。

    编排工具:

    Kubernetes:google领导开发的容器编排引擎 ,内部项目为Borg,且其同时支持 docker和 CoreOS。

  • 相关阅读:
    WCF中的序列化[下篇]
    WCF中的序列化[上篇]
    SET TRANSACTION ISOLATION LEVEL 详解
    深入探讨数据仓库建模与ETL的实践技巧
    用SQL语句添加删除修改字段等操作
    WCF数据契约与序列化
    在SQL Server中使用检查约束来验证数据
    C#线程同步的几种方法[转]
    Linq的Join用法
    测试wlm代码高亮插件
  • 原文地址:https://www.cnblogs.com/lummg-DAY/p/12314083.html
Copyright © 2011-2022 走看看