在Ubuntu服务器上部署Docker容器,核心工作就两件事:把Docker装好,把存储驱动选对。装Docker本身不难,一条命令或者几步操作就能搞定,但存储驱动的选择直接决定了你的容器性能、稳定性和后续运维成本。很多人装完Docker就不管了,默认用overlay2,结果在高负载场景下出现性能瓶颈甚至数据损坏,才后悔没提前规划。今天这篇文章,我把Ubuntu上Docker安装的完整流程和存储驱动选型的所有细节一次性讲透,不绕弯子,直接给你能落地的方案。
Ubuntu安装Docker的完整步骤Ubuntu安装Docker,推荐走官方仓库安装,不要用系统自带的apt源,因为自带源的版本通常很旧。具体操作如下:先更新包索引,然后安装必要的依赖,接着添加Docker官方GPG密钥和仓库,最后安装Docker Engine。
sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg lsb-release sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装完成后,把当前用户加入docker组,避免每次都用sudo:
sudo usermod -aG docker $USER newgrp docker
验证安装是否成功:
docker --version docker run hello-world
如果看到hello-world容器正常退出,说明Docker已经跑起来了。接下来才是重头戏——存储驱动怎么选。
Docker存储驱动到底是什么Docker存储驱动负责管理容器镜像层和容器可写层的实际存储方式。简单理解:Docker镜像是分层的,每一层都是只读文件系统,容器运行时在最上面加一个可写层。存储驱动就是决定这些层在磁盘上怎么存放、怎么叠加、怎么读写的底层机制。不同的存储驱动在性能、占用空间、稳定性、兼容性上差异巨大,选错了后面会很痛苦。
目前Docker支持的存储驱动主要有:overlay2、btrfs、zfs、vfs、devicemapper、fuse-overlayfs。其中overlay2是当前的默认推荐驱动,绝大多数场景都够用。但如果你的服务器用的是特殊文件系统,或者有特殊性能需求,就需要认真评估其他选项。
overlay2:默认首选,大多数场景够用overlay2是目前Docker官方推荐的默认存储驱动,也是Ubuntu上开箱即用的驱动。它基于Linux内核的OverlayFS,性能好、资源占用低、稳定性高。它的工作原理是把多个只读层叠加在一起,最上面放一个可写层,容器看到的就是一个完整的文件系统。overlay2支持页缓存共享,多个容器共享相同的镜像层时不会重复占用磁盘空间,这是它最大的优势。
overlay2的局限性在于:它要求底层文件系统是ext4或者xfs,不支持btrfs和zfs。如果你的Ubuntu根分区是ext4或xfs,直接用overlay2没问题。但如果你需要在容器内使用一些特殊的文件系统特性,比如透明压缩、快照回滚,overlay2就做不到了。
查看当前使用的存储驱动:
docker info | grep "Storage Driver"
如果显示overlay2,说明你已经在用默认驱动了。如果你想明确指定,可以在daemon.json里配置:
sudo tee /etc/docker/daemon.json <btrfs和zfs:高级用户的选择 如果你的Ubuntu服务器用的是btrfs或zfs文件系统,可以考虑对应的存储驱动。btrfs驱动支持快照和透明压缩,适合需要频繁备份和恢复的场景。zfs驱动则提供了更强大的数据完整性校验、快照、克隆、压缩、去重等功能,适合对数据安全要求极高的生产环境。
但这两个驱动有明显的缺点:第一,它们对底层文件系统有硬性要求,必须格式化成对应的文件系统才能用;第二,zfs在内核模块兼容性上经常出问题,尤其是内核升级后可能需要重新编译模块;第三,性能上zfs和btrfs在某些场景下不如overlay2,特别是小文件随机读写场景。所以除非你确实需要它们的高级特性,否则不建议主动切换。
vfs:最简单但最差的选择vfs驱动是最简单粗暴的方案,它不使用任何联合文件系统技术,每个容器层都是完整的文件系统拷贝。这意味着如果你有一个1GB的镜像,跑10个容器就要占10GB磁盘空间,完全没有层共享。vfs的唯一优点是兼容性最好,几乎不挑底层文件系统,但性能和空间效率都是最差的。除非你在调试或者有极其特殊的兼容性需求,否则绝对不要在生产环境用vfs。
fuse-overlayfs:没有内核支持时的备选fuse-overlayfs是overlay2的用户态实现,适用于那些内核版本太旧、不支持OverlayFS的环境。它通过FUSE(Filesystem in Userspace)在内核外面模拟overlay的行为。性能比overlay2差不少,因为每次文件操作都要经过用户态和内核态的切换。如果你的Ubuntu内核版本低于4.0,又想用类似overlay的功能,可以考虑这个驱动,但要做好性能下降的心理准备。
devicemapper:已经被淘汰的老方案devicemapper曾经是Docker的默认存储驱动之一,基于Linux的设备映射器(LVM/dm)。它支持快照和精简配置,但配置复杂、性能一般、维护成本高。Docker官方已经明确表示不推荐使用devicemapper,新版本中甚至在逐步移除相关支持。如果你还在用这个驱动,建议尽快迁移到overlay2。
存储驱动选型的实操建议给你一个简单的决策树:首先看你的Ubuntu根分区文件系统类型,用df -T命令查看。如果是ext4或xfs,直接用overlay2,不用纠结。如果是btrfs,可以用btrfs驱动,但要确认内核版本支持。如果是zfs,可以用zfs驱动,但要做好内核模块维护的准备。如果你不确定或者不想折腾,就用overlay2,它能覆盖95%以上的场景。
还有一个容易被忽略的点:存储驱动的选择必须在Docker首次启动前确定。如果你已经用某个驱动跑了容器,再想换驱动,必须先停止所有容器、删除所有镜像和容器数据,然后修改配置重启Docker。这是因为不同存储驱动的数据格式不兼容,直接切换会导致数据无法读取。所以在生产环境部署前,一定要提前规划好。
另外,如果你的业务对磁盘IO要求很高,比如数据库容器、日志密集型应用,建议把Docker的数据目录(默认是/var/lib/docker)放在SSD上,并且确保底层文件系统是xfs(xfs在大文件和高并发IO场景下比ext4更有优势)。可以在daemon.json里指定数据目录:
sudo tee /etc/docker/daemon.json <常见问题排查 安装Docker后如果遇到存储驱动相关报错,最常见的情况是overlay2报"backing file system is not supported"。这通常是因为你的根分区不是ext4或xfs,比如用了NTFS或者其他不支持的文件系统。解决办法是重新格式化分区为ext4或xfs,或者换用对应的存储驱动。
另一个常见问题是磁盘空间不足导致容器无法启动。overlay2虽然有层共享,但容器的可写层和临时数据还是会占用空间。建议定期清理无用镜像和容器:
docker system prune -a --volumes这条命令会删除所有未使用的镜像、容器、网络和卷,释放磁盘空间。生产环境建议配合定时任务定期执行。
总结与最佳实践Ubuntu上部署Docker,安装本身是标准化操作,核心难点在存储驱动选型和后续运维。我的建议是:绝大多数情况下选overlay2,配合ext4或xfs文件系统,把数据目录放在高性能磁盘上,定期清理无用数据。不要为了追求所谓的"高级特性"去用zfs或btrfs,除非你真的需要快照、压缩、数据校验这些功能并且有能力维护。存储驱动选对了,Docker才能真正稳定高效地跑起来,后续的容器编排、镜像管理、数据持久化才有坚实的基础。
最后提醒一点,Docker的存储驱动只是容器存储的一层,如果你需要跨主机的持久化存储、数据备份、灾难恢复,还需要结合卷管理(Volume)、备份工具、分布式存储方案一起规划。存储驱动解决的是单机容器层的存储问题,更大的存储架构需要另外设计。把基础打好,后面的扩展才不会出问题。
