1. 安装前的核心思路:别急着敲命令,先想清楚这三件事
最早我在服务器上装Docker的时候,也是上来就 curl -sSL https://get.docker.com/ | sh,一条龙跑完,看着终端刷屏觉得特爽。后来踩过几次坑才意识到,Docker安装本身并不难,真正影响后续使用体验的,是安装前的几个决策。这篇内容就围绕“给Linux主机安装Docker服务”这条主线,把我在不同发行版、不同网络环境、不同使用场景下积累的安装经验完整拆开讲,帮你少走弯路。
先聊三个必须在装之前想清楚的问题。
第一,你的Linux发行版是哪个系?Debian系(Ubuntu、Debian本身、Deepin等)和RHEL系(CentOS、Rocky、AlmaLinux、Fedora)在安装命令、软件包管理器和内核模块加载方式上都有差异,虽然Docker官方提供了统一的便捷脚本,但生产环境我建议还是用发行版对应的仓库来装,便于后续维护和版本锁定。如果你用的是一些国内国产系统(比如统信UOS、麒麟),底层通常也是Debian系或RHEL系的变种,可以先通过 /etc/os-release 确认。
第二,你的服务器能不能直接访问外网?Docker安装的过程需要拉取APT/YUM仓库元数据和GPG密钥,如果机器只有内网IP,或者带宽受限,那就需要提前准备离线安装包或者内网镜像源。这一块很多人装到一半失败,报错信息五花八门,归根到底都是网络问题。
第三,你打算拿Docker干什么?如果只是本地开发环境跑个MySQL、Redis,那普通安装就够了。如果是要跑生产服务、搭Kubernetes集群,或者跑一些对性能有要求的应用,那还需要额外处理存储驱动、cgroup驱动、iptables配置这些细节。我用表格把常见场景和对应要求列出来,方便你对号入座:
| 使用场景 | 安装复杂度 | 需要额外关注的配置 |
|---|---|---|
| 本地开发/学习 | 低 | 无,默认配置即可 |
| 个人服务器跑应用 | 中 | 镜像加速、日志清理策略 |
| 生产环境单机部署 | 中高 | 存储驱动、资源限制、开机自启 |
| Kubernetes集群节点 | 高 | cgroup驱动、iptables/ipvs、内核参数调整 |
我自己在安装前会顺手做一件事:检查系统是否已经装过老版本的Docker或Podman,避免端口和cgroup配置冲突。命令是 docker version 和 podman --version,如果发现残留,先卸载干净再开始。这一步很多人忽略,后面出问题的时候才回头排查,浪费大量时间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 全流程实操:从系统准备到Docker跑起来
2.1 系统基础环境准备
安装Docker前,先把系统基础环境准备好。我习惯先更新索引包,再安装依赖。这里说的依赖包括 apt-transport-https、ca-certificates、curl、gnupg、lsb-release。其中 ca-certificates 是HTTPS证书信任链要用到的,没有它你等下添加GPG密钥和仓库的时候会报证书错误。
Debian系执行:
bash复制sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
RHEL系执行:
bash复制sudo yum install -y yum-utils
这里有个细节:RHEL系需要 yum-utils 来提供 yum-config-manager 命令,后面添加仓库要用。如果你用的是CentOS 8以上的版本,有些发行版默认源里没有 yum-utils,可以改用 dnf config-manager,这一点我在踩坑记录里还会提到。
另外建议顺手关闭防火墙对Docker端口的干扰,或者提前规划好放行策略。默认情况下Docker会用iptables操纵主机防火墙规则,如果你自己装了firewalld或ufw,可能会和Docker的规则冲突。最省事的办法是安装阶段先不纠结,等Docker跑起来再统一调整防火墙,避免安装过程被复杂化。
2.2 添加Docker官方仓库(Debian系)
获取GPG密钥并写入 /usr/share/keyrings/docker-archive-keyring.gpg。这里建议大家用 --write-out 或者 --output 指定路径,不要直接把公钥输出到屏幕,否则后面添加仓库的时候会提示key无法读取。
bash复制curl -fsSL https://download.docker.com/linux/$(. /etc/os-release && echo "$ID")/gpg | sudo gpg --dearmor -o /usr/share
