之前對於 docker 和 lxc (linux container) 都有一點模糊,隨著這次在 ARM64 上架設 docker 環境,有點瞭解到其實它們都是利用 Linux Kernel 提供的 CGROUP 和 Namespace 的功能,來獨立這虛擬的程序。docker 主要是專注在單一程式的運行,而lxc則是專注在特定 Linux distribution 環境的重現,如所用的 gcc, library版本, 文件配置的方式。
Kernel 所需功能
要架設 Docker, 在 kernel 設定裡面要,尋找下面 keyword,將其功能都啟用。
- CGROUP
- NAMESPACE
- DEVPTS
- VETH
- OVERLAY
儘量的將含有這些 keyword 的功能啟用,以避免後續的問題。由於上面是我列出實驗過程中有缺的,一些例如 BRIDGE 的功能,就沒列上來,可能要在運行時,根據WARNING訊息來加入。
取得 Docker 程式
Docker 的程式可以在這裡取得,由於都是 static ,所以稍微肥大一些。版本太新的會不能用在舊 kernel 上,所以不挑的話,從舊版本開始試。這邊以 docker-17.03.0-ce.tgz 為例,可成功在 ARM64 kernel 4.4 運行,抓下來後將之解壓縮。以下是在x86 linux 上的範例,執行下面命令
1 2 3 4 5 6 7 8 9 10 11 12 |
sudo bash cd wget https://download.docker.com/linux/static/stable/x86_64/docker-17.03.0-ce.tgz tar zvxf docker-17.03.0-ce.tgz mv docker/* /bin addgroup docker usermod -a -G docker ubuntu mount -t cgroup none /sys/fs/cgroup echo 1 > /sys/fs/cgroup/memory.use_hierachy mkdir -p /var/run/docker mkdir -p /var/lib/docker DOCKER_RAMDISK=true dockerd & |
這邊假設用戶名稱是 ubuntu, 先以 root 方式安裝完後, 將 ubuntu 加入 docker group. 然後就可以運行 dockerd 了,若你不是在 RAMDISK 上運行 (一般在嵌入式系統上),前面的 DOCKER_RAMDISK=true,就不要加。因為docker會用到 overlay 的 fs, ramdisk 無此功能, 所以才要特別設定。
登出後,用一般用戶重新登入,就可以進到 docker 環境了。
1 2 |
docker pull alpine docker run -it --rm alpine:latest /bin/ash |
若是要在 ARM64 上面運行則要先下載,匯出後,再到 target 上匯入
1 2 3 4 5 |
docker pull arm64v8/alpine:3.14 docker save arm64v8/alpine:3.14 | gzip -c > alpine_3.14.tar.gz #on target gunzip -c alpine_3.14.tar.gz | docker load |