Windows与Linux双环境Docker部署实录:从装到跑通的几个关键坎
很多人第一次装Docker是在自己笔记本上,Windows点了几下安装包,重启完发现命令行敲docker没反应;换到Linux服务器上,yum或者apt一条命令下去反而更快。这两种环境我都折腾过,问题不在Docker本身,而在两个系统对内核和网络的处理方式差得太远。下面按实际部署顺序讲,从装到跑起来,每一步卡在哪里、怎么绕。
Windows这头:先过WSL2和Hyper-V这一关
Docker Desktop在Windows上跑,本质是先起一个轻量Linux虚拟机,再把容器塞进去。所以第一个坎是虚拟化层。
- 家庭版Windows默认没有Hyper-V,装的时候会提示启用WSL2,这一步需要BIOS里开虚拟化,不开的话装到一半直接报错退出。
- WSL2的默认内存占用会吃掉宿主机一半,16G的机器上跑两三个容器就开始卡,建议在.wslconfig里把上限压到4G到6G。
装完之后建议立刻改镜像源。默认拉取地址在国内经常超时,换成国内镜像后拉一个nginx:alpine从几分钟缩到十几秒。这一步不花钱,但省下来的等待时间很实在。
Windows上还有个容易忽略的点:端口映射。Docker Desktop会把容器端口绑到宿主机的localhost,但如果你在公司网络里,同事访问你的机器IP是通不了的,得额外做端口转发。我一般先在本地跑通,再决定要不要暴露出去。
Linux这头:命令行干净,但权限和防火墙是暗坑
Linux上装Docker通常就是加源、更新、install三步。装完第一件事是把自己加进docker组,否则每条命令都要sudo,写脚本的时候特别难受。
真正麻烦的是防火墙。CentOS系默认开firewalld,Docker会自己往iptables里插规则,两边打架的结果是容器明明在跑,外部却连不上。我遇到这种情况一般先systemctl stop firewalld测一下,确认是它的问题再决定是关掉还是手工放行端口。
数据卷挂载也是重灾区。宿主机目录权限如果是root,容器里以非root用户跑的应用就写不进去,日志直接报permission denied。解决办法要么改宿主机目录属主,要么在docker run时加--user参数指定UID。这点我没有万能公式,得看应用本身以什么身份跑。
跑通第一个容器:Nginx监听80端口怎么验证
前面环境都顺了,跑一个Nginx最容易验证整条链路。命令大致是docker run -d -p 80:80 --name web nginx。跑完分三步确认。
- docker ps看容器状态是不是Up,端口映射那一列有没有0.0.0.0:80。
- 宿主机上curl localhost,返回Nginx欢迎页说明容器内部没问题。
- 换一台机器curl公网IP,通不了就是防火墙或安全组的事,跟容器无关。
这三步能把问题范围缩到最小。我见过不少人一上来就怀疑镜像有问题,其实八成卡在第三步。
如果是要长期跑的业务容器,建议别用默认的bridge网络,改成自定义网络,容器之间用服务名互相访问,IP变了也不用改配置。这一条对单机多容器部署特别有用。
部署到正式环境时,如果业务本身对延迟敏感、又需要独立资源,我一般会建议直接上物理服务器而不是在虚拟化层上再套一层容器。像香港大带宽物理服务器 IX这种E5-2660*2配32G内存、250M带宽的配置,月付$1669.82,跑Docker宿主机的资源隔离比云主机干净得多,尤其是需要固定IP和稳定出口的场景。
最后给个能直接执行的结论:本地开发用Windows + Docker Desktop,把WSL2内存限制设好、镜像源换掉就够;正式部署上Linux,装完先加docker组、确认防火墙策略,再用Nginx验证一遍链路。别在Windows上硬扛生产环境,那套虚拟化层出问题时排查成本比省下的时间高得多。