【问题标题】:Docker is not running on ColabDocker 未在 Colab 上运行
【发布时间】:2020-05-30 18:51:48
【问题描述】:

我曾尝试通过以下方式在google Colab上安装Docker:

(1)https://phoenixnap.com/kb/how-to-install-docker-on-ubuntu-18-04

(2)https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04

(3)https://colab.research.google.com/drive/10OinT5ZNGtdLLQ9K399jlKgNgidxUbGP

我启动了 docker 服务并查看了状态,但它显示“Docker 未运行”。也许码头工人不能在 Colab 上工作。

我感到困惑,想知道原因。

谢谢

【问题讨论】:

  • 命令也不起作用?尝试拉一些图像。如果它不起作用,请告诉我
  • 当我运行“sudo docker pull”时,它显示“无法连接到 unix:///var/run/docker.sock 上的 Docker 守护进程。 docker 守护进程是否正在运行?'
  • 你找到答案了吗?

标签: docker google-colaboratory


【解决方案1】:

我知道,这是一个老问题,但这是一个由 Google Colaboratory 团队成员提出的old answer (2020)。

这是不可能的,我们目前没有计划支持。

【讨论】:

    【解决方案2】:

    我遇到了和你一样的问题,根据其 Github 存储库中有关此问题的答案,显然 Google Colab 不支持 Docker:https://github.com/googlecolab/colabtools/issues/299#issuecomment-615308778。

    【讨论】:

      【解决方案3】:

      可以在Colab 中运行 Docker,但功能有限。

      有两种运行 Docker 服务的方法,一种是常规的(限制性更强),另一种是在无根模式下(dockerd 内 RootlessKit)。

      dockerd

      安装者:

      !apt-get -qq install docker.io
      

      使用以下 shell 脚本:

      %%shell
      set -x
      dockerd -b none --iptables=0 -l warn &
      for i in $(seq 5); do [ ! -S "/var/run/docker.sock" ] && sleep 2 || break; done
      docker info
      docker network ls
      docker pull hello-world
      docker pull ubuntu
      # docker build -t myimage .
      docker images
      kill $(jobs -p)
      

      如上所示,在每个docker 命令之前,您必须在后台运行Docker 服务(dockerd),然后将其杀死。不幸的是,您必须为每个要运行 docker 命令的单元格运行 dockerd。

      dockerd 参数注意事项:

      • -b none/--bridge none - 禁用网桥以避免错误。
      • --iptables=0 - 禁用添加 iptables 规则以避免错误。
      • -D - 添加以启用调试模式。

      但是在这种模式下运行大多数容器会产生与只读文件系统相关的错误。

      补充说明:

      • 要禁用 cpuset 支持,请运行:!umount -vl /sys/fs/cgroup/cpuset。

      相关问题:https://github.com/docker/for-linux/issues/1124。

      这里有一些记事本:


      无根dockerd

      Rootless mode 允许以非 root 用户身份运行 Docker 守护进程和容器。

      要安装,请使用以下代码:

      %%shell
      useradd -md /opt/docker docker
      apt-get -qq install iproute2 uidmap
      sudo -Hu docker SKIP_IPTABLES=1 bash < <(curl -fsSL https://get.docker.com/rootless)
      

      要运行dockerd服务,有两种方法:使用脚本(dockerd-rootless.sh)或直接运行rootlesskit。

      这是使用dockerd-rootless.sh 运行hello-world 容器的脚本:

      %%writefile docker-run.sh
      #!/usr/bin/env bash
      set -e
      export DOCKER_SOCK=/opt/docker/.docker/run/docker.sock
      export DOCKER_HOST=unix://$DOCKER_SOCK
      export PATH=/opt/docker/bin:$PATH
      export XDG_RUNTIME_DIR=/opt/docker/.docker/run
      /opt/docker/bin/dockerd-rootless.sh --experimental --iptables=false --storage-driver vfs &
      for i in $(seq 5); do [ ! -S "$DOCKER_SOCK" ] && sleep 2 || break; done
      docker run $@
      jobs -p
      kill $(jobs -p)
      

      要运行上面的脚本,运行:

      !sudo -Hu docker bash -x docker-run.sh hello-world
      

      以上可能会产生以下警告:

      WARN[0000] 无法挂载 sysfs,回退到只读挂载:不允许操作

      要重新挂载一些具有写入权限的文件夹,您可以尝试:

      !mount -vt sysfs sysfs /sys -o rw,remount
      !mount -vt tmpfs tmpfs /sys/fs/cgroup -o rw,remount
      

      [rootlesskit:child] 错误:执行[[ip tuntap add name tap0 mode tap] [ip link set tap0 address 02:50:00:00:00:01]]:退出状态1

      上述错误与dockerd-rootless.sh脚本有关,该脚本向rootlesskit添加了额外的网络参数,例如:

      --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin

      这已在https://github.com/rootless-containers/rootlesskit/issues/181 报告(但被忽略)。

      要解决上述问题,我们可以使用以下文件将我们自己的参数传递给rootlesskit:

      %%writefile docker-run.sh
      #!/usr/bin/env bash
      set -e
      export DOCKER_SOCK=/opt/docker/.docker/run/docker.sock
      export DOCKER_HOST=unix://$DOCKER_SOCK
      export PATH=/opt/docker/bin:$PATH
      export XDG_RUNTIME_DIR=/opt/docker/.docker/run
      rootlesskit --debug --disable-host-loopback --copy-up=/etc --copy-up=/run /opt/docker/bin/dockerd -b none --experimental --iptables=false --storage-driver vfs &
      for i in $(seq 5); do [ ! -S "$DOCKER_SOCK" ] && sleep 2 || break; done
      docker $@
      jobs -p
      kill $(jobs -p)
      

      然后运行为:

      !sudo -Hu docker bash docker-run.sh run --cap-add SYS_ADMIN hello-world
      

      根据您的图像,这可能会产生以下错误:

      process_linux.go:449:容器初始化导致“加入会话密钥环:创建会话密钥:不允许操作”:未知。

      这可以通过!sysctl -w kernel.keys.maxkeys=500 解决,但是 Colab 不允许这样做。相关:Error response from daemon: join session keyring: create session key: disk quota exceeded。

      上面显示的记事本:

      建议进一步阅读:

      【讨论】:

        猜你喜欢
        • 2020-09-26
        • 2019-03-06
        • 1970-01-01
        • 2021-11-04
        • 1970-01-01
        • 2021-05-31
        • 2022-07-28
        • 2014-08-15
        • 2017-09-27
        相关资源
        最近更新 更多