Docker 不在 Colab 上运行

Bea*_*ans 7 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 上工作。 在此处输入图片说明

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

谢谢

ken*_*orb 15

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

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

dockerd

安装方式:

!apt-get -qq install docker.io
Run Code Online (Sandbox Code Playgroud)

使用以下 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)
Run Code Online (Sandbox Code Playgroud)

如上所示,在执行每个docker命令之前,您必须dockerd在后台运行 Docker 服务( ),然后将其杀死。不幸的是,您必须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

无根模式允许以非根用户身份运行 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)
Run Code Online (Sandbox Code Playgroud)

运行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)
Run Code Online (Sandbox Code Playgroud)

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

!sudo -Hu docker bash -x docker-run.sh hello-world
Run Code Online (Sandbox Code Playgroud)

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

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

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

!mount -vt sysfs sysfs /sys -o rw,remount
!mount -vt tmpfs tmpfs /sys/fs/cgroup -o rw,remount
Run Code Online (Sandbox Code Playgroud)

[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)
Run Code Online (Sandbox Code Playgroud)

然后运行为:

!sudo -Hu docker bash docker-run.sh run --cap-add SYS_ADMIN hello-world
Run Code Online (Sandbox Code Playgroud)

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

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

这可以通过 解决!sysctl -w kernel.keys.maxkeys=500,但 Colab 不允许。相关:来自守护程序的错误响应:加入会话密钥环:创建会话密钥:超出磁盘配额

记事本显示以上内容:

建议进一步阅读:


小智 11

我和你有同样的问题,根据其 Github 存储库中关于此问题的答案,显然 Docker 在 Google Colab 中不受支持:https : //github.com/googlecolab/colabtools/issues/299