Docker在Windows和Linux上装完就完事?这几个坑我替你踩过了

2026-10-09 12:08 1004 次浏览

头一回在Windows上装Docker的人,十个里有八个会在启动那一刻愣一下——它要你先装WSL2,装完还要重启,重启完Docker Desktop托盘图标转半天才变绿。Linux这边倒是干脆,一条命令下去就完事,可等你兴冲冲拉第一个镜像,发现下载速度停在几百KB不动,一查源,还是几年前的默认地址。两个平台各有一套别扭的地方,下面按我实际操作时遇到的顺序说。

Windows上装Docker,先想清楚用哪种后端

Docker Desktop在Windows下有两种跑法:一种挂在WSL2上,一种走Hyper-V虚拟机。默认推荐WSL2,原因是启动快、文件系统性能好。代价是它默认会吃掉你一半的物理内存。16G的机器,装完之后WSL2那台虚拟机张嘴就要8G,你本机再开个浏览器和IDE,立刻开始交换。

这个上限可以改。在用户目录下建一个 .wslconfig 文件,写两行:

  • memory=4GB,限制WSL2最多用4G
  • swap=2GB,交换文件别设太大,SSD写入吃不消

改完执行 wsl --shutdown 再重开,内存占用立刻降下来。我一般会给开发机留4到6G,够跑两三个容器,再多就得考虑直接上Linux了。

另一个常被忽略的点是文件挂载。Windows下的项目目录如果放在C盘用户文件夹里,Docker挂载进去读写会经过一层转换,跑Node项目的node_modules能慢到你怀疑人生。把代码放到WSL2的Linux文件系统里,或者干脆放D盘,速度差一截。这点我没做过严格跑分,但体感差异很明显。

Linux上装Docker,源和版本是第一道坎

CentOS 7自带的yum源里,docker包还停在1.13,这个版本连多阶段构建都不支持。Ubuntu 20.04稍微好点,但也不一定是最新的。所以第一步不是install,是先卸干净旧版本,再加官方源。

顺序大致是这样:

  • 先 yum remove docker docker-client docker-common 把残留清掉
  • 装 yum-utils,用 yum-config-manager 添加官方仓库
  • 再 yum install docker-ce,装完确认版本号

国内机器拉镜像慢,得配加速器。但2026年之后不少公共加速地址已经失效,能用的要么收费,要么是自己搭的。如果服务器本身就在海外,比如放在香港或者圣何塞的机器,直连Docker Hub反而比绕一圈加速更快。我一般先测一下 curl -I registry-1.docker.io 的响应时间,超过两秒才考虑加加速。

这里顺带提一句,如果容器要长期跑生产负载,别放在VPS上跟别的服务抢资源。香港裸机云 VII 这种E5-2650双路、32G内存的独立机器,月付134美元,跑十几个容器互不干扰,比在一台共享VPS上折腾cgroup限制省心得多。

跨平台最坑的一步:数据卷和权限

Windows挂载目录进去,容器里看到的文件属主是root,Linux这边如果宿主机用户UID不是1000,写文件就会报permission denied。这个问题在两种平台上表现不一样,排查思路也不同。

Windows下因为走的是DrvFs,权限基本是摆设,容器里chmod出来的结果宿主机不认。Linux下则是实打实的UID映射问题,跑 id 看一下当前用户UID,然后在docker run时加 --user $(id -u):$(id -g) 就能绕过去。

数据卷的命名也有讲究。用 -v /data:/app/data 这种绑定挂载,宿主机目录必须存在;用 -v mydata:/app/data 这种命名卷,Docker自己管理,迁移时用 docker volume inspect 能找到实际路径。生产环境我倾向命名卷,备份和迁移少踩坑。

如果容器需要对外提供服务,端口映射记得写全,-p 8080:80 只监听IPv4,要IPv6得写 -p [::]:8080:80。这种细节不写清楚,上线后才发现访问不了,回头改还得重启容器。

该选哪个平台,看你要跑什么

开发阶段在Windows上装Docker Desktop,图的是图形界面和跟IDE的集成,改代码即时生效。但真到部署环节,Linux还是唯一选择,尤其是要跑数据库、消息队列这类对IO和内存敏感的组件。

我的建议是:本地开发用Windows加WSL2,把内存限制设好;测试和预发环境直接上Linux独立服务器,镜像源和内核参数都能自己控制。预算紧的话,先拿一台便宜机器跑通流程,再决定要不要上配置更高的。容器这东西,配置给够了比调优技巧管用。