适用于任何 Linux 发行版的 CapRover Web 安装二进制 Docker! 适用于任何 Linux 发行版的 CapRover Web 安装二进制 Docker!

适用于任何 Linux 发行版的 CapRover Web 安装二进制 Docker!

介绍

Docker 标志

Low End Box 最近的一篇社论提出了一个问题: CapRover 和一键式 Web 安装的兴起是否使 Linux 发行版过时了?

上述链接的社论探讨了过时和抽象之间的相似之处。该社论追溯了这些相似之处,发现它们从硬件一直延伸到现代网络。

社论中提到, Docker是一种重要的操作系统抽象方法。Docker 容器化技术允许在截然不同的操作系统环境中运行相同的软件。

值得注意的是,Docker 是CapRover(我们的一键安装利器)的先决条件!

对于 Low End LOLs 来说,尝试在世界上现存最古老的 Linux 发行版Slackware 上实现 CapRover 驱动的一键式 Web 安装似乎是一个很有趣的项目。

Docker 为 Docker 守护进程和 Docker 客户端都提供了Linux 静态二进制文件。上面链接的社论中也提到了静态二进制文件,认为它是另一种实现发行版无关性的方法。所以,我们现在用一种抽象方法——静态二进制文件——来安装另一种抽象方法——Docker,而最终目的却是为了安装第三种抽象方法——CapRover。哈哈!

现实生活中不应该这样做的理由!

Docker警告我们不要在生产系统中使用二进制安装方法:

我们不建议在生产环境中使用二进制文件安装 Docker,因为它们不会自动更新安全补丁。本页所述的 Linux 二进制文件是静态链接的,这意味着构建时依赖项中的漏洞不会通过 Linux 发行版的安全更新自动修复。

Docker 先决条件

让我们检查一下最新的 Slackware64-current 操作系统,看看 Slackware64-current 是否满足 64 位二进制安装 Docker 的所有先决条件

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:~#

命名空间

请参阅https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-user-namespace-options。

将 Docker 容器重新映射为以非特权用户身份运行是一种防止容器内部权限提升攻击的方法。其原理是将容器用户 ID 重新映射到非特权主机 ID。此重新映射通过 Linux 命名空间完成,命名空间配置在 `/etc/subuid` 和 `/etc/subgid` 文件中。默认的 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 root root 62M 5月 12 14:22 docker-20.10.16.tgz
root@darkstar:/opt# tar xvzf docker-20.10.16.tgz
docker/
docker/docker-init
docker/containerd
docker/ctr
docker/runc
docker/dockerd
docker/docker-proxy
docker/containerd-shim
docker/docker
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*
root@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/

[...]

root@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

[...]

root@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 (Jammy Jellyfish)”
版本号=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL=”https://www.ubuntu.com/”
支持网址=”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_CODENAME=jammy
root@261db2d76559:~#

替代方案

在 Slackware 系统上,除了 Docker 二进制安装之外,还有两种显而易见的替代方案:一是完全编译所有组件,二是使用Alien 的 SlackBuildsPkgsrc 等软件包管理系统。另一种显而易见的替代方案是在 Darkstar 的 KVM 实例中安装 Docker,例如运行 Debian 系统的实例。

除了 Slackware 之外,这个二进制 Docker 安装程序应该可以在任何满足先决条件的 Linux 发行版上运行,尽管不建议在生产环境中使用二进制 Docker 安装程序。

结论

太棒了!Docker 二进制文件似乎可以在世界上最古老的 Linux 发行版上运行!<3 但是这个 Docker 镜像能运行 CapRover 并提供一键式 Web 应用安装吗?我们将在以后的文章中揭晓答案!:)