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

3 min

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

大家好,我是無能。

我的家用伺服器至今仍未解決神秘的突然死亡問題,加上ConoHa的VPS當機,甚至ConoHa的DNS伺服器也掛了,所以停機了一段時間。

話說回來

話說回來,從jail演變而來,變得更應用程式友善的,就是現在的Docker,這一點不言而喻。
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實際上只是透過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