CapRover Web 用のバイナリ Docker は、あらゆる Linux ディストリビューションにインストールできます。
導入

最近の 25230 Editorial では、 CapRover とワンクリック Web インストールの普及により Linux ディストリビューションが時代遅れになったのかどうかを問うていました。
上記のリンク先にある社説では、陳腐化と抽象化の類似点について論じられており、ハードウェアから現代のウェブに至るまで、これらの類似点を辿っています。
論説では、 Dockerがオペレーティングシステム抽象化の重要な手法として言及されました。Dockerコンテナ化により、同じソフトウェアを非常に異なるオペレーティングシステム環境で実行できるようになります。
特に、Docker は、 ワンクリック インストールのヒーローであるCapRoverの前提条件です。
Low End LOL にとって、世界最古の Linux ディストリビューションであるSlackware で CapRover によるワンクリック Web インストールを実行するのは楽しいプロジェクトに思えました。
Dockerは、DockerデーモンとDockerクライアントの両方にLinuxの静的バイナリを提供しています。上記のリンク先の論説では、静的バイナリはディストリビューションに依存しないもう一つの方法として言及されていました。つまり、抽象化の手法の一つである静的バイナリを使って、さらに別の抽象化手法であるDockerをインストールし、さらに別の抽象化手法であるCapRoverをインストールしようとしているわけです。笑!
現実世界でこれをしてはいけない理由!
Docker は、本番システムではバイナリ インストール方式を使用しないよう警告しています。
バイナリを用いたDockerの本番環境へのインストールは推奨されません。セキュリティアップデートが自動的に適用されないためです。このページで説明されているLinuxバイナリは静的にリンクされているため、ビルド時の依存関係にある脆弱性は、Linuxディストリビューションのセキュリティアップデートによって自動的に修正されません。
Dockerの前提条件
最新の Slackware64-current OS をチェックして、Slackware64-current が Docker の 64 ビット バイナリ インストールの前提条件をすべて満たしているかどうかを確認しましょう。
64ビットインストール
root@darkstar:~# getconf LONG_BIT
64 ✅
root@darkstar:~#
Linuxカーネルバージョン3.10以上
root@darkstar:~# uname -r
5.17.7 ✅
root@darkstar:~#
Iptables バージョン 1.4 以上
root@darkstar:~# iptables --version
iptables v1.8.8 (legacy) ✅
root@darkstar:~#
Gitバージョン1.7以上
root@darkstar:~# git --version
git version 2.36.1 ✅
root@darkstar:~#
ps実行ファイル
root@darkstar:~# ps --version
ps from procps-ng 3.3.17 ✅
root@darkstar:~#
XZユーティリティバージョン3.9以上
root@darkstar:~# xz --version
xz (XZ Utils) 5.2.5 ✅
liblzma 5.2.5
root@darkstar:~#
適切にマウントされたcgroupfs階層
https://github.com/tianon/cgroupfs-mount/blob/master/cgroupfs-mount をご覧ください。
root@darkstar:~# ls /proc/cgroups
/proc/cgroups
root@darkstar:~# ls /sys/fs | grep cgroup
cgroup/
root@darkstar:~# ls /sys/fs/cgroup/
blkio/ cpuacct/ devices/ freezer/ misc/ net_prio/ pids/
cpu/ cpuset/ elogind/ memory/ net_cls/ perf_event/ systemd@
root@darkstar:~# mountpoint /sys/fs/cgroup
/sys/fs/cgroup is a mountpoint
root@darkstar:~# cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 1 1 1
cpu 2 1 1
cpuacct 3 1 1
blkio 4 1 1
memory 5 1 1
devices 6 1 1
freezer 7 1 1
net_cls 8 1 1
perf_event 9 1 1
net_prio 10 1 1
pids 11 1 1
misc 12 1 1
root@darkstar:~# cat /sys/fs/cgroup/memory/memory.use_hierarchy
1 ✅
root@darkstar:~#
AppArmorとSELinux
Slackware64-current のデフォルトには、Apparmor も SELinux もインストールされていないようです。しかし、どちらも Docker の前提条件ではありません。また、Darkstar のようなラボ環境では、本番環境ほど必要性が高くないかもしれません。
root@darkstar:~# cat /sys/kernel/security/apparmor/profiles
cat: /sys/kernel/security/apparmor/profiles: No such file or directory
root@darkstar:~# sestatus
-bash: sestatus: command not found
root@darkstar:~#
Dockerデーモンのセキュリティ
セコンプ
https://docs.docker.com/engine/security/seccomp/ を参照してください。
root@darkstar:~# ls /boot/config
/boot/config@
root@darkstar:~# file /boot/config
/boot/config: symbolic link to config-huge-5.17.7.x64
root@darkstar:~# grep CONFIG_SECCOMP= /boot/config
CONFIG_SECCOMP=y ✅
root@darkstar:~#
名前空間
Dockerコンテナを非特権ユーザーとして実行するように再マッピングすることは、コンテナ内からの権限昇格攻撃を防ぐ方法です。コンテナのユーザーIDを非特権ホストIDに再マッピングするという考え方です。この再マッピングは、/etc/subuidと/etc/subgidに設定されているLinux名前空間によって行われます。これらのファイルはどちらも、Slackware64-currentのデフォルトのディストリビューションには存在しません。
root@darkstar:~# ls /etc/subuid /etc/subgid
/bin/ls: cannot access '/etc/subuid': No such file or directory
/bin/ls: cannot access '/etc/subgid': No such file or directory
root@darkstar:~#
Darkstarの非本番環境であるラボ環境では、ほとんどのDarkstarユーザーが既にroot権限を持っているため、権限昇格攻撃の懸念は低いです。そのため、本日のテストではユーザーリマッピング機能はインストールしていません。
元に戻す能力を設定する
Slackware 以外のソースから Docker をインストールしており、インストールは Docker によって生成されたバイナリであるため、Docker を/opt ディレクトリに配置します。
/opt にはまだ多くのものが含まれていないとしても、元に戻せるように注意を払うことはおそらく常に素晴らしいアイデアです。
root@darkstar:~# cd /
root@darkstar:/# ls -l | grep opt
drwxr-xr-x 2 root root 4096 Jun 10 2007 opt/
root@darkstar:/# ls opt
root@darkstar:/# tar cvf opt-revert.tar opt
opt/
root@darkstar:/# ls opt-revert.tar
opt-revert.tar
root@darkstar:/# cd opt/
root@darkstar:/opt#
Dockerバイナリのダウンロードとインストール
root@darkstar:/opt# time wget -q https://download.docker.com/linux/static/stable/x86_64/docker-20.10.16.tgz
実数 0分1秒284秒
ユーザー 0分0.246秒
システム 0分0.333秒
root@darkstar:/opt# ls -lh
合計6200万
-rw-r–r– 1 ルート ルート 62M 5月12日 14:22 docker-20.10.16.tgz
root@darkstar:/opt# tar xvzf docker-20.10.16.tgz
ドッカー/
docker/docker-init
docker/コンテナ
ドッカー/ctr
docker/runc
ドッカー/ドッカーd
docker/docker-proxy
docker/コンテナd-shim
ドッカー/ドッカー
docker/containerd-shim-runc-v2
root@darkstar:/opt# cd docker
root@darkstar:/opt/docker# ls
containerd* containerd-shim-runc-v2* docker* docker-proxy* runc*
containerd-shim* ctr* docker-init* dockerd*
ルート@darkstar:/opt/docker#
効果があるようですか?
root@darkstar:/opt/docker# export PATH=/opt/docker:$PATH
root@darkstar:/opt/docker# dockerd &
{ . . . ]
root@darkstar:/opt/docker# docker run hello-world
[、、、]
Dockerからこんにちは!
このメッセージは、インストールが正常に動作していることを示しています。
このメッセージを生成するために、Docker は次の手順を実行します。
1. Docker クライアントが Docker デーモンに接続しました。
2. DockerデーモンはDocker Hubから「hello-world」イメージをプルしました。
(amd64)
3. Dockerデーモンは、そのイメージから新しいコンテナを作成し、
現在読んでいる出力を生成する実行可能ファイル。
4. Dockerデーモンはその出力をDockerクライアントにストリーミングし、Dockerクライアントはそれを
端末に。
もっと野心的なことを試すには、次のコマンドで Ubuntu コンテナを実行できます。
$ docker run -it ubuntu bash
無料の Docker ID を使用して、イメージの共有、ワークフローの自動化などを行うことができます。
https://hub.docker.com/
その他の例やアイデアについては、以下をご覧ください。
https://docs.docker.com/get-started/
[. . . ]
ルート@darkstar:/opt/docker#
Ubuntuを試してみましょう。:)
root@darkstar:/opt/docker# docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
125a6e411906: Pull complete
Digest: sha256:26c68657ccce2cb0a31b330cb0be2b5e108d467f641c62e13ab40cbec258c68d
Status: Downloaded newer image for ubuntu:latest
[. . . ]
ルート@261db2d76559:/# uname -a
Linux 261db2d76559 5.17.7 #1 SMP PREEMPT 2022年5月12日木曜日 12:45:55 CDT x86_64 x86_64 x86_64 GNU/Linux
root@261db2d76559:/# cat /etc/os-release
PRETTY_NAME=”Ubuntu 22.04 LTS”
名前=”Ubuntu”
バージョンID=”22.04″
バージョン=”22.04 LTS (ジャミージェリーフィッシュ)”
バージョンコード名=ジャミー
ID=Ubuntu
ID_LIKE=デビアン
HOME_URL=”https://www.ubuntu.com/”
SUPPORT_URL=”https://help.ubuntu.com/”
BUG_REPORT_URL=”https://bugs.launchpad.net/ubuntu/”
PRIVACY_POLICY_URL=”https://www.ubuntu.com/legal/terms-and-policies/privacy-policy”
UBUNTU_コードネーム=ジャミー
ルート@261db2d76559:~#
代替案
Slackwareでは、Dockerバイナリインストールの代替として、すべてをゼロからコンパイルする方法と、 AlienのSlackBuildsやPkgsrcなどのパッケージシステムを使用する方法の2つが明白です。もう1つの明白な代替案は、例えばDebianで稼働しているDarkstarのKVMインスタンスの1つにDockerをインストールすることです。
Slackware 以外にも、このバイナリ Docker インストールは、前提条件を満たすあらゆる Linux ディストリビューションで動作するはずですが、バイナリ Docker インストールは本番環境では推奨されていません。
結論
やったー!Dockerバイナリのインストールが、世界最古のLinuxディストリビューションで動作するようです!<3 でも、このDockerでCapRoverが動作し、ワンクリックでWebアプリをインストールできるのでしょうか? 今後の記事で確認しましょう! :)