Docker在Windows和Linux上的部署差异:我踩过的三个坑
第一次在Windows上跑Docker的人,通常会在两个地方卡住:一是装完Docker Desktop发现C盘少了几十GB,二是用-v挂载本地目录时路径怎么写都不对。Linux这边反而安静得多——装完docker-ce,一条docker run就能跑起来。但真到了生产环境,两个平台的差别才真正暴露出来。
这篇把部署流程拆成Linux和Windows两条线,重点讲清楚哪些步骤可以照搬、哪些必须改。不是教程式的命令罗列,而是把容易翻车的地方先标出来。
Linux:从装到跑通,半小时够了
Ubuntu 22.04或者Debian 12上,官方脚本装Docker Engine就一条命令的事。装完先别急着拉镜像,改一下默认存储位置更省心——/var/lib/docker默认在系统盘,跑几个大镜像很快就满了。我一般会挂一块独立数据盘,把data-root指过去。
具体操作:编辑/etc/docker/daemon.json,加上"data-root": "/data/docker",然后systemctl restart docker。这一步在部署早期做,比后期迁移省事得多。
接下来是网络。Docker默认的bridge网络在单机场景够用,但如果容器要互相访问又不想暴露端口到宿主机,建一个自定义bridge网络更干净。docker network create mynet之后,所有容器加--network mynet就能通过容器名互相解析。
权限方面,把当前用户加进docker组能省掉每条命令前面的sudo。但这等于给了这个用户root权限——生产机上我一般不加,宁可多敲几个sudo。
Windows:WSL2是默认答案,但C盘会被吃掉
Docker Desktop在Windows上的后端默认走WSL2。第一次装完,WSL的虚拟磁盘文件(ext4.vhdx)放在C盘用户目录下,而且它会随着镜像和容器增长不断膨胀。拉一个40GB的镜像,C盘可能直接少50GB。
解决办法有两个。一是在Docker Desktop设置里把镜像存储位置改到D盘,Settings → Resources → Disk image location。二是干脆在WSL2里手动装Docker Engine,不依赖Docker Desktop——这样WSL发行版本身可以放在任意盘。
路径映射是另一个高频问题。Windows下挂载D盘的项目目录,路径要写成//d/project,不是D:\project。在Git Bash里还要再加一层转义,写成/d/project。这个细节不搞清楚,容器启动时报mount denied是常事。
文件系统性能也差得明显。WSL2访问Windows文件系统(/mnt/c/...)比访问WSL内部文件系统慢不少。如果项目代码在Windows盘上,容器里跑npm install或者composer install会明显卡顿。我一般把代码放在WSL的home目录下,用VS Code的Remote-WSL插件编辑,流畅度接近原生Linux。
真正值得花钱的地方:把镜像仓库放在离你近的机器上
不管Windows还是Linux,拉镜像慢都是最影响体验的一环。Docker Hub在国内的访问速度不稳定,配镜像加速器是一方面,但加速器也有被限流的时候。
如果团队规模不大,我会建议自建一个轻量registry,放在延迟低的线路上。比如香港大带宽(20M)高速云服务器,2核4G的配置跑registry完全够用,20M带宽拉一个500MB的镜像大概两三分钟。月付$10.46,比买第三方加速服务划算,而且镜像完全自己控制。
对于需要在多地部署的场景,可以在香港和新加坡各放一个registry做镜像同步。新加坡节点推荐新加坡大带宽云服务器 ⑰,8核10G的配置,20M带宽,月付$25.24。两地registry之间用cron定时同步,国内拉香港、东南亚拉新加坡,互不干扰。
部署之后:日志、重启策略和资源限制
容器跑起来只是开始。两个平台都要注意的几件事:
- 日志不加限制会无限增长。在daemon.json里配"log-driver": "json-file"和"log-opts": {"max-size": "10m", "max-file": "3"},单容器日志最多占30MB。
- --restart unless-stopped比always更实用,手动停掉的容器不会自己爬起来。
- 内存和CPU限制用--memory和--cpus,别让一个容器把宿主机吃满。
Windows上还有一个坑:Docker Desktop的自动更新有时会在半夜重启WSL,导致容器全部停掉。如果这台机器跑的是需要长期在线的服务,把自动更新关掉,或者干脆用Linux服务器。
选Linux还是Windows,我的判断很简单:开发机用Windows图顺手没问题,但跑生产容器,Linux是唯一选择。不是因为Windows不行,而是Linux上你能控制的东西多一层——内核参数、cgroup、存储驱动,出问题时排查路径更短。至于机器放哪里,香港节点对国内访问友好,新加坡覆盖东南亚,看你的用户在哪。