彻底摆脱docker-desktop,让你在wsl中没有任何烦恼地使用docker

背景

去你妈的docker-desktop
在今年寒假的时候,我买了3550h的小主机用作个人服务器搭建一些服务,选择了win+wsl的组合,为了当个懒狗所以用了docker+1panel面板,当时网上的教程包括docker官网的教程都是用docker-desktop,最开始简洁的设置和有ui界面确实很nice,但是用到后面

而且docker-deskto默认且只能装在c盘,这就导致
我c盘红的跟我血压一样
更重要的是docker-desktop就跟半成品一样,基本上稳定一周报一次错,我已经不知道这玩意报错过多少次了
so
docker-desktop,f**k u

在wsl中装docker

卸载所有之前相关的docker

这一步可能会导致所有数据丢失,请一定做好备份
先卸载docker-desktop,建议用geek uninstaller
然后重启wsl
powershell中输入

wsl --shutdown

然后点击你的linux那个exe就可以直接开一个有有Linux的cmd窗口
或者

wsl -d <你的linux名称>

在那里面输入

sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get remove docker-ce docker-ce-cli containerd.io

然后删除垃圾数据

rm -r $HOME/.docker/desktop
sudo rm /usr/local/bin/com.docker.cli
sudo apt purge docker-desktop

安装docker

安装必要支持

sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

添加gpg key(内容为ubuntu,如果你是debian就自行把链接中的ubuntu改成debian就行)

#添加 Docker 官方gpg key (可能国内现在访问会存在问题)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 阿里源(推荐使用阿里的gpg KEY)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

添加源

#Docker官方源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null


#阿里apt源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

更新源

sudo apt update
sudo apt-get update

安装

#docker本体
sudo apt install docker-ce docker-ce-cli containerd.io
#docker-compose
sudo apt install docker-compose

安装Docker 命令补全工具

sudo apt-get install bash-completion
sudo curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
source /etc/bash_completion.d/docker.sh

配置wsl/docker

配置wsl2启动docker
添加文件

sudo touch /etc/fstab

更改网络适配器

sudo update-alternatives --set iptables /usr/sbin/iptables-legacy # for ipv4
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy # for ipv6

启用systemd
用文本编辑器打开*/etc/wsl.conf*(不熟悉Linux直接在windows下进入后用文本文档打开就行)
然后添加

[boot]
systemd=true

然后重启(powershell)

wsl --shutdown

在Linux下使用

systemctl start docker

测试是否支持systemd
如果是直接看下一步
如果否接着看
安装distrod

curl -L -O "https://raw.githubusercontent.com/nullpo-head/wsl-distrod/main/install.sh"
chmod +x install.sh
sudo ./install.sh install

等待安装完成后设置开机自启

sudo /opt/distrod/bin/distrod enable --start-on-windows-boot

重启wsl2

wsl --shutdown

然后测试systemd是否正常

systemctl list-unit-files | grep docker

如果该命令没有输出任何结果,,可能是因为 Docker 服务单元没有正确安装。
您可以尝试重新安装 Docker 引擎,并确保在安装过程中没有出现任何错误。
接下来设置非root账户的docker许可
添加docker账户组

sudo groupadd docker

将当前用户添加到用户组

sudo usermod -aG docker $USER

使权限生效

newgrp docker 

测试一下

#查看所有容器
docker ps -a

更新.bashrc文件
编辑 ~/.bashrc文件,并在文件末尾增加如下一行,如果不在.bashrc文件中增加下面这一行命令

#如果没有此行命令,你会发现,当你每次打开新的终端
#你都必须先执行一次 “newgrp docker” 命令
#否则当前用户还是不可以执行docker命令
groupadd -f docker

设置局域网访问

在C:\Users\你的用户名中打开.wslconfig(没有就新建一个)
输入以下配置

[wsl2]
networkingMode=mirrored # 镜像网络模式
dnsTunneling=true #与主机共用dns
autoProxy=true # 与自动与主机共用代理
[experimental]
hostAddressLoopback=true #下面说

这个"hostAddressLoopback"的作用是(转自知乎Memorandum)

默认情况下,loopback的只有127.0.0.1(i.e., localhost),并且强制loopback。也就是说,在wsl2中开启的网络端口(例如通过8022开启ssh登录端口),会通过localhost映射到win11上,可以在win11宿主机使用ssh -p 8022 username@localhost登录,但是通过win11的局域网或公网IP是不能登录的。将这个选项设置为true之后,就可以在宿主机使用局域网或公网IP通过8022端口直接进行wsl2的ssh登录。

如果你有docker服务需要访问的话,在"/etc/docker/daemon.json"中添加如下

{
  iptables": false
}

记得关闭防火墙windows/wsl的防火墙
这样子你就可以用windows的局域网ip/公网ip:wls(docker)的port来访问服务了
如果需要内网穿透也可以直接在windows下穿透127.0.0.1:port
或者windows下ddns,然后用v6访问

安装1panel

官网
这个就附一条官方给的命令,没啥好说的

curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && bash quick_start.sh

接下来你就可以用

1pctl

来查看1panel面板指令

一些docker的镜像源

"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"

愿意折腾可以用cfworker自己搭建docker代理,教程挺多的这里就不阐述了

部分参考
Ubuntu 22.04下Docker安装(最全指引)
小萌-docker安装与使用(飞书文档)
知乎Memorandum

Comment