断网也能跑!CentOS7离线环境安装Docker20全流程,一包带走不翻车
断网也能跑!CentOS7离线环境安装Docker20全流程,一包带走不翻车

机房没外网、甲方不给通、安全红线卡脖子,Docker20却偏要装——这活儿我上周刚干完,踩坑三小时,整理成这份笔记,照着敲命令,保你一次过。
一、先搞清楚:离线到底缺什么
CentOS7最小化装完,默认没docker-ce,也没依赖containerd.io、docker-ce-cli、docker-ce-rootless-extras。离线环境最烦的是“缺包连锁反应”,所以先把完整rpm全家桶拖走,别指望一个个下,到时候版本号对不上直接傻眼。
二、准备能上网的“中转机”
找台能连公网的同款CentOS7虚拟机,配置和离线机尽量一致,内核版本差太多会踩ABI坑。用yumdownloader一把梭,命令如下:
yum install -y yum-utils

mkdir /root/docker20-offline
cd /root/docker20-offline
yumdownloader --resolve --destdir=. docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io-1.6.20 docker-ce-rootless-extras-20.10.24
执行完目录里会躺几十个rpm,一个都不能少,少一个回头离线机就报“xxx.so缺失”。
三、打包、搬运、校验
tar czf docker20-rpms.tar.gz *.rpm

scp docker20-rpms.tar.gz root@离线机:/root/
传完先别急着装,md5sum校验一下,机房U盘经常坏,文件缺字节装到一半才报错,哭都来不及。
四、离线机本地repo套路
CentOS7离线环境最怕依赖地狱,自建本地repo最稳:
tar xf docker20-rpms.tar.gz
createrepo -v .
没createrepo就提前在能上网的机器上rpm下载好一起打包。接着写repo文件:
[docker20-local] name=Docker 20 Local baseurl=file:///root/docker20-offline gpgcheck=0 enabled=1 EOFcat > /etc/yum.repos.d/docker20-local.repo <
执行yum makecache生成本地缓存,看到“元数据下载完毕”才算成功。
五、卸载旧版本防冲突
很多服务器装过老docker,先清干净:
yum remove -y docker docker-client docker-common docker-engine
别怕删多,离线环境没有业务在跑,留旧包只会让20版本启动失败。
六、正式安装Docker20
一条命令搞定:
yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io-1.6.20 docker-ce-rootless-extras-20.10.24
看到“Complete!”后,先别systemctl start,把镜像存储目录改到数据盘,防止根目录爆满:
mkdir -p /data/docker/lib
vi /etc/docker/daemon.json
{
"data-root": "/data/docker/lib",
"registry-mirrors": ["https://reg-mirror.example.com"]
}
离线环境registry-mirrors可留空,但data-root必须改,血泪教训/var/lib/docker撑爆过生产盘。
七、启动并设置开机自启
systemctl daemon-reload
systemctl enable --now docker
docker info | grep -i version能看到Server Version: 20.10.24,版本号对上就稳了。
八、离线导入镜像的两种姿势
没网怎么跑容器?提前在有网机docker pull好,docker save导出:
docker pull nginx:1.25
docker save nginx:1.25 | gzip > nginx125.tar.gz
搬到离线机再docker load:
gunzip -c nginx125.tar.gz | docker load
load完记得docker images确认标签,别等k8s调度时才发现镜像名拼错。
九、防火墙与SELinux别背锅
CentOS7默认firewalld会拦截容器端口,离线环境也常强制开SELinux。一次性解决:
firewall-cmd --permanent --add-masquerade
firewall-cmd --permanent --zone=trusted --change-interface=docker0
firewall-cmd --reload
setsebool -P containerusecephfs on 2>/dev/null || true
别图省事直接disabled,安全扫描过不去,还得返工。
十、常见报错速查表
1. Job for docker.service failed: 启动失败
/var/log/messages里搜“overlay2”,多半是内核版本低于3.10.0-1062,升级kernel-lt或加引导参数。
2. containerd不断重启
检查/etc/containerd/config.toml里systemd_cgroup = true是否与docker daemon.json的exec-opts冲突,留一个即可。
3. docker pull报x509: certificate signed by unknown authority
离线仓库用自签证书,把ca.crt扔进/etc/docker/certs.d/仓库地址/ca.crt,重启docker。
十一、一键回滚脚本
万一20版本与业务打架,留条后路:
#!/bin/bash
systemctl stop docker
yum history undo last -y
systemctl start docker
echo "已回滚至上一版本,docker info查看确认"
提前chmod +x rollback.sh,真出问题时两分钟搞定,领导都来不及发飙。
十二、总结清单
1. 能上网的中转机一次性yumdownloader全家桶
2. createrepo建本地源,别让yum去网络抓瞎
3. 先卸旧包再装20,版本号写全,防止yum装到最新21
4. 改data-root到数据盘,日志别丢/var/log/messages
5. 离线镜像用docker save/load,别手敲tar
整套流程我替你在生产环境跑过三遍,照着抄作业就行。断网装Docker20听着吓人,其实就是把“在线自动解决依赖”这一步提前做完,后面该干嘛干嘛。祝你一次通关,早点收工回去打游戏。
