在没有 root 访问权限的服务器上安装 Docker 二进制文件

Aar*_*ron 5 docker

我有一个由提供商提供的服务器,没有任何根访问权限。无法在 /etc/ 或 /var/lib/docker 中编写脚本。Docker 未安装。我的想法是在目录中安装并运行 docker 二进制文件。我将使用 shell 脚本安装 docker。该脚本应该能够从任何目录启动,无需 root 访问权限

当脚本启动时,./docker/dockerd --data-root=docker/var/lib/docker我收到此错误消息。

WARN[2018-11-17T18:26:19.492488618+01:00] 设置守护程序根传播时出错,这通常并不重要,但可能会导致某些功能无法工作或回退到不太理想的行为 dir=docker/var/lib/ docker error="获取守护进程根目录的父挂载时出错:打开 /proc/self/mountinfo: 权限被拒绝" 启动守护进程时出错:打开 /var/run/docker.pid: 权限被拒绝

dockerd 有很多参数。这里是 pid 文件:-p | **--pidfile*[=/var/run/docker.pid]

http://manpages.ubuntu.com/manpages/cosmic/man8/dockerd.8.html

感谢您的帮助

#!/bin/bash

DOCKER_RELEASE='docker-18.06.1-ce.tgz'

wget https://download.docker.com/linux/static/stable/x86_64/$DOCKER_RELEASE
tar xzvf $DOCKER_RELEASE
rm $DOCKER_RELEASE

./docker/dockerd --data-root=docker/var/lib/docker
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 3

正如Akihiro Suda今天(2019 年 2 月 4 日)宣布的那样:

\n\n
\n

最后,现在可以dockerd作为非特权用户运行上游!

\n
\n\n

请参阅moby/mobyPR 38050

\n\n
\n

允许在非特权用户命名空间(无根模式)中运行 dockerd。
\n 关闭#37375“提案:允许dockerd以非特权用户身份运行(又名无根模式)”,于 2018 年 6 月开放

\n\n

除了 newuidmap 和 newgidmap 之外,不需要 SETUID/SETCAP 二进制文件。

\n\n

我是怎么做到的:

\n\n

通过使用 user_namespaces(7)、mount_namespaces(7)、network_namespaces(7) 和slirp4netns

\n
\n\n

警告,有限制:

\n\n

限制:

\n\n
\n
    \n
  • vfs graphdriver支持。
    \n 但是,在 Ubuntu 和一些发行版上,也支持 overlay2 和 overlay。
    \n 从 Linux 4.18 开始,我们还将能够实现 FUSE 快照程序。
  • \n
\n
\n\n

(请参阅Graphdriver 插件,其中 Docker 图形驱动程序插件使管理员能够使用外部/进程外图形驱动程序与 Docker 引擎一起使用。
\n这是使用内置存储驱动程序(例如 aufs/overlay/)的替代方法设备映射器/btrfs。)

\n\n
\n
    \n
  • Cgroups(包括 docker top)和 AppArmor 目前已禁用。
    \n 将来,当在主机上配置委派权限时,可以选择使用 Cgroup。
  • \n
  • 目前不支持检查点。
  • \n
  • dockerd在 rootless/rootful 中运行 rootlessdockerd也是可能的,但尚未经过充分测试。
  • \n
\n
\n\n

该文档现在位于docs/rootless.md

\n\n

请注意以下要求

\n\n
\n
    \n
  • newuidmap并且newgidmap需要安装在主机上。
    \n 大多数发行版上的软件包都提供了这些命令uidmap

  • \n
  • /etc/subuid并且/etc/subgid应该包含>= 65536子ID。
    \n 例如penguin:231072:65536

  • \n
\n
\n\n

那是:

\n\n
\n
$ id -u\n1001\n$ whoami\npenguin\n$ grep ^$(whoami): /etc/subuid\npenguin:231072:65536\n$ grep ^$(whoami): /etc/subgid\npenguin:231072:65536\n
Run Code Online (Sandbox Code Playgroud)\n\n

slirp4netns(v0.3+) 或需要VPNKit安装。
\n slirp4netns是获得最佳性能的首选。

\n
\n\n

您将必须修改您的脚本:

\n\n
\n

您需要运行dockerd-rootless.sh而不是dockerd.

\n\n
$ dockerd-rootless.sh --experimental"\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n
\n\n

2019 年 5 月更新:T\xc3\xb5nis Tiigi确实通过“ Experimenting with Rootless Docker ”探索了这个无根选项:

\n\n
\n

用户命名空间映射一系列用户 ID,以便内部命名空间中的 root 用户映射到父命名空间中的非特权范围。
\n 用户命名空间中的新进程也会获得一整套进程功能。

\n\n

无根模式的工作方式类似,只不过我们首先创建一个用户命名空间并启动已在重新映射的命名空间中的守护进程。守护进程和容器都将使用与主机不同的相同用户命名空间。

\n
\n\n

https://cdn-images-1.medium.com/max/1636/1*SfAokC2YQ-f04Wc2WhSRCw.png

\n\n
\n

尽管 Linux 允许创建没有扩展权限的用户命名空间,但这些命名空间仅映射单个用户,因此不适用于许多当前现有的容器。
为了克服这个问题,无根模式依赖于uidmap可以为我们重新映射用户的包。包中的二进制文件uidmap使用setuid位(或文件功能),因此始终在内部以 root 身份运行。

\n\n

为了使不同命名空间的启动以及与 uidmap 的集成更简单,Akihiro创建了一个名为 的项目rootlesskit
\n Rootlesskit 还负责为无根容器设置网络。默认情况下,rootless docker 使用基于moby/vpnkit项目的网络,该项目也用于 Docker Desktop 产品中的网络。
\n 或者,用户可以安装slirp4netns并使用它。

\n
\n\n

再次:

\n\n
\n

注意事项:

\n\n

在无根模式下不起作用的一些示例包括cgroups资源控制、apparmor安全配置文件、检查点/恢复、覆盖网络等。
\n 当前从容器公开端口需要手动socat帮助程序进程。

\n\n

只有基于 Ubuntu 的发行版支持无根模式下的覆盖文件系统。
\n 对于其他系统,无根模式使用 vfs 存储驱动程序,该驱动程序在许多文件系统中不是最佳的,不建议用于生产工作负载。

\n
\n