Docker十分依賴Linux核心的功能才能運作,無法直接在其他作業系統使用,FreeBSD也不例外。根據FreeBSD Wiki,過去曾有人試圖移植Docker到FreeBSD,但是安裝十分麻煩,且相關套件長期缺乏維護,現在FreeBSD 14的docker-freebsd
套件處於不可用狀態。因此FreeBSD跟macOS一樣,需要套一層虛擬機才能跑Docker。比如基於bhyve的Dockerbox,是比Virtualbox更快更輕量的方案。
但問題是,都要使用容器技術了,自然是不想要再套一層虛擬機執行,導致產生更多延遲的啊!雖然FreeBSD有行之有年的chroot Jail技容器化術,不過他們畢竟還是跟Docker差距甚大。
此時,我發現Podman有移植到FreeBSD的原生套件可以用。
Podman是跟Docker十分接近的容器化技術,由RedHat主導開發,除了指令很像之外,也幾乎相容Docker的映像檔,提供類似docker compose與docker build的工具。因此Poman應可作為Docker的替代。
根據Podman官方文件,目前FreeBSD 14.0的Podman尚處於實驗性狀態,應小心評估使用。
1. 安裝Podman#
- 從套件庫安裝Podman與Podman compose
sudo pkg install podman-suite py311-podman-compose
- 設定開機自動掛載fdescfs,編輯
/etc/fstab
加入以下內容
fdesc /dev/fd fdescfs rw 0 0
- (選擇性)設定Podman容器服務開機自動啟動,但這不會讓podman compose的容器也跟著自動啟動。
sudo service podman enable
調整Podman網路設定,用
ifconfig
列出所有網路介面有啟用PF防火牆的話,編輯pf設定檔
/etc/pf.conf
,將網路介面填入,並允許連線到localhost
v4egress_if=re0
v6egress_if=re0
# 放在set與pass中間
nat-anchor "cni-rdr/*"
- 啟用net.pf.filter_local=1,允許從容器主機導向到容器內服務的連線
echo 'net.pf.filter_local=1' | sudo tee -a /etc/sysctl.conf.local
- 用ZFS建立存放映像檔的儲存池,所有映像檔會儲存在此
zfs create -o mountpoint=/var/db/containers zroot/containers
重開機。
測試跑Hello World容器。目前FreeBSD版Podman不支援rootless模式,所以執行一律要加sudo。
sudo podman run --rm docker.io/dougrabson/hello
2. 部署FreeBSD容器#
是的,FreeBSD官方有推出Docker版的runtime映像檔,達成類似chroot Jail的效果。
部署FreeBSD官方映像檔:
sudo podman run -it docker.io/freebsd/freebsd-runtime:14.snap
#pkg update
3. 部署Linux容器#
必須先安裝Linuxulator相容層才可以跑Linux容器。
接著拉執行一個Alpine Linux的容器,os需要指定為linux
sudo podman run --rm --os=linux docker.io/library/alpine cat /etc/os-release | head -1
- 如果要用docker-compose,新增一個
podman-compose.yml
,填入以下內容
name: httpd
services:
apache:
image: docker.io/library/httpd:latest
container_name: my-apache-app
ports:
- '8080:80'
volumes:
- ./html:/usr/local/apache2/htdocs
- 拉取容器映像檔,並啟動容器
sudo podman pull docker.io/library/httpd:latest --os=linux
sudo podman compose up -d