我最近在 Windows 10 PC 上安装了 Ubuntu 22.04 WSL。
我天真的理解是,这个 Ubuntu“应用程序”相当于一个 Linux 开发环境。
当我在运行的 Ubuntu 应用程序中进行探索时,它通常感觉就像我习惯的普通 Linux:shell 似乎是bash
,我可以访问诸如、、git
等可执行文件。curl
man
相信这个 Ubuntu WSL 相当于 Linux 开发环境的说法,我现在想在这个 Ubuntu 实例中运行 Docker。
我的天真理解是“由于 Linux 原生支持容器,我应该在 Linux 上安装 Docker Engine”。
所以我按照这里描述的步骤进行操作:https://docs.docker.com/engine/install/ubuntu/
但是当我尝试通过运行 hello-world 映像来验证 Docker Engine 是否正确安装时,出现以下错误:
$ sudo docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.
没有/var/run/docker.sock
,我也不认为 Docker 守护进程正在运行:
$ ls -l /var/run/docker.sock
ls: cannot access '/var/run/docker.sock': No such file or directory
$ ps aux | grep containerd
user 10212 0.0 0.0 8164 732 pts/2 S+ 21:44 0:00 grep --color=auto containerd
有人可以帮我理解吗出了什么问题?我可以采取什么纠正措施才能在 Windows PC 上的 Ubuntu WSL 应用程序中成功安装 Docker?
也许是https://docs.docker.com/engine/install/ubuntu/仅适用于“在主机 PC 上本地安装的 Ubuntu”,而不适用于在 Windows PC 上运行的 Ubuntu WSL?
如果是这样,那么我是否应该通过其他方式“安装 Docker”,以便sudo docker run hello-world
可以从我的 Ubuntu WSL 中运行类似的 Docker 命令?
我对这里涉及的所有软件层感到很困惑。
答案1
我的天真的理解是,这个 Ubuntu“应用程序”相当于一个 Linux 开发环境。
它实际上更像是在容器中运行 Ubuntu,因为确实是。在容器(例如 Docker Ubuntu 容器)中运行 Ubuntu 时,与物理机或虚拟机相比,设置服务的方式有所不同。例如,Docker Ubuntu 容器中默认不运行 Systemd。没有“登录”,因此没有 PAM。
我试图写下我能想到的尽可能多的差异和局限性这个 Ask Ubuntu 答案。
“由于 Linux 本身支持容器,因此我应该在 Linux 上安装 Docker Engine。”
...
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
首先,对于大多数用户来说,在 Windows/WSL2 中安装 Docker 的推荐方式是通过适用于 Windows 的 Docker 桌面。
我介绍了为什么这样做更好的一些原因这个 Stack Overflow 上的答案。
虽然可以在 WSL2 实例中手动安装和运行 Docker Engine,但有一个关键的区别,我在这个答案简而言之,Ubuntu 下的 Docker Engine 软件包尝试通过 Systemd 启动守护进程,而 Systemd(如上所述)在 WSL 上默认不运行。在 WSL2 下的 Ubuntu 上,您需要首先使用以下命令启动守护进程:
sudo service docker start
更新:
如果需要使用“记录的”方法,您现在还可以在 WSL2 上使用 Systemd。虽然我仍然更喜欢在 WSL2 上尽可能不使用 Systemd 运行,但有时它确实可以让生活更轻松。
要启用,请参阅我的答案在这里。大多数最新的 WSL 安装都会内置支持,但如果您需要升级 Windows 或 WSL,帖子中也提供了相关说明。
如果你想走这条路,我建议你在完成 Docker 安装过程之前启用 Systemd链接在问题中。由于 Systemd 在 Docker 安装时已经在运行,它将自动运行并启用该服务。
如果您启用 Systemd后安装 Docker,您可以运行:
sudo systemctl enable docker
... 让 Docker 在 Ubuntu/WSL2 启动时自动启动。
和/或:
sudo systemctl start docker
来代替service
命令启动它。
答案2
首先检查docker日志:
sudo cat /var/log/docker.log
的情况下:
failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to register "bridge" driver: unable to add return rule in DOCKER-ISOLATION-STAGE-1 chain: (iptables failed: iptables --wait -A DOCKER-ISOLATION-STAGE-1 -j RETURN: iptables v1.8.7 (nf_tables): RULE_APPEND failed (No such file or directory): rule in chain DOCKER-ISOLATION-STAGE-1 (exit status 4))
用这个:
sudo update-alternatives --config iptables
输入 1 选择 iptables-legacy 并运行sudo service docker start
,Docker 应该按预期启动。
如果这仍然不是问题,也许这个网站会有用:https://dataedo.com/docs/installing-docker-on-windows-via-wsl