Docker似乎可以直接移植到FreeBSD,但是……

3 min

language: ja bn en es hi pt ru zh-cn zh-tw

大家好,我是无能。

我的家用服务器的神秘猝死问题尚未解决,而且ConoHa的VPS宕机,ConoHa的DNS服务器也随之崩溃,导致服务中断了一段时间。

话说回来

话说回来,毋庸置疑,如今的Docker是从jail演变而来,变得更加应用程序友好。
chroot仅仅是change root,一个施加了文件系统级别限制的环境。从某种意义上说,它确实像一个监狱,但又有些不同。它只是改变了root,也就是/
手边有一个方便易懂的工具是arch-chroot,但我们先尝试普通的chroot

thepassenger:[haturatu]:~$ sudo chroot chroot-test/
chroot: failed to run command ‘/usr/bin/bash’: No such file or directory

如您所见,在默认的chroot中,bash本身在隔离环境中不可见,因此无法进入。而且,即使您复制了/bin/bashbash所需的依赖库也无法在隔离环境中引用,因此无法执行。
这就是Change Root。仅仅是根目录发生了变化。

sudo mkdir /mnt/arch
sudo pacstrap /mnt/arch base linux linux-firmware man-db vim
sudo arch-chroot /mnt/arch

仅凭上述操作

thepassenger:[haturatu]:~$ sudo arch-chroot /mnt/arch
==> WARNING: /mnt/arch is not a mountpoint. This may have undesirable side effects.
[thepassenger /]# ls
bin   dev  home  lib64  opt   root  sbin  sys  usr
boot  etc  lib   mnt    proc  run   srv   tmp  var
[thepassenger /]# cd ~
[thepassenger ~]# ls
[thepassenger ~]# ls -la
total 16
drwxr-x---  4 root root 4096 Mar 31 11:37 .
drwxr-xr-x 16 root root 4096 Mar 31 11:37 ..
drwx------  3 root root 4096 Mar 31 11:37 .gnupg
drwx------  2 root root 4096 Mar 31 11:37 .ssh
[thepassenger ~]# 

在此之后,如果您在这个chroot环境中执行ps -ef,您会发现宿主机的进程仍然可以从这个chroot中看到。

FreeBSD的jail则进一步强化,进程、网络和用户空间等都被分离。此外,Linuxcgroups本身是由Google工程师设计和实现的,一直发展到现在的cgroups v2。我最初使用Docker的原因仅仅是为了除了易于更改的资源限制之外的目的,使用jail也可以,但为什么FreeBSD没有类似的实现呢?进入迷宫……jail不能进行资源限制吗?不,它可以,但为什么呢……

FreeBSD上Docker的现状

目前它仍然提供支持,但版本老旧得令人惊讶。

image.png


这意味着它虽然提供了支持,但正如这篇文章所说,目前似乎没有维护。
最近のFreeBSDコンテナ事情 #Docker - Qiita
而且,这个FreeBSD版的Docker实际上只是通过Linux内核运行Docker,似乎并非原生实现。

FreeBSD上不能实现吗?

坦白说,如果能通过修改alias就能创建一个与Docker完全兼容的jail监狱环境,那将是最理想的。
资源限制也可以通过与rctl结合来实现。
https://codeberg.org/bsdpot/pot

也有像这样利用jail的实现,但从某种意义上说,它们是FreeBSD生态系统上的实现。
也就是说,它可以作为容器环境来实现。然而,移植的问题在于像Dockerfile这样的构建脚本。虽然可以说可以轻松地将其转换为可以用pot实现的构建shell脚本,但是

FROM
WORKDIR
COPY
ARG
ENV
RUN
EXPOSE 

这是一种基于分层系统,无可奈何的构建语言(?)。
也就是说,由于它们的包管理器也不同,完全自动地转换它们似乎有些困难。不过,potfile似乎可以支持。

https://github.com/ebarriosjr/potMachine/blob/master/Potfiles/Potfile

Related Posts