Docker从装到跑:Windows和Linux两套环境的部署实操

2026-10-05 14:20 1008 次浏览

很多人第一次碰Docker不是在服务器上,而是在自己的笔记本:想跑个开源项目,README第一行写着 docker compose up,结果卡在安装环节。Windows这边最常见的拦路虎是虚拟化和WSL2没开,Linux那边则是装完能用、但拉镜像慢到怀疑网络断了。两套环境的坑不一样,处理顺序也不一样,分开说更省事。

下面按实际动手的顺序走:先装引擎,再解决镜像来源,最后才谈怎么把容器跑起来并让它稳定重启。中间每一步我都会点出可以跳过的部分,以及跳过之后大概会在哪里出问题。

Windows:先确认虚拟化,再装Docker Desktop

Windows装Docker现在基本只有一条路,就是Docker Desktop。但它不是双击下一步就能用,前置条件没满足,装完启动会直接报错退出。

先在任务管理器里看性能页,CPU那一栏会写虚拟化是否已启用。显示已禁用,就得进BIOS开Intel VT-x或AMD-V。这一步不做,后面全是白费。

然后是WSL2。管理员权限打开PowerShell,执行 wsl --install,装完重启。想确认版本,用 wsl --list --verbose 看,默认版本是1的话改成2:wsl --set-default-version 2。Docker Desktop的后端跑在WSL2上,版本不对会报「WSL kernel version too low」这类提示。

装完Desktop,第一次启动会问用WSL2还是Hyper-V后端。除非你有明确的Hyper-V需求,否则选WSL2,资源占用和文件挂载速度都更合适。内存占用可以在Settings里限制,默认它可能吃掉一半物理内存,笔记本16G的话建议限到4G以内。

文件挂载有个容易忽略的点:项目放在Windows盘符下(比如C:\project),WSL2访问要跨文件系统,热重载会明显变慢。放到WSL的Linux文件系统里,比如 /home/user/project,速度差别很大。

Linux:装完引擎,镜像加速是第二步

Linux这边反而简单,一条命令的事。Ubuntu/Debian系用官方的install脚本或者apt装都行,CentOS系走yum。装完先做两件事。

一是把自己加进docker组,免得每条命令都sudo:sudo usermod -aG docker $USER,然后重新登录。二是设置开机自启:sudo systemctl enable --now docker。

真正影响体验的是镜像源。默认从Docker Hub拉,国内环境经常几十KB每秒,一个几百MB的镜像能等到放弃。在 /etc/docker/daemon.json 里配加速地址是常规做法,改完 systemctl restart docker 生效。

不过这几年不少公共加速器时好时坏,我的做法是本地留一份常用镜像。docker save 导出成tar,需要的时候 docker load 回来,比现拉稳。生产服务器上尤其值得这么做,避免上线当天依赖外部网络。

如果你跑的是对外服务,机器本身的线路质量也会影响拉取速度。香港机房的机器在这方面通常比默认出口顺畅,比如香港自营物理服务器(50M)④这种带50M带宽的配置,E5-2686V4加32G内存,跑几个中等规模容器绰绰有余,月付2250元。选它的理由不是性能多强,而是部署阶段少花时间等下载。

跑起来之后:端口、数据卷和重启策略

容器能跑只是开始,真正决定后面省不省心的是这三件事。

  • 端口映射:-p 8080:80 前面是宿主机端口,后面是容器端口。写反了外面访问不到,这是最常见的低级错误。
  • 数据卷:数据库容器一定要挂卷,-v /data/mysql:/var/lib/mysql。不挂的话容器一删数据全没,重建时只能从头来。
  • 重启策略:--restart unless-stopped 适合绝大多数常驻服务。机器重启后容器自动起来,不用登进去手动敲命令。

多个容器一起管,就写 docker-compose.yml。启动顺序用 depends_on 控制,但它只保证启动次序,不保证服务真的就绪。数据库还没初始化完、应用已经连上去了,这种问题靠 depends_on 解决不了,得在应用侧加连接重试。

日志是另一个容易爆的地方。默认json-file驱动不限制大小,跑几个月日志能把磁盘写满。在daemon.json里配 max-size 和 max-file,比如单文件50m、保留3个,基本够用。

最后说个取舍:Windows适合开发和调试,Linux适合长期跑服务。同一套compose文件两边都能用,但别指望Windows上的性能表现和Linux一致,文件IO差距摆在那。开发在Windows、上线在Linux,是多数团队的实际做法。