Docker未在Colab上运行

时间:2020-02-15 01:41:47

标签: docker google-colaboratory

我尝试通过以下方式在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未运行”。也许Docker无法在Colab上工作。 enter image description here

我很困惑,想知道原因。

谢谢

2 个答案:

答案 0 :(得分:8)

我遇到了与您相同的问题,并且根据其Github存储库https://github.com/googlecolab/colabtools/issues/299中对此问题的回答,显然Google Colab不支持Docker。

答案 1 :(得分:1)

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

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

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),然后将其杀死。不幸的是,您必须为要运行dockerd命令的每个单元运行docker

关于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添加名称tap0模式tap] [ip链接设置tap0地址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

显示以上内容的记事本:

建议进一步阅读: