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信号时两个进程之间的通信结束。

  • 相关阅读:
    PAT (Advanced Level) Practice 1055 The World's Richest (25 分) (结构体排序)
    PAT (Advanced Level) Practice 1036 Boys vs Girls (25 分)
    PAT (Advanced Level) Practice 1028 List Sorting (25 分) (自定义排序)
    PAT (Advanced Level) Practice 1035 Password (20 分)
    PAT (Advanced Level) Practice 1019 General Palindromic Number (20 分) (进制转换,回文数)
    PAT (Advanced Level) Practice 1120 Friend Numbers (20 分) (set)
    从零开始吧
    Python GUI编程(TKinter)(简易计算器)
    PAT 基础编程题目集 6-7 统计某类完全平方数 (20 分)
    PAT (Advanced Level) Practice 1152 Google Recruitment (20 分)
  • 原文地址:https://www.cnblogs.com/dream397/p/13916245.html
Copyright © 2011-2022 走看看