可以在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。
上面显示的记事本:
建议进一步阅读: