我尝试通过以下方式在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上工作。
我很困惑,想知道原因。
谢谢
答案 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
-添加以启用调试模式。但是,在这种模式下,大多数容器运行都会产生与只读文件系统有关的错误。
其他说明:
!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。
显示以上内容的记事本:
建议进一步阅读: