将rootfs转换成Dcoker image

我们在编译一些老版本的软件时,通常必须选择一个较老版本的host环境,这时候我们可能会选择vm,但是vm有几个比较明显的缺陷:一是资源的消耗较大,因为vm本质上是一个独立的系统,内核以及大量的服务在host运行了一份,在vm里还要再运行一份,消耗了大量内存;二是在host和vm之间共享存储不方便,虽然可以使用nfs,samba之类的方式,但是他们都是基于网络的,当编译时会有大量小文件读写,这时可能会遇到性能瓶颈。通过使用Docker,则可以较好的解决这类问题。

Docker的优势

Docker并不会重新运行一个新的内核,它只是通过内核的cgroup和namespace机制,对进程的权限和资源进行控制,从而实现一种轻量级的隔离。

不同container中的进程虽然使用自己的lib以及binary,但是他们都是依靠host的kernel的系统调用来工作,因此,理论上会有更小的性能损失。

container中也不需要运行那些与编译无关的服务,因为编译过程只会用到rootfs中的lib和binary,这会节省大量的内存。

还有很重要的一点,host的目录可以直接映射到container内,而不是通过网络,这样在container内部对于存储的读写性能几乎跟host是一样的。

创建Docker image

通常来说,有三种方法来创建Docker image:

  • Dockerfile
  • Dockerhub
  • rootfs

我们重点说Dockerhub和rootfs这两种方式,因为第一种我还不会。。。

Docker hub

获得Docker image最简单的方法就是直接从Docker hub上pull下来,例如我需要一个Ubuntu 18.04的Docker image,只需要执行

1
docker pull ubuntu:18.04

这种方法有个局限,就是有些非常老的发行版并没有对应的官方Dcoker image,你可能会找到一些个人上传的,但如果你对于环境的安全性和稳定性有较高的要求,那就需要自己制作一个。

rootfs

如果你现在有一个运行的linux系统,可能是物理机,可能是虚拟机,你只是用它来做编译,那么你现在有一个更好的选择,那就是将它转换成一个Docker image。

1
sudo tar --numeric-owner --exclude=/boot/* --exclude=/dev/* --exclude=/lost+found --exclude=/proc/* --exclude=/selinux --exclude=/sys/* --exclude=/tmp/* --exclude=/var/run/* --exclude=/var/log/* -cf ubuntu-5.04.tar /

然后,我们只需要将ubuntu-5.04.tar导入Docker的本地Repository,即可启动这个container。

1
docker import ubuntu-5.04.tar ubuntu:5.04
1
docker run -it --rm ubuntu:5.04 bash