docker没有没有银弹

docker是容器工具的一个集合,这里看看libcontainer的部分.

首先尝试安装runc[1],runc是一个公开的容器实现,标准需要遵从OCI(标准容器组织)规定.

# 在GOPATH/src下面创建一个'github.com/opencontainers'目录
cd github.com/opencontainers
git clone https://github.com/opencontainers/runc
cd runc
make
sudo make install

有一个libseccomp的C库需要下载,这个是内核安全相关的模块的库.在ubuntu下面运行 sudo apt-get install libseccomp-dev
即可.

启动容器需要一个配置文件[2].运行 runc spec
可以产生一个默认的配置文件.

除此之外需要一个独立的工作目录,其实是一个已经初始化的了具有namespace的目录,这个可以通过docker获取,这里需要你已经安装了docker,并运行命令 docker pull busybox
.

之后运行 docker export $(docker create busybox) > busybox.tar
, docker create
会创建一个容器,并返回一个哈希值, docker export
接受这个哈希值

然后导出这个容器的镜像,把tar包打开并存入rootfs(因为runc默认配置需要以rootfs作为根目录).

containers are configured using bundles. A bundle for a container is a directory

that includes a specification file named config.json and a root filesystem.

The root filesystem contains the contents of the container.

容器运行的前提就是一个配置文件 config.json
和一个根文件系统,这个集合称为bundle, start -b
参数可以指定bundle目录.

mkdir rootfs
tar -C rootfs -xf busybox.tar

busybox是UNIX上的一个小型的二进制工具集,从解压的rootfs下面看到主要是bin下面有很多二进制可执行文件和etc下面的配置文件,这些就构成了一个可以运行的容器环境.

最后运行 sudo runc start test
,其实从容器里看根目录就是之前mkdir创建的rootfs目录,这是因为容器已经运行在文件系统namespace当中了,所以看起来已经变成了根目录.

尝试执行 ps
,可以看到结果.

/ # ps
PID   USER     TIME   COMMAND
    1 root       0:00 sh
    7 root       0:00 ps

只有当前运行的sh和刚才执行的ps,这是因为整个进程就是sh进程,整个容器进入了PID namespace当中与宿主机隔离了.

runc的cli工具是依赖”github.com/codegangsta/cli”的,每个子命令都是一个独立的文件比如 runc/start.go
就是start命令的处理流程部分.

libcontainer/container_linux.go
是整个linux容器启动的入口.

parentProcess 是一个initProcess.

#namespace

六种namespace:

  • PID
  • UTS(Unix Time-sharing System, 主机名的命名空间)
  • IPC
  • NS(mount namespace 文件系统隔离,因为是第一个namespace,所以直接用了NS这个名字)
  • network
  • user

在clone的时候可以设置namespace,对应/proc/[pid]/ns下面有namespace映射.

setns加入一个已经存在的ns,unshare创建一个新的ns,这两个调用都不需要启动新进程,但是PID不能在当前调用进程中发生改变,因为PID被认为是常量,对于用户态的程序来说会有影响,新的子进程会使用对应的namespace.

namespace隔离了很多东西,但是并不完美,还有很多没有隔离的东西,比如cgroups,/proc/sys,/dev/sd*等等.

PID namespace当中需要实现一个完善的init进程来维护好所有进程. network namespace当中有路由表没有设置,user namespace还有权限问题不完整.

docker 实现了很多,但是还有不完善的地方.

引用:

  1. runc github 地址 https://github.com/opencontainers/runc/tree/master
  2. https://github.com/opencontainers/specs/blob/master/config.md
稿源:yueyue.gao (源链) | 关于 | 阅读提示

本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。
酷辣虫 » 后端存储 » docker没有没有银弹

喜欢 (0)or分享给?

专业 x 专注 x 聚合 x 分享 CC BY-NC-SA 4.0

使用声明 | 英豪名录