Docker 在 Windows 和 Linux 上部署,坑点完全不是一回事

2026-09-23 16:42 1005 次浏览

很多人第一次在 Windows 上装 Docker,是冲着「点下一步就行」去的。装完跑了个 nginx 容器,感觉挺顺。等到把公司那套三四个服务组成的应用搬上去,问题就来了:容器之间网络不通、镜像下载慢到怀疑人生、C 盘莫名其妙少了 40G。这时候才发现,Windows 上跑 Docker 和 Linux 上跑 Docker,压根不是同一套逻辑。

我自己两边都用过,Windows 适合开发机,Linux 适合真正跑服务的机器。中间的差异不搞清楚,后面每一层都会返工。

Windows 端:WSL2 是地基,内存和磁盘先规划好

Windows 上装 Docker Desktop,本质是装了一个跑在 WSL2 里的 Linux 虚拟机。你看到的 docker 命令是 Windows 的客户端,真正干活的内核在虚拟磁盘里。这个结构决定了两个必须提前处理的事。

第一是内存。WSL2 默认最多吃掉宿主机一半内存,16G 的机器就是 8G。跑两个 Java 容器加一个 MySQL,很容易把 WSL 撑爆,然后 Windows 本体开始卡。解决办法是在用户目录下建一个 .wslconfig,把 memory 限制到 6GB 或 8GB,别让它无上限地抢。

第二是磁盘。WSL2 的虚拟磁盘文件默认放在 C 盘,用久了能涨到几十 G,而且删了容器空间也不会自动还回来。开发机系统盘只有 256G 的话,建议把这个 vhdx 挪到 D 盘。迁移步骤不复杂,但一定要在 Docker Desktop 完全退出后操作,否则文件被占用。

  • 安装方式:官网下 Docker Desktop 安装包,勾选 WSL2 后端,不要选 Hyper-V 后端
  • 内存限制:.wslconfig 里设 memory=6GB、swap=2GB
  • 镜像加速:在 Docker Desktop 的 Docker Engine 配置里加 registry-mirrors
  • 端口冲突:Hyper-V 会预留一批端口,IIS 或某些游戏服务占用后容器起不来

说到端口冲突,这是 Windows 上最不直观的坑。报错是「端口已被占用」,但你 netstat 查不到任何进程。原因是 Hyper-V 的动态端口范围把这段吃掉了。换我我会直接把容器端口映射到 8000 以上,绕开系统预留区间。

Linux 端:apt 装 docker-ce,别用 snap

Linux 上装 Docker 反而简单,但发行版差异要留意。Ubuntu 和 Debian 走官方源装 docker-ce 最稳,CentOS 系用 yum 或 dnf。有一点我建议避开:Ubuntu 自带的 snap 版 Docker。它的文件路径和权限模型跟标准版不一样,挂载宿主机目录时经常出现权限拒绝,排查起来很费劲。

装完之后两件事必做。一是把当前用户加进 docker 组,不然每条命令都要 sudo。二是配 /etc/docker/daemon.json,写镜像加速和日志轮转。日志这块尤其重要,Docker 默认的 json-file 日志不限制大小,一个跑几个月的容器能把磁盘写满。

Compose 的安装方式也变了。现在推荐用 docker compose 子命令,而不是单独装 docker-compose 二进制。前者跟着 Docker 一起升级,少一个版本不一致的隐患。

容器数据落盘的位置,Linux 上默认在 /var/lib/docker。如果系统盘小、数据盘大,可以在 daemon.json 里用 data-root 指到数据盘。这一步在装完就做,比后期迁移省事得多。真要长期跑生产容器,磁盘 I/O 和内存上限比 CPU 更容易成为瓶颈,一台独立物理服务器在这方面的可控性比共享型实例强,美国硅谷物理服务器8这类 E5 2698v4*2 / 64G / 100M 的配置,用来跑多容器环境时不会因为邻居抢占而抖。

跨平台的那条线:什么该放容器,什么不该

两边都装好之后,真正决定体验的是你把什么塞进容器。数据库放容器里跑开发环境没问题,生产环境我一般不建议,数据卷的持久化和备份逻辑比裸机装麻烦。反过来,无状态的应用服务、定时任务、反向代理,放容器里收益最大。

镜像构建也要分平台。Windows 上构建的镜像默认是 linux/amd64,如果你的服务器是 ARM 架构就得加 --platform 参数,否则拉下来跑不了。这个错误报得很晚,通常要到容器启动才暴露。

还有一点经常被忽略:Windows 和 Linux 的行尾符不一样。挂载宿主机目录进去的 shell 脚本,在 Windows 上编辑过之后带 CRLF,进容器执行会报「no such file or directory」。用 .gitattributes 统一成 LF,能省掉很多莫名其妙的调试时间。

最后给个直接结论。开发机用 Windows + WSL2,把内存和磁盘先规划好,够用。真要对外提供服务,还是 Linux 上装 docker-ce,配好日志轮转和数据盘。容器本身不挑平台,但平台决定了你后期要花多少时间在环境问题上。预算有限先在一台机器上把 Compose 跑顺,业务量上来再考虑拆分。