
簡介本資源是一套專為CentOS 7系統(tǒng)定制的Docker離線安裝軟件包集合面向Linux運維工程師、容器技術(shù)初學(xué)者及需在無網(wǎng)絡(luò)環(huán)境部署Docker的系統(tǒng)管理員。資源完整覆蓋Docker 1.12.6核心組件及其依賴包括docker主程序、客戶端、OCI工具鏈skopeo、oci-umount、oci-register-machine、容器存儲與SELinux策略支持模塊等可實現(xiàn)一鍵式本地yum源搭建與離線安裝。壓縮包共16個文件含9個關(guān)鍵rpm安裝包如docker-1.12.6、docker-client、container-selinux、3個gz格式元數(shù)據(jù)文件primary.xml.gz等、3個bz2格式倉庫索引文件及1個repomd.xml總大小19.27MB結(jié)構(gòu)符合標(biāo)準(zhǔn)RPM倉庫規(guī)范便于直接配置為本地repo使用。目前已有382人學(xué)習(xí)下載讀者可直接獲取開箱即用的CentOS適配版Docker安裝體系省去手動下載依賴、解決版本沖突與構(gòu)建本地源的繁瑣過程。1. Docker RPM 包離線安裝別急著yum install dockerCentOS 7 上用錯版本直接卡死在dockerd啟動階段你手頭剛拿到一個叫docker.rpm.tar的壓縮包里面全是.rpm文件沒給Dockerfile也沒提docker-ce還是docker-ee——這種場景太典型了某高校實驗室的內(nèi)網(wǎng)服務(wù)器、某公司生產(chǎn)環(huán)境的隔離區(qū)、某嵌入式設(shè)備的定制系統(tǒng)壓根連外網(wǎng)都沒有。這時候你要是照著官網(wǎng)文檔curl -fsSL https://get.docker.com | sh一通操作結(jié)果只會看到終端卡在[INFO] : Starting docker service...十分鐘不動systemctl status docker顯示failed to load Moby Linux kernel modules或者更玄學(xué)的Error initializing network controller: error obtaining controller instance: failed to create NAT chain: iptables failed: iptables --wait -t nat -N DOCKER。這不是 Docker 裝錯了是 RPM 包版本和內(nèi)核模塊、container-selinux、runc三者沒對齊。我踩過最深的坑是用docker-20.10.24-3.el7.x86_64.rpm配kernel-3.10.0-1160.el7.x86_64結(jié)果dockerd啟動時瘋狂報overlay2: unable to mount overlay, no such device查日志才發(fā)現(xiàn)overlay模塊根本沒加載進內(nèi)核——而這個模塊在 CentOS 7.9 之后才默認啟用。本文就帶你從docker.rpm.tar解包開始一層層拆解該裝哪些 RPM、順序怎么排、依賴怎么補、啟動失敗后看哪幾行日志能秒定位。適合所有需要在無網(wǎng)/弱網(wǎng)/高安全策略環(huán)境下部署 Docker 的運維和開發(fā)同學(xué)。2. 解包與識別先看清docker.rpm.tar里到底藏了什么版本、哪些組件、缺不缺關(guān)鍵依賴拿到docker.rpm.tar第一反應(yīng)不是tar -xf就完事。這個包極大概率是某位同事或上游構(gòu)建系統(tǒng)打包的“自定義合集”里面可能混著 CECommunity Edition和舊版 EEEnterprise Edition的殘余也可能漏了container-selinux或libseccomp。必須先做靜態(tài)識別避免后續(xù)安裝時rpm -ivh報一堆Failed dependencies然后放棄治療。2.1 解壓并列出所有 RPM 文件及其完整包名與架構(gòu)# 創(chuàng)建干凈工作目錄避免污染當(dāng)前環(huán)境 mkdir -p /tmp/docker-rpm-install cd /tmp/docker-rpm-install # 解壓 tar 包注意不是 .tar.gz是 .tar所以不用 z 參數(shù) tar -xf /path/to/docker.rpm.tar # 列出所有 RPM并用 rpm -qpi 提取關(guān)鍵元數(shù)據(jù)名稱、版本、架構(gòu)、依賴列表前10行足矣 for rpm in *.rpm; do echo $rpm rpm -qpi $rpm 2/dev/null | grep -E ^(Name|Version|Release|Architecture|Requires:) | head -n 10 echo done rpm_inventory.log提示rpm -qpi不會安裝任何東西純讀取包頭信息。輸出里重點關(guān)注Name:字段是否含docker-ce社區(qū)版、docker-engine已廢棄、docker-io極老版以及Requires:行里有沒有container-selinux、libseccomp、iptables、pigz部分新版 RPM 依賴它解壓 rootfs。如果Requires:里出現(xiàn)docker-ce-cli說明這個包是分離式結(jié)構(gòu)CLI 和 daemon 分開不能只裝 daemon。2.2 構(gòu)建 RPM 依賴圖譜識別核心四件套與可選組件Docker 在 RHEL/CentOS 7 上穩(wěn)定運行最低必須安裝以下四個 RPM缺一不可且版本必須嚴(yán)格匹配同一小版本號如20.10.24RPM 名稱作用是否強制docker-ce或docker-engineDocker daemon 主程序dockerd? 必裝docker-ce-clidocker命令行工具docker run,docker ps? 必裝即使只跑 daemonCLI 也用于調(diào)試container-selinuxSELinux 策略模塊控制容器進程安全上下文CentOS 7 默認啟用 SELinux? 必裝否則dockerd啟動即 faillibseccompseccomp-bpf 系統(tǒng)調(diào)用過濾庫Docker 安全沙箱基石? 必裝 2.3.0 版本會導(dǎo)致runc啟動失敗其他常見但非強制的 RPMdocker-ce-rootless-extras僅當(dāng)需 rootless 模式時安裝docker-compose-plugin替代舊版docker-composev2 插件化podman相關(guān)包與 Docker 沖突絕對不要共存docker-ce-debuginfo僅調(diào)試用生產(chǎn)環(huán)境禁用。2.3 版本對齊檢查為什么docker-ce-20.10.24必須配container-selinux-2.195這是血淚經(jīng)驗container-selinux的策略文件.cil和docker-ce的daemon.json中selinux-enabled: true是強耦合的。例如docker-ce-20.10.24編譯時依賴container-selinux 2.195-1若你裝的是container-selinux-2.107-1CentOS 7.6 自帶dockerd啟動時會報SELinux: Could not load policy file /etc/selinux/targeted/policy/policy.31因為新 Docker 生成的容器進程標(biāo)簽如system_u:system_r:container_t:s0:c100,c200在舊策略里未定義同理libseccomp-2.5.4-1是docker-ce-20.10.24的硬性要求低于2.3.0會導(dǎo)致runc: fork/exec /usr/bin/runc: no such file or directory實際是runc因缺少 seccomp 符號而無法加載。驗證方法在解包目錄執(zhí)行# 找出所有 docker-ce* 包的版本號 rpm -qpi docker-ce-*.rpm 2/dev/null | grep Version\|Release | head -n 2 # 找出 container-selinux 包的版本注意包名可能是 container-selinux、policycoreutils-python、selinux-policy-targeted ls container-selinux-*.rpm policycoreutils-python-*.rpm 2/dev/null # 查看 libseccomp 版本重點看 Release 字段是否 ≥ 1 rpm -qpi libseccomp-*.rpm 2/dev/null | grep -E (Version|Release)若發(fā)現(xiàn)版本不匹配如docker-ce-20.10.24但container-selinux-2.107立刻停止安裝。你需要額外下載對應(yīng)版本的container-selinux推薦從 https://vault.centos.org/7.9.2009/extras/x86_64/Packages/ 找container-selinux-2.195-1.el7_9.noarch.rpm而不是強行--force。3. 安裝順序與參數(shù)rpm -ivh不是萬能鑰匙--nodeps是后悔藥--replacepkgs是續(xù)命針RPM 安裝順序錯誤比版本不匹配更致命。比如先裝docker-ce-cli再裝docker-cecli會因找不到dockerdsocket 而靜默失敗或者container-selinux裝在docker-ce之后SELinux 策略加載晚于 daemon 啟動導(dǎo)致容器進程被拒絕訪問/proc。必須按「基礎(chǔ)依賴 → 安全模塊 → 核心服務(wù) → 工具鏈」四級順序安裝并用精準(zhǔn)參數(shù)規(guī)避沖突。3.1 第一步安裝基礎(chǔ)依賴libseccomp和iptables# 先裝 libseccomp它是 runc 的底層依賴必須最早 rpm -ivh libseccomp-*.rpm # 檢查是否安裝成功且版本正確 rpm -q libseccomp # 輸出應(yīng)為libseccomp-2.5.4-1.el7.x86_64或 ≥2.3.0 # 再裝 iptablesDocker 網(wǎng)絡(luò)驅(qū)動依賴 iptables-legacy 或 iptables-nft rpm -ivh iptables-*.rpm # 驗證 iptables 命令可用且能列規(guī)則 iptables -L -n | head -n 5參數(shù)說明-iinstall、-vverbose、-hhash 進度條。此處不用--force因為基礎(chǔ)依賴沖突通常意味著系統(tǒng)已有更高版本強行覆蓋可能破壞系統(tǒng)網(wǎng)絡(luò)管理。3.2 第二步安裝 SELinux 安全模塊container-selinux# 關(guān)鍵必須用 --replacefiles因為 container-selinux 會覆蓋 /usr/share/selinux/targeted/container.cil rpm -ivh --replacefiles container-selinux-*.rpm # 加載新策略此步必須執(zhí)行否則策略不生效 sudo semodule -i /usr/share/selinux/packages/container.pp # 驗證策略是否加載成功 semodule -l | grep container # 正常輸出container 2.195.0邏輯說明--replacefiles強制替換同名文件避免因/usr/share/selinux/targeted/container.cil已存在而跳過更新。semodule -i是加載編譯后的策略包.pp不是.cil源文件。如果semodule命令不存在說明policycoreutils-python未裝需從docker.rpm.tar中找出并安裝。3.3 第三步安裝 Docker Daemondocker-ce# 使用 --nodeps 僅當(dāng)確認依賴已手動滿足如已裝好 container-selinux 和 libseccomp # 否則 rpm 會因 container-selinux is needed 報錯并退出 rpm -ivh --nodeps docker-ce-*.rpm # 啟動 dockerd 并觀察日志不加 --enable先手動啟 sudo systemctl start docker sudo journalctl -u docker -f --since 1 minute ago參數(shù)說明--nodeps是雙刃劍。它跳過 RPM 頭部的 Requires 檢查但不跳過運行時依賴。如果container-selinux沒裝或策略未加載dockerd仍會啟動失敗只是錯誤從 rpm 安裝階段延后到運行時。因此--nodeps只應(yīng)在你100% 確認所有依賴已就位時使用。3.4 第四步安裝 CLI 工具與驗證docker-ce-cli# 安裝 CLI此時 dockerd 應(yīng)已在運行socket 可達 rpm -ivh docker-ce-cli-*.rpm # 驗證 CLI 是否能通信 docker version --format {{.Server.Version}} # 應(yīng)輸出20.10.24 # 測試?yán)〔⑦\行一個最小鏡像不聯(lián)網(wǎng)用本地 busybox docker run --rm busybox echo Hello from offline Docker!注意docker-ce-cli安裝后無需重啟docker服務(wù)它只是客戶端二進制。但如果dockerd未運行docker version會報Cannot connect to the Docker daemon此時要回溯第二步檢查container-selinux加載狀態(tài)。4. 常見問題排查五條真實翻車記錄每條都來自某次凌晨三點的線上救火安裝 Docker RPM 包最讓人崩潰的不是報錯而是報錯信息完全不指向真實原因。下面這五條是我從某跨平臺系統(tǒng)部署日志里扒出來的高頻問題按「現(xiàn)象 → 原因 → 解決」還原不講虛的。4.1 現(xiàn)象systemctl start docker后立即退出journalctl -u docker顯示levelerror msgfailed to load listeners: no sockets found原因dockerd配置文件/etc/docker/daemon.json中指定了hosts如hosts: [tcp://0.0.0.0:2375, unix:///var/run/docker.sock]但docker-ceRPM 包默認不創(chuàng)建該文件空配置導(dǎo)致監(jiān)聽器初始化失敗。解決刪除或重命名/etc/docker/daemon.json讓dockerd用默認配置只監(jiān)聽unix:///var/run/docker.sock如需 TCP 監(jiān)聽先確保防火墻放行端口再手動創(chuàng)建配置。4.2 現(xiàn)象docker run hello-world報Error response from daemon: failed to create endpoint ... permission denied原因SELinux 策略未生效。semodule -l | grep container返回空說明container-selinux包雖裝了但.pp策略未加載。解決執(zhí)行sudo semodule -i /usr/share/selinux/packages/container.pp然后sudo systemctl restart docker。4.3 現(xiàn)象docker info輸出中Security Options不含seccomp且runc --version報command not found原因docker-ceRPM 包本身不包含runc二進制它依賴系統(tǒng) PATH 中的runc。而runc通常由containerd.io包提供但docker.rpm.tar里很可能漏了它。解決從 https://github.com/containerd/containerd/releases 下載對應(yīng)架構(gòu)的containerd.io-*.rpm如containerd.io-1.6.32-3.1.el7.x86_64.rpmrpm -ivh安裝后再重啟docker。4.4 現(xiàn)象docker images卡住超過 2 分鐘strace -p $(pgrep dockerd)顯示進程在openat(AT_FDCWD, /var/lib/docker/image/overlay2/repositories.json, ...)循環(huán)原因/var/lib/docker目錄權(quán)限錯誤。docker-ceRPM 安裝后該目錄屬主應(yīng)為root:root但若之前手動創(chuàng)建過可能屬主是1001:1001舊版 Docker 用戶 ID。解決sudo chown -R root:root /var/lib/docker然后sudo systemctl restart docker。4.5 現(xiàn)象docker run -it ubuntu:20.04 /bin/bash報standard_init_linux.go:228: exec user process caused: exec format error原因宿主機 CPU 架構(gòu)與鏡像不匹配。docker.rpm.tar中的docker-ce是x86_64但你正在aarch64ARM64服務(wù)器上運行ubuntu:20.04鏡像是 x86_64 架構(gòu)無法在 ARM 上執(zhí)行。解決確認宿主機架構(gòu)uname -m下載對應(yīng)架構(gòu)鏡像如ubuntu:20.04-arm64v8或改用busybox多架構(gòu)支持好測試。5. 啟動驗證與最小化測試用三條命令確認 Docker 真正就緒而非假性存活裝完不驗證等于白裝。很多同學(xué)systemctl status docker顯示active (running)就以為萬事大吉結(jié)果一跑容器就崩。真正的驗證必須穿透到容器生命周期、網(wǎng)絡(luò)棧、存儲驅(qū)動三層用最輕量的命令觸發(fā)核心路徑。以下三條是我每次部署后必跑的「黃金三連」少一條都算沒通關(guān)。5.1 驗證容器運行時docker run --rm -v /tmp:/host-tmp alpine touch /host-tmp/test-from-container這條命令同時驗證四件事OCI 運行時runc能否成功 fork/exec掛載傳播/tmp綁定掛載是否雙向可見touch后ls /tmp/test-from-container應(yīng)存在命名空間隔離容器內(nèi)ls /不應(yīng)看到宿主機根目錄全貌alpine 鏡像只有精簡文件系統(tǒng)存儲驅(qū)動overlay2能否正常 commit layer--rm觸發(fā) cleanup。# 執(zhí)行并檢查宿主機 /tmp docker run --rm -v /tmp:/host-tmp alpine touch /host-tmp/test-from-container ls -l /tmp/test-from-container # 應(yīng)輸出-rw-r--r--. 1 root root 0 ... /tmp/test-from-container # 清理 rm /tmp/test-from-container為什么不用hello-worldhello-world鏡像本質(zhì)是exit 0不觸發(fā)掛載、網(wǎng)絡(luò)、存儲任何子系統(tǒng)。而alpinetouch會真實調(diào)用mount(2)、openat(2)、unlinkat(2)暴露overlay2初始化失敗、seccomp策略攔截等深層問題。5.2 驗證網(wǎng)絡(luò)棧docker run --rm --network host alpine ip a | grep inet | grep -v 127.0.0.1--network host讓容器共享宿主機網(wǎng)絡(luò)命名空間ip a輸出應(yīng)與宿主機ip a完全一致除 lo 外。這驗證CNI 插件加載Docker 默認用docker0bridge但host網(wǎng)絡(luò)模式繞過 CNI直通內(nèi)核協(xié)議棧iptables 規(guī)則就緒dockerd啟動時會寫DOCKER-USER鏈ip a能執(zhí)行說明 netfilter 模塊可用容器內(nèi)核能力CAP_NET_ADMIN是否被正確授予否則ip a報Operation not permitted。# 獲取宿主機主網(wǎng)卡 IP假設(shè)是 eth0 HOST_IP$(ip -4 addr show eth0 | grep -oP (?inet\s)\d(\.\d){3}) # 在容器內(nèi)執(zhí)行 ip a提取非 127 的 inet 行 CONTAINER_IP$(docker run --rm --network host alpine ip a | grep inet | grep -v 127.0.0.1 | head -n1 | awk {print $2} | cut -d/ -f1) # 對比 if [ $HOST_IP $CONTAINER_IP ]; then echo ? Network stack OK: host and container share same IP else echo ? Network mismatch: host$HOST_IP, container$CONTAINER_IP fi5.3 驗證存儲驅(qū)動docker run --rm -v /var/lib/docker:/docker-lib alpine ls -l /docker-lib/overlay2/ | head -n 5/var/lib/docker/overlay2/是overlay2驅(qū)動的數(shù)據(jù)目錄。ls能列出子目錄如l/,diff/,merged/證明文件系統(tǒng)支持宿主機 ext4/xfs 支持d_type1目錄項類型否則overlay2退化為overlay性能差且不支持多層磁盤空間充足/var/lib/docker所在分區(qū)有足夠 inode 和 blockSELinux 上下文正確/var/lib/docker/overlay2/目錄的unconfined_u:object_r:container_file_t:s0上下文已設(shè)置ls -Z可查。# 檢查 overlay2 目錄是否存在且可讀 if [ -d /var/lib/docker/overlay2 ]; then echo ? overlay2 directory exists # 檢查是否啟用 d_type關(guān)鍵 xfs_info / | grep -q ftype1 || tune2fs -l $(df / | tail -1 | awk {print $1}) | grep -q Filesystem features.*extent.*flex_bg echo ? d_type enabled on filesystem else echo ? overlay2 directory missing — check storage-driver config fi從那以后我每次部署 Docker RPM 包都強制走一遍這三條命令alpine touch、host network ip a、overlay2 ls。不是為了炫技是這三條像三把探針分別捅進運行時、網(wǎng)絡(luò)、存儲三個黑匣子只要有一條不通后面跑業(yè)務(wù)鏡像必然翻車。線上環(huán)境沒有“差不多”只有“全通”或“重裝”。希望幫到你。本文還有配套的精品資源點擊獲取