1. 安装前的必修课Docker CE到底是什么为什么选它今天不整虚的直接说Docker CE。CE是Community Edition的缩写也就是社区版和它对应的是EEEnterprise Edition企业版。CE免费、开源、迭代快新特性先在CE里验证功能上核心的容器编排、镜像管理、网络隔离、存储卷这些全都有绝大多数个人服务器、中小团队生产环境用的都是CE。你如果只是自己折腾、部署应用、搭CI/CD环境选CE足够了没必要为企业版掏钱也没必要去搞什么“简化版”的三方发行套件官方源装出来的最干净、最好排查问题。我见过很多新手上来就问“Docker和虚拟机有什么区别”其实一句话就能说清虚拟机虚拟的是整台硬件每个虚拟机里都有完整的内核和系统Docker虚拟的是操作系统层所有容器共享宿主机的内核只是把用户态的文件、进程、网络隔离开了。所以容器启动速度是秒级甚至毫秒级一个镜像几百兆就算大的和虚拟机几个G起步完全不在一个量级。这次讲的是Ubuntu和CentOS两条安装路线。标题里写的“Contos”我猜是CentOS的手误这两个系统是目前服务器领域的两大主流阵营一个走apt系一个走RPM系安装方式有同有异。我踩过不少坑比如源没配好导致下载慢成蜗牛、内核版本太旧导致overlay2驱动起不来、systemd里Docker和NAT防火墙打架导致容器访问外网超时……这篇文章就是把这些事一次性说透。2. 安装之前的硬性检查不然后面全是坑2.1 操作系统版本要求不要拿着一个老的Ubuntu 16.04或者CentOS 7.0直接开干Docker对系统版本有明确的最低要求。系统最低版本推荐版本说明Ubuntu22.04 LTS24.04 LTSapt源直接有内核默认满足Ubuntu20.04 LTS20.04 LTS经典老将生产环境存量很大CentOS7.97.97.x系列最后更新的版本CentOS8.x8.5仓库已转Vault需要修改源地址其他--不支持或需要额外内核配置有朋友问Ubuntu 18.04行不行能用但官方仓库已经不太积极维护那套软件包了apt源里可能还是老版本Docker新特性用不上装的时候源配置也得折腾没必要。CentOS 8是个特殊情况上游停更以后默认的yum源全部失效得先把baseos和appstream的源指到镜像站的Vault目录再装Docker这个流程我在后文会讲。2.2 内核版本与存储驱动Docker对内核最基本的要求是3.10以上但这只是最低门槛。现代的Docker推荐用overlay2作为存储驱动它要求内核支持OverlayFS一般4.x以上的内核都没问题。如果内核太老Docker会退回用devicemapper或者vfs前者配置麻烦后者性能差到离谱。检查内核的命令很简单uname -r我实际遇到过一台老机器内核是3.10.0yum装Docker倒是装上了但docker info里Storage Driver显示的是devicemapper拉镜像、启动容器都慢而且有时候莫名其妙的文件读写报错。后来升级内核到5.x才彻底消停。所以装Docker之前先把内核版本确认一下省得后面白折腾。如果你跑的是Ubuntu想确认存储驱动的可用性可以看内核模块modprobe overlay lsmod | grep overlay没输出就说明模块没加载Ubuntu默认会加载CentOS 7默认是xfs文件系统如果当初分区的时候用了ftype0的xfsoverlay2会用不了这个坑后面单说。2.3 系统干净程度与防火墙状态装Docker之前最好先看一眼系统里有没有装过podman、containerd这些容器运行时。有些发行版默认带podman和Docker抢套接字和cgroup管理权启动之后互相干扰。which docker which podman rpm -qa | grep -E docker|podman|containerd # CentOS用 dpkg -l | grep -E docker|podman|containerd # Ubuntu用装了老版本Docker的话建议先彻底卸载后面再说卸载细节。防火墙这块Ubuntu的ufw、CentOS的firewalld如果开着Docker的桥接网络可能会受iptables规则影响。我的建议是先保持防火墙开启Docker装好后会自己写iptables规则关键是别手动去清空iptables不然容器的网络直接就断了。3. Ubuntu上安装Docker CE从零到能跑3.1 卸载旧版本与依赖清理如果系统里装过docker.io、docker-engine这些老包先卸载干净。Ubuntu下这几个包名还不一样注意全卸载。sudo apt-get remove docker docker-engine docker.io containerd runc这一步做不做都不会影响新装但做了图个安心。我遇到过两三次旧版docker.io残留了配置文件导致新装的Docker启动时读到了旧的daemon.json报一些奇怪的参数错误卸载干净再装省得排查半天。3.2 添加官方GPG密钥与apt仓库这里说一个重点不要直接apt install docker.io。你从Ubuntu官方源装的docker.io是阉割版或者老版本依赖陈旧后续compose插件、buildx这些新工具配起来还要走额外渠道麻烦。正路是加Docker官方的apt源虽然下载速度看网络情况但版本新、组件全、升级方便。先装依赖工具sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg然后创建密钥目录并下载GPG密钥sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg这里用--dearmor把ASCII格式的密钥转成二进制放到/etc/apt/keyrings目录权限设成可读。以前很多人习惯把密钥追加到/etc/apt/trusted.gpg.d里但新版apt在Ubuntu 22.04之后不推荐那种方式用独立的keyrings目录更规范apt不会报警告。接着写源文件echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release echo $VERSION_CODENAME) stable | \ sudo tee /etc/apt/sources.list.d/docker.list /dev/null这里用$(dpkg --print-architecture)自动识别架构注意购买ARM服务器比如鲲鹏、飞腾的人这里会自动变成arm64反之x86机器就是amd64。版本代号通过VERSION_CODENAME自动读取Ubuntu 24.04是noble22.04是jammy一行命令解决不用手写。更新一下源索引sudo apt-get update如果这一步提示无法解析download.docker.com说明服务器访问不了官方源解决办法是换成国内的镜像源地址把上面源文件里的download.docker.com替换成镜像站域名即可。具体地址我这里不推广特定服务商你搜索“Docker apt镜像源”就有很多选择选一个顺手的。3.3 安装并配置镜像加速源配好之后安装就是一条命令的事sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugindocker-buildx-plugin是构建镜像要用到的BuildKit增强插件docker-compose-plugin提供docker compose子命令。新手很容易漏掉这两个只装了docker-ce后面想用compose还得再补。建议一步到位全装上。装好之后先别急着用先把镜像加速配置了。Docker从官方仓库拉镜像国内外速度差异极大不配置加速源拉一个几百MB的镜像能等到怀疑人生。修改/etc/docker/daemon.json{ registry-mirrors: [https://你的加速地址] }然后重启Dockersudo systemctl daemon-reload sudo systemctl restart docker用docker info看一下Registry Mirrors字段是否生效。3.4 验证安装并跑起第一个容器sudo docker run hello-world如果能正常打印出“Hello from Docker!”说明整个安装链路是通的。这一步会从镜像仓库拉取一个极小的测试镜像跑完即退很适合做冒烟测试。sudo docker version可以查看客户端和服务端版本注意Client和Server都有才算真的装好。如果Server那部分报错说明Docker守护进程没起来看systemctl status docker排查。4. CentOS上安装Docker CERPM系的正确姿势4.1 卸载历史残留CentOS上老的Docker包名是docker和docker-client不是docker.io。先清理干净sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine如果系统是CentOS 8以上yum已经被dnf接管了但yum命令本身还能用不用纠结本质上都指向dnf。4.2 配置yum源CentOS 7装Docker需要先装yum-utils和device-mapper-persistent-data、lvm2这些是Docker存储驱动和yum源管理要用的底层工具。sudo yum install -y yum-utils device-mapper-persistent-data lvm2然后是核心步骤添加Docker官方yum仓库。sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo同样的如果访问官方源太慢可以把仓库文件里的baseurl替换成国内镜像站路径保持一样。这一步我建议直接做因为在CentOS上不换源后面yum install docker-ce大概率卡在下载几十MB的元数据阶段。如果你是CentOS 8用户yum-config-manager加好源之后会报错说仓库源指向了一个不存在的路径因为CentOS 8的AppStream和BaseOS源都被官方移到Vault目录了。处理方式是编辑/etc/yum.repos.d/CentOS-Linux-*.repo这几个文件把mirrorlist.centos.org的地址注释掉把baseurl改成镜像站的CentOS-8下的对应目录然后再装Docker。4.3 安装与启动sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin注意一个细节yum可能会提示你需要接受GPG密钥或者遇到“没有可用软件包docker-ce”的报错。前者直接按y确认后者大概率是源没生效先跑一下yum makecache把缓存重新建立再装。安装完成后的启动和Ubuntu略有不同CentOS默认不会开机自启需要手动设置sudo systemctl start docker sudo systemctl enable docker不设置开机自启的后果就是服务器重启之后Docker服务不在了所有容器不会自动恢复如果是生产环境这一下就够喝一壶。4.4 CentOS特有的兼容性检查CentOS 7上有几个特有的坑这里必须单独列一下。第一overlay2和xfs文件系统的兼容问题。如果你当初装系统的时候/var/lib/docker这个路径所在的分区用了xfs文件系统并且format的时候没有开启ftype1特性Docker的overlay2驱动就用不了会直接报“xfs: d_type verification failed”或者回退到vfs。怎么看当前分区格式df -Th /var/lib/docker如果是xfs再查ftypexfs_info /dev/你的分区 | grep ftypeftype0就悲剧了常见解决办法是用ext4格式化一个独立分区挂到/var/lib/docker或者重新格式化原分区数据会没慎重。这个问题在CentOS 7默认安装配置里出现概率挺高大家注意一下。第二SELinux问题。CentOS的SELinux默认是enforcing状态Docker官方在CentOS上对SELinux的支持是有限的有时候挂载文件会报权限错误。最简单的做法是给Docker相关的目录放行或者直接临时把SELinux设成permissivesudo setenforce 0但这只是临时生效重启又变回enforcing。要想永久生效就编辑/etc/selinux/config把SELINUXenforcing改成SELINUXpermissive。我自己生产环境是保持enforcing然后给容器目录打上正确的SELinux标签但这套操作对新手太复杂如果你只是学习或者非核心环境设成permissive没什么问题。第三iptables兼容性。CentOS 7默认用的是firewalldDocker启动的时候会在nat表里加自己的规则。如果你在防火墙里手动配置过DOCKER链或者清空过iptables容器网络会非常诡异。处理原则是让firewalld管主机端口让Docker管容器网络两者别互相干预。5. 装完必做的几个动作别急着跑业务5.1 配置镜像加速不是可选项很多人喜欢把这步跳过觉得“反正我网络快不用加速也没什么”。等你真正拉一个node:20或者mysql:8的镜像看着进度条几分钟纹丝不动就该后悔了。镜像加速本质上就是给Docker配置一个registry mirror拉镜像时优先打加速节点没命中再回源。国内公共加速地址有很多选一个稳定的填进去就行。配置方式和前面Ubuntu部分一样编辑/etc/docker/daemon.json。这里再强调一次daemon.json是Docker守护进程的配置文件改完必须重启守护进程才能生效sudo systemctl daemon-reload sudo systemctl restart docker顺便说一句改daemon.json有语法错误的话Docker会直接起不来。改之前最好先用python3 -m json.tool校验一下JSON格式别手滑打个中文逗号进去。5.2 让当前用户免sudo执行docker每次敲docker命令都要加sudo相信我几天之后你就烦了。把当前用户加入docker组sudo usermod -aG docker $USER然后重新登录或者执行newgrp docker让组权限生效。生效之后docker ps这些命令就不用sudo了。注意这里有个安全隐患docker组内的用户等同于root权限容器可以通过挂载宿主机目录来实现任意文件读写所以别随便把用户加进docker组。个人开发机无所谓多用户服务器要谨慎。5.3 调整Docker默认存储目录Docker默认把镜像、容器层、卷都放在/var/lib/docker。如果系统盘不大跑几个镜像就满了。我见过一个服务器根分区只有20GB装了个数据库镜像加日志就飙到95%直接拖垮整机。解决办法是把Docker数据目录迁移到大容量分区。先停服务再迁数据sudo systemctl stop docker sudo mv /var/lib/docker /data/docker # /data是大分区 sudo ln -s /data/docker /var/lib/docker或者直接用daemon.json指定data-root{ data-root: /data/docker }两种方式效果一样我倾向用软链接方式因为这样即使以后重装Docker旧数据也在原地不会因为忘了配置data-root而找不到历史容器。5.4 设置日志轮转防止磁盘被日志撑爆容器日志默认会无限写入宿主机的/var/lib/docker/containers目录很多容器一旦输出日志多比如Nginx访问日志、Java应用堆栈一天就能写几个GB。如果不设轮转磁盘迟早被写满。强烈建议在daemon.json里加上日志限制{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }这样每个容器日志文件达到10MB就会切分最多保留3个文件老的自动删掉。这个配置对已经有容器的环境改完daemon.json并重启Docker之后新容器才生效老容器要重建或者手动重启才生效。6. 实战中的常见问题与排查思路6.1 安装阶段的问题问题1apt update提示没有Release文件或仓库404这种一般是源地址里的系统代号和你当前系统不匹配。比如你的系统是Ubuntu 21.10代号impish官方仓库早就把它对应的目录下线了apt会报404。解决方法是改用代号对应的版本比如升级系统到22.04或者把源里VERSION_CODENAME手动改成jammy但不保证兼容。问题2yum源下载Docker时一直卡住CentOS上最常见的坑是yum源没换镜像元数据下载慢。还有一个冷门原因系统本地DNS解析有问题download.docker.com解析到了IPv6地址但服务器没有IPv6路由。可以加上ip_resolveipv4这个curl参数重新拉仓库文件curl -4 -fsSL https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo问题3gpg密钥导入失败一般是因为系统时间不对https证书校验失败用date看一下系统时间差个几分钟就会出现这种怪问题。同步一下时间sudo ntpdate ntp.aliyun.com6.2 启动与运行阶段的问题问题1docker info提示server version报错先查守护进程状态systemctl status docker journalctl -u docker -n 100大多数情况是daemon.json里配置写错了或者端口被占用。有个很隐蔽的问题如果你自己装了containerd并在非默认路径启动Docker找不到它也会报错。解决方式是卸载掉系统自带的containerd让Docker使用自带的那个。问题2容器内无法访问外网这是老生常谈的问题了。排查顺序宿主机能不能上网排除物理链路问题、宿主机ip_forward是否开启sysctl net.ipv4.ip_forward0就是没开、防火墙nat规则是否完整iptables -t nat -L POSTROUTING链里有没有MASQUERADE规则。CentOS上有个常见原因是NetworkManager把Docker的docker0网桥接管了导致转发异常。把NetworkManager对docker0的托管关掉就行nmcli device set docker0 managedno问题3重启服务器后容器没有自动恢复容器默认重启策略是no就是永不自动重启。启动容器时加--restartalways或者在已有容器的docker update里设置docker update --restartalways 容器名这样宿主机重启后Docker守护进程启动时会自动把容器拉起来。问题4docker compose命令不存在安装了docker-ce但是没装docker-compose-plugin。补上就行Ubuntu下sudo apt-get install docker-compose-pluginCentOS下sudo yum install docker-compose-plugin装完直接docker compose --version注意新版是docker compose中间有空格而不是docker-compose连字符写法后者是旧版Python实现的独立二进制。6.3 卸载与重装想卸载干净重装Ubuntu下sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerdCentOS下sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd删除/var/lib/docker这步要想清楚里面有所有镜像和容器数据删了就真的没了最好提前确认没有需要保留的卷数据。7. 两个发行版安装方式的对照总结把Ubuntu和CentOS的安装流程揉在一起看本质上是同一套思路安装依赖工具、添加官方源、导入密钥、安装主包、启动并验证。区别只在包管理器命令和个别系统特性上。环节UbuntuCentOS包管理器aptyum/dnf依赖安装apt-get install ca-certificates curl gnupgyum install yum-utils device-mapper-persistent-data lvm2仓库配置写apt源到/etc/apt/sources.list.d/用yum-config-manager添加repo文件密钥管理GPG密钥放/etc/apt/keyringsrepo文件内嵌gpgkey配置服务管理systemctlsystemctl特有坑系统代号过期SELinux、xfs ftype、CentOS 8 Vault源不管用哪个系统装完第一件事就是跑docker run hello-world验证。连hello-world都跑不起来后面啥也别谈。我个人在两项安装中最看重的就是源和存储驱动。源决定了你能不能装得上、下载快不快存储驱动决定了你跑起来之后稳不稳。很多容器运行期诡异故障追根溯源都是这两个环节埋的雷。8. 安装收尾后的几点经验之谈我在实际部署过程中体会最深的一条就是别在生产服务器上做“最小化安装后马上跑业务”这种急事。装完Docker总要留十分钟做一次完整的状态体检具体检查三样东西docker info里Server Version和Storage Driver是否正常、daemon.json的JSON语法是否正确、docker run hello-world这种冒烟测试能不能过。另外还有一个常被忽略的小技巧把docker相关命令配置一条系统保留命令历史。因为Docker的命令变化快新语法忘了翻历史记录会很痛苦。在bashrc里加一句export HISTTIMEFORMAT%F %T 配合grep docker ~/.bash_history随时能捞回来上次用的完整命令。关于学习路线我的建议是装好Docker之后别急着上Kubernetes先老老实实玩两周单机Docker。把镜像构建、数据卷、网络模式、compose编排这几个核心概念搞熟练再去看容器编排。否则一上来就是一大堆概念Pod、Deployment、Service、Ingress全糊在一起很难真正消化。这篇文章把Ubuntu和CentOS两个平台上的Docker CE安装完整捋了一遍每一步的坑也都标出来了。你按着操作从一台裸机到能跑容器算上镜像下载等待时间半个小时之内可以搞定。遇到报错别慌先看服务日志日志里给的错误信息通常比你想的直白得多照着关键字去搜大概率能找到解决方案。