当前位置: 首页 > Linux

在WSL2中使用Docker

时间:2023-04-06 04:17:04 Linux

原文链接WSL2是一个基于Hyper-V虚拟化的Linux,所以想在WSL中运行Docker。当我兴高采烈的安装Docker的时候,却发现无法启动,因为PID为1的进程不是systemd,而是init,这让我目瞪口呆。经过一番查找,发现GitHub上有人给出了解决方案,Genie。原理是利用linux命名空间实现隔离,在隔离的空间运行systemd,使systemd的PID为1。看了代码,得到几个关键命令unshare:在新的命名空间运行命令。manpagesenter:在命名空间中运行命令。manpagerunuser:切换执行命令的用户。manpage我们的步骤是使用pidof检查是否有systemd进程,如果有则跳到3,否则跳到2。让unshare运行systemd,使新命名空间下systemd的PID为1。执行整个命令配合daemonize命令,这样创建的systemd一直以后台进程的形式运行。使用nsenter和runuser进入新创建的命名空间并以用户身份运行shell。这样我们就可以得到这样一个脚本,github传送门#!/bin/bashsystemd_pid=if[-z$(pidofsystemd)];然后daemonize/usr/bin/unshare-fp--propagationshared--mount-procsystemdfiwhile[-z$systemd_pid]doforpidin$(pidofsystemd)dosystemd_pid=$piddoneoneif[-z$WHO];然后WHO=rootWD=/elseWD=/home/$WHOfinsenter-t$systemd_pid-m-p--wd=$WDrunuser-m-p-u$WHO如何使用zsh:WHO=`whoami`sudo-E./wslsystemd.sh