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

时间:2018-11-17 17:42:54

标签: docker

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

当脚本启动./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有很多参数。此处为pidfile: -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

2 个答案:

答案 0 :(得分:2)

Akihiro Suda今天(2019年2月4日)宣布:

  

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

请参见moby/moby PR 38050

  

允许在非特权用户名称空间(无根模式)中运行dockerd。
  关闭#37375 "Proposal: allow running dockerd as an unprivileged user (aka rootless mode)",于2018年6月打开

     

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

     

我是怎么做到的:

     

使用user_namespaces(7),mount_namespaces(7),network_namespaces(7)和slirp4netns

警告,有限制:

限制:

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

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

  
      
  • Cgroups(包括docker top)和AppArmor目前被禁用。
      将来,当在主机上配置委派权限时,Cgroups将可选地可用。
  •   
  • 当前不支持Checkpoint。
  •   
  • 也可以在无根/有根dockerd中运行无根dockerd,但尚未经过全面测试。
  •   

文档现在位于docs/rootless.md中:

请注意以下要求

  
      
  • newuidmapnewgidmap需要安装在主机上。
      这些命令由大多数发行版的uidmap软件包提供。

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

  •   

也就是说:

$ id -u
1001
$ whoami
penguin
$ grep ^$(whoami): /etc/subuid
penguin:231072:65536
$ grep ^$(whoami): /etc/subgid
penguin:231072:65536
     

需要安装slirp4netns(v0.3 +)或VPNKit
  最好选择slirp4netns

您将必须修改脚本:

  

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

$ dockerd-rootless.sh --experimental"

2019年5月更新:Tõnis Tiigi确实使用“ Experimenting with Rootless Docker ””探索了这种无根选项:

  

用户名称空间映射一个用户ID范围,以便内部名称空间中的root用户映射到父名称空间中的非特权范围。
  用户名称空间中的新进程还具有完整的进程功能。

     

无根模式以类似的方式工作,除了我们首先创建用户名称空间并启动已经在重新映射的名称空间中的守护程序。守护程序和容器将使用与主机名称空间不同的相同用户名称空间。

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

  

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

     

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

再次:

  

注意事项:

     

无法在无根模式下运行的某些示例包括cgroups资源控制,apparmor安全配置文件,检查点/还原,覆盖网络等。
  从容器中暴露端口目前需要手动socat帮助程序。

     

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

答案 1 :(得分:0)

我感谢OP的发展,但是对于其他人来说,这是一个简短的答案。如果文件/ etc / subuid和/ etc / subgid不满足先决条件设置(请参见下面的代码),那么您将被迫邀请具有root访问权的人参与。

# rightmost values returned from these commands should be >= 65536 
# if not, you're out of luck if admin doesn't like you. 
cat /etc/subgid | grep `whoami`  
cat /etc/subuid | grep `whoami`