容器技术基础原理

chroot

      chroot是linux系统的一个操作,针对正在运行的软件的进程和它的子进程。

      一个运行在这个环境下经由chroot设置根目录的程序,它不能够对这个指定的根目录之外的文件进行读取更不能进行修改

      chroot 就是可以改变某进程的根目录,使这个程序不能访问目录之外的其他目录

      chroot /home/admin/rootfs  /bin/bash   启动一个sh进程,并且把 /home/centos/rootfs 作为 sh 进程的根目录

镜像

       它是一个只读的文件和文件夹组合.它包含了容器运行时所需要的所有基础文件和配置信息,是容器启动的基础.所以想启动一个容器,那首先必须要有一个镜像

        镜像是一个特殊的文件系统,它提供了容器运行时所需的程序、软件库、资源、配置等静态数据。即镜像不包含任何动态数据,镜像内容在构建后不会被改变

容器

     镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态

     云原生的代表技术包括容器,服务网格,微服务,不可变基础设施和声明式API

     可变的基础设施

           软件开发完成后,需要工程师或管理员通过SSH 连接到他们的服务器上,然后进行一些脚本安装、deb/rpm 包的安装工作,并逐个机器地调整对应的配置参数及文件。后续还会根据需要对该环境进行不断更改,比如 kernel 升级、配置更新、打补丁等

     不可变基础设施

        不可变基础设施部署完成以后,便成为一种只读状态,不可对其进行任何更改。如果需要更新或修改,就使用新的环境或服务器去替代旧的。不可变基础设施带来了更一致、更可靠、更可预测的设计理念,可以缓解或完全避免可变基础设施中遇到的各种常见问题

       借助容器技术我们可以自动化地构建出不可变的、可版本化管理的、可一致性交付的应用服务体系,这里包括了标准化实例、运行环境等

 容器单进程模式     

     容器实际上是一个“单进程”的模型。因为如果你在容器里启动多个进程,这将会带来很多麻烦。不仅它们的日志记录会混在一起,它们各自的生命周期也无法管理。
     只有一个进程的PID可以为 1,如果PID为1的进程这个时候挂了,或者说失败退出了,那么其他几个进程就会自然而然地成为“孤儿”,无法管理,也无法回收资源

docker名称空间隔离

    pid namespace:用于隔离进程 ID

    net namespace:隔离网络接口,在虚拟的 net namespace 内用户可以拥有自己独立的 IP、路由、端口等

    mnt namespace:文件系统挂载点隔离

    ipc namespace:信号量,消息队列和共享内存的隔离

    uts namespace:主机名和域名的隔离         

docker容器进程架构

      

     runC是 Docker 官方按照 OCI 容器运行时标准的一个实现.通俗地讲runC 是一个用来运行容器的轻量级工具,是真正用来运行容器的

    containerd是 Docker 服务端的一个核心组件,它是从dockerd中剥离出来的 ,它的诞生完全遵循 OCI 标准,是容器标准化后的产物.containerd通过 containerd-shim 启动并管理 runC,可以说containerd真正管理了容器的生命周期

    containerd-shim的主要作用是将 containerd 和真正的容器进程解耦,使用 containerd-shim 作为容器进程的父进程,从而实现重启 containerd 不影响已经启动的容器

    dockerd 启动的时候,containerd 就随之启动了,dockerd与containerd一直存在。当执行docker run命令通过 busybox 镜像创建并启动容器时,containerd 会创建 containerd-shim 充当 “垫片” 进程

busybox 是一个集成了数百个 Linux 命令(例如 curl、grep、mount、telnet 等)的精简工具箱,只有几兆大小,被誉为 Linux 系统的瑞士军刀。我经常会使用 busybox 做调试来查找生产环境中遇到的问题

docker镜像构成原理

    Dockerfile 的每一行命令都会生成一个独立的镜像层,并且拥有唯一的ID
    Dockerfile 的每一行命令,都生成了一个镜像层,每一层的 diff 夹下只存放了增量数据
分层的结构使得 Docker 镜像非常轻量,每一层根据镜像的内容都有一个唯一的 ID 值,当不同的镜像之间有相同的镜像层时,便可以实现不同的镜像之间共享镜像层的效果
   镜像的实现原理:
        镜像是由一系列的镜像层(layer )组成,每一层代表了镜像构建过程中的一次提交,当我们需要修改镜像内的某个文件时,只需要在当前镜像层的基础上新建一个镜像层,并且只存放修改过的文件内容。分层结构使得镜像间共享镜像层变得非常简单和方便

   

容器的操作 

       docker run -it --name=busybox busybox

       1.使用busybox镜像创建并启动一个容器

       2.分配文件系统,并在镜像只读层外创建一个读写层

       3.从Docker IP池中分配一个IP

       4.执行用户的启动命令运行镜像

   

容器的停止

     

     容器的1号进程是不能被退出的,如果容器中的1号进程被杀死 那么容器也会被杀死

Docker仓库

        注册服务器(Registry)和仓库(Repository)的区别

        注册服务器是存放仓库的实际服务器,而仓库则可以被理解为一个具体的项目或者目录。注册服务器可以包含很多个仓库,每个仓库又可以包含多个镜像

        镜像地址为 docker.io/centos,docker.io 是注册服务器,centos 是仓库名

 Dockerfile优化

         

                               

原文地址:https://www.cnblogs.com/yxh168/p/13614135.html