如何手动运行一个容器【一】

作者:行云创新 周朋

每个刚涉足容器的人都会对容器的实现有所困惑,容器是如何实现的,是如何复用宿主机的资源,并且实现资源隔离的;下面会用shell创建一个容器,为大家展示一个容器的创建过程。

1.创建镜像

我们一般用 docker pull 从远端的镜像仓库获得镜像,镜像里面包含的是一个根文件系统,那如何通过一个镜像,手动创建一个容器呢?

首先,我们需要先获取一个镜像。
在这里插入图片描述

或者可以从 alpine 官方网站获取mini rootfs filesystem的 tarball,同样是一个文件系统,并没有明显差异。
在这里插入图片描述

2.启动容器
刚刚我们已经将文件系统解压到本地,现在我们可以使用本地的文件系统"启动"一个容器了,那如何启动一个简单的容器呢?

使用 chroot,chroot 主要是将程序运行环境切换到指定目录,当我们切换过去之后,在应用程序内,根目录"/"的位置变成了我们指定的目录了,所以这就是为什么我们需要在"1"中创建一个根文件系统。
在这里插入图片描述

好了,现在一个简单的容器已经创建完成了,我们可以体验一下我们的"容器"。

在这里插入图片描述

以上,你应该能理解一个容器的文件系统在宿主机上是如何存在的,当然,我们在使用 docker 的时候,当前容器的根文件系统会经过overlay2 storage driver 一系列复杂的操作挂载到本机;但是那只是为了提高磁盘的利用率和获取容器镜像效率等等原因做的特殊优化,并不会影响容器文件系统的本质。

但是我们发现可以查看这个容器的网络(和宿主机共享),目录;但是不能查看进程,内存,磁盘信息,原因是是因为/proc是空的,/proc文件系统提供对系统中每个活动进程和线程状态的访问,我们必须要手动把它挂载到我们的容器里面。
在这里插入图片描述

然后我们能发现,能看到宿主机所有的进程、内存,磁盘信息,这不太像我们了解的容器,因为他的资源还没有隔离,资源隔离需要利用namespace和cgroup,这依然是Linux操作系统提供的能力。

3.利用namespace隔离进程资源

namespace 是 Linux kernel 提供的基本能力,它能对内核资源进行区分,让不同的进程的资源彼此隔离,该功能通过为一组资源和进程使用相同的命名空间来工作,但这些命名空间引用不同的资源。资源可能存在于多个空间中。此类资源的示例包括进程 ID、主机名、用户 ID、文件名以及与网络访问和进程间通信相关的一些名称。

我们将用 unshare 为我们的进程创建一个新的 namespace,并和宿主机的资源隔离。
在这里插入图片描述

好了,我们再次挂载文件系统/proc,查看这个容器。

在这里插入图片描述

他已经像是我们认知上的容器了,但是只是表面上看起来像;它只根据PID隔离了网络资源,没有隔离宿主机CPU、memory等资源,也并不能实现容器的网络通信,当然我们只是简单验证容器的创建过程,我们会在后面讲述Cgroup隔离资源的原理,但是我们并不会真的操作它,就像我们没有用overlay2 storage driver挂载容器的跟文件系统一样,这些东西用shell命令做起来很繁琐,缺失它们,但是并不影响我们理解容器创建的过程。

以上一个简单的容器就创建完成了,虽然如上所述,它并没有隔离物理资源,但是只是想告诉你一个事实,容器的存在和虚拟化是有本质差异的,它本质是复用了Linux本身的各种能力创建的。

限于篇幅,剩下的内容我们将在后续的文章中更新。

更多技术干货,请关注行云创新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深圳行云创新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值