Docker 在 Windows 与 Linux 上的部署差异:一个运维人的实操笔记
你刚拿到一台新机器,系统是 Windows 还是 Linux 直接决定后面 Docker 怎么装、镜像往哪放、容器能不能正常读写宿主机文件。我见过太多人在 Windows 上装完 Docker Desktop 发现容器里挂载的目录全是空的时候才回头查文档。这篇把两套环境的部署流程和容易踩的坑分开说清楚,不是简单罗列命令,而是讲明白为什么同一份 docker-compose.yml 在两个系统上表现不一样。
Windows 上装 Docker:WSL2 后端是绕不开的坎
Windows 10 和 11 专业版可以直接装 Docker Desktop,家庭版稍微麻烦点但也能装。装完之后默认用 WSL2 做后端,这个选择直接影响到后面所有的操作体验。
WSL2 的好处是 Linux 内核完整,跑原生 Linux 容器没问题。代价是文件系统跨了一层虚拟化,Windows 盘符下的文件在容器里读写会明显变慢。我一般会把项目代码放在 WSL2 的 ext4 文件系统里,也就是 /home/用户名/ 下面,而不是 /mnt/c/ 开头的位置。同样一个 npm install,放在 /mnt/c 下面跑可能比放在 /home 下面慢好几倍,这个差距在构建镜像时会被放大。
安装步骤本身不复杂:
- 在「启用或关闭 Windows 功能」里勾选「适用于 Linux 的 Windows 子系统」和「虚拟机平台」,然后重启
- 去 Docker 官网下载 Docker Desktop 安装包,双击装完重启
- 首次启动会提示安装 WSL2 内核更新包,按提示走完
- 在设置里把 Resources 的内存限制调到物理内存的一半左右,默认值往往偏小
磁盘镜像文件默认放在 C 盘用户目录下的 ext4.vhdx,随着镜像和容器增多会越来越大。我一般会把它移到其他盘,在 Docker Desktop 设置里改 Disk image location 就行,但要注意改之前先清理掉不用的镜像,不然迁移过程会很久。
Linux 上装 Docker:包管理器之外还要管好用户组
Linux 下装 Docker 直接走官方源最省事,Ubuntu 和 Debian 用 apt,CentOS 和 Rocky 用 dnf。装完默认只有 root 能跑 docker 命令,普通用户要用得把自己加进 docker 用户组。
这一步看着简单,但加完组要重新登录才生效。很多人加完组直接在当前终端跑 docker ps 还是报权限错误,以为没加上,其实是 shell 会话没刷新。另外把用户加进 docker 组等于给了这个用户 root 级别的权限,生产环境上这点要想清楚,我一般只在开发机上这么干。
Linux 下镜像和容器数据默认在 /var/lib/docker,这个分区如果一开始没规划好容量,后面很容易被日志和镜像撑满。换盘的话在 /etc/docker/daemon.json 里配 data-root 指到新位置,然后重启 docker 服务。注意迁移前先把 docker 停掉,不然数据可能对不上。
如果你的服务需要长期稳定跑,用云服务器比本地机器省心。秀米云的香港(国际)大带宽vps云服务器月付 $16.49,10G 空间和 20M 带宽做容器编排的入门环境够用,香港机房到国内延迟也低,拉镜像不用等太久。
端口映射与文件挂载:两个系统上最容易出岔子的地方
端口映射在 Linux 上基本是直通,-p 8080:80 写上去就能用。Windows 下因为 WSL2 的网络栈多了一层,有时候 localhost 能访问但局域网其他机器访问不了。这种情况通常要检查 Windows 防火墙有没有放行对应端口,WSL2 的转发规则偶尔也需要手动刷新,重启 Docker Desktop 一般能解决。
文件挂载的问题更隐蔽。Linux 上挂载宿主机目录,容器内进程的 uid 和 gid 跟宿主机是同一套,权限对不上就会写不进去。常见的做法是启动容器时加 --user 参数指定 uid,或者在 Dockerfile 里把容器内用户 uid 改成跟宿主机一致。Windows 上走 WSL2 挂载 /mnt/c 下面的目录,文件权限基本是固定的,容器里想改权限往往改不动。
我的做法是 Windows 开发时把数据卷用 named volume,需要看文件时进容器里看,或者用 docker cp 拷出来。Linux 上就直接 bind mount,配好 uid 之后跟本地开发体验没差别。
镜像构建速度上两个系统差距也明显。Linux 原生跑构建,多阶段构建和缓存命中都很干脆。Windows 下如果代码放在 /mnt/c,每次构建都要把上下文从 NTFS 拷进 WSL2,层数一多就慢得让人想砸键盘。把代码挪到 WSL2 的 ext4 分区能缓解大半。
生产环境选哪套:看的是运维成本不是系统偏好
本地开发用 Windows 加 Docker Desktop 完全没问题,图形界面管理容器方便,跟 IDE 集成也顺。但生产环境上 Linux 是默认答案,不是因为 Windows 不行,而是 Linux 下资源占用更低、没有图形层、出问题查日志更直接。
如果服务要面向国内用户,选个香港或者日本机房的物理机跑 Docker 比在本地折腾 WSL2 稳定得多。秀米云的日本大带宽服务器 XXXV 配 Platinum-8168*2 和 64G 内存,G 口带宽,月付 $1033.50,适合把容器化服务直接放到离用户近的节点上,省掉本地环境不一致带来的返工。
说到底,Docker 部署的难点不在安装命令,而在两个系统对文件系统和网络的处理方式不同。搞清楚 WSL2 的文件系统边界,再把 Linux 下的用户组和存储路径配好,后面基本不会再被环境问题卡住。开发机用 Windows 图方便,上线用 Linux 图稳定,这个组合我试下来最省事。