zoukankan      html  css  js  c++  java
  • kata 虚拟机 libcontainer

    单个容器

    root@25a725e7599e:/# ls
    bin dev home lost+found mnt proc run srv tmp var
    boot etc lib media opt root sbin sys usr
    root@25a725e7599e:/# ls var/
    backups lib local lock mail opt run spool tmp
    root@25a725e7599e:/# ls var/lib/docker/container/
    ls: cannot access 'var/lib/docker/container/': No such file or directory
    root@25a725e7599e:/# find ./ -name container
    ./run/kata-containers/shared/containers/ef4b70596e0b829af5fd9f14343f2c92a8da3d0d22ea1f23e83b14384fa4f1cc-da0bf2558a65810c-containerdir/go/src/container
    ./run/kata-containers/shared/containers/ef4b70596e0b829af5fd9f14343f2c92a8da3d0d22ea1f23e83b14384fa4f1cc-da0bf2558a65810c-containerdir/go/pkg/linux_arm64/container
    ./run/kata-containers/shared/containers/ef4b70596e0b829af5fd9f14343f2c92a8da3d0d22ea1f23e83b14384fa4f1cc/rootfs/containerdir/container
    ./sys/devices/system/container
    ./sys/bus/container
    root@25a725e7599e:/# ip netns list
    root@25a725e7599e:/#

    双容器

    root@25a725e7599e:/# ls
    bin   dev  home  lost+found  mnt  proc  run   srv  tmp  var
    boot  etc  lib   media       opt  root  sbin  sys  usr
    root@25a725e7599e:/# ip netns ls
    root@25a725e7599e:/# ls
    bin   dev  home  lost+found  mnt  proc  run   srv  tmp  var
    boot  etc  lib   media       opt  root  sbin  sys  usr
    root@25a725e7599e:/# ls var/
    backups  lib  local  lock  mail  opt  run  spool  tmp
    root@25a725e7599e:/# ls var/run
    kata-containers  libcontainer  lock  mount  sandbox-ns  systemd

    libcontainer实现原理

    1、使用工厂Factory和容器配置container

    libcontainer中的factory是创建一个逻辑概念上的“容器对象”,他并不是运行的容器,而只是包含又namespace和cgroups配置参数等的逻辑概念上的容器。

    Factory创建容器的分为三步:

    第一步,验证容器参数的合法性,即:容器的启动目录(/var/lib/docker/container),容器ID,容器配置三者的合法性。

    第二步,验证将要上传容器ID和现有运行容器ID之间没有冲突。

    第三步,在根目录下创建(/var/lib/docker/container/{ContainerID})容器的工作目录

    第四步,返回一个Container对象,此对象包含容器ID、容器工作目录、容器配置、初始化指令和参数,以及cgroup管理器等。

    此时,如果执行完上述的步骤,表明容器已经创建完。

    2、启动逻辑容器container

    在此过程中主要是创建两个实例:

    (1)process

    上述第一步创建过程中,即:process过程

    (2)parentprocess

    第一步:创建一个管道,以后与外部进程通信

    第二步:根据逻辑容器创建一个进程启动的cmd对象,此对象是从容器中获取命令执行的参数(命令路径、命令参数、输入和输出、执行命令的根目录和进程管道pipe等)

    第三步:为cmd对象添加一些环境变量

    第四步:配置容器启动的namespace,表明容器是在哪个命名空间下启动的。

    第五步:将container中的容器配置和Process中的entrypoint信息合并为一份容器配置并加入到ParentProcess中。

    3、用逻辑容器创建物理容器

    第一步:Docker daemon利用exec包执行initProcess.cmd,起作用是初始化一个namespace

    第二步:把容器进程dockerinit 的PID加入到cgroup中管理

    第三步:创建容器内部的网络设备,包括lo和veth

    第四步:通过管道发送容器配置信息给容器进程dockerinit

    第五步:dockerinit 根据接收到的容器配置信息启动容器

    4、Docker daemon 与容器之间的通信

    docker daemon与容器之间的通信方式采用的文件和文件描述符,具体实现是:

    pipe(int fd[2])创建管道 fd[1]端写入数据, fd[0]端读物数据

    调用pipe函数时,创建的子进程会内嵌这个打开的文件描述符,对fd[1]写入数据后可以在fd[0]端读取,这样通过管道父子进程之间就可以通信了,最后当传递EOF信号时两个进程之间的通信结束。

  • 相关阅读:
    2016.10.09
    Httpie 进行web请求模拟
    Python-集合
    python-字典
    MySQL权限系统
    MySQL8.0安装以及介绍(二进制)
    数据库对象中英文介绍
    Python-字符串
    GIT安装部署
    Cobbler安装部署
  • 原文地址:https://www.cnblogs.com/dream397/p/13916245.html
Copyright © 2011-2022 走看看