
簡介面向在國產(chǎn)化服務(wù)器環(huán)境中部署容器運行時的運維人員與開發(fā)者的實操型手冊聚焦銀河麒麟 V10 SP1 Server 無法直接獲取 docker server 軟件包這一常見障礙給出可行的版本選擇與落地路徑。壓縮包內(nèi)共 1 個 docx 文檔約 17KB篇幅精煉按配置 yum 源、通過 yum 安裝 docker 兩大模塊編排并附目錄便于快速定位章節(jié)。文檔給出了阿里第三方源與麒麟官方源兩份 repo 配置寫法并以 docker-ce-cli 18.09.7、docker-ce 18.09.7 的具體安裝命令為主線串起服務(wù)啟動與版本核驗環(huán)節(jié)同時專門記錄最新版 docker 因 container-selinux 依賴無法滿足而安裝失敗的報錯原文與成因分析幫助讀者避開同類問題。目前已有 7220 人學(xué)習(xí)下載適合需要一份可直接照做的國產(chǎn)系統(tǒng) docker 部署參照的中級用戶。1. 麒麟上裝 docker卡在nothing provides container-selinux 2:2.74的那三天在銀河麒麟 V10 SP1 Server 上裝 docker最常見的失敗方式是yum install docker-ce敲下去系統(tǒng)回你一句Error: Problem: cannot install the best candidate for the job - nothing provides container-selinux 2:2.74 needed by docker-ce-3:20.10.17-3.el7.aarch64。搜「docker 銀河麒麟」出來的帖子十有八九停在這一步有人加了--skip-broken看著不報錯了回頭docker --version還是沒有命令有人一路--nogpgcheck硬裝上去容器起不來、鏡像拉不動。這類故障折騰人的地方在于報錯只告訴你缺一個包不告訴你缺的是哪個源、哪個版本門檻該退回哪一版。下面把這份安裝手冊里的實際路徑拆開從源配置寫到版本選擇適合第一次在麒麟服務(wù)器上落地容器環(huán)境、又不想把系統(tǒng)搞成半殘的人。2. 配源這一步docker-ce.repo 少一個斜杠都裝不上裝不上 docker九成的原因不在 docker 本身在倉庫。麒麟服務(wù)器默認(rèn)只掛了自家源yum search docker出來的東西和你想要的不是一回事yum install docker-ce自然也找不到可用的包。所以第一條命令永遠(yuǎn)是確認(rèn)倉庫而不是直接裝。2.1 麒麟官方源里為什么搜不到 docker-ce麒麟 V10 SP1 Server 的官方倉庫ks10-os-media這類里容器相關(guān)提供的是 podman、skopeo、buildah 這一套docker-ce 不在其中。這不是配置錯了是發(fā)布策略如此。于是很多人yum search docker之后選了名字里帶 docker 的那個包裝上去docker命令確實有了docker version輸出卻和文檔對不上docker info里 Server 段要么是 podman 的兼容實現(xiàn)要么干脆報Cannot connect to the Docker daemon。這種“裝了個假 docker”的坑比直接報錯還費時間。正確做法是兩條腿走路docker-ce 本體和它的同族包docker-ce-cli、docker-ce-rootless-extras從 docker 官方的 CentOS 7 倉庫拿因為 docker 的 el7 包同時提供 x86_64 和 aarch64 兩種架構(gòu)麒麟的 aarch64 機(jī)器能直接用而 container-selinux、libcgroup、libseccomp 這些底層依賴docker 自己的倉庫里沒有得回到麒麟官方源里解析。兩個源同時啟用缺一個就會在yum install階段報依賴缺失。先清理一遍舊緩存很多人改完 repo 文件不makecache看到的還是上一輪的元數(shù)據(jù)改了半天“沒生效”# 清掉舊元數(shù)據(jù)避免改完 repo 后仍命中舊緩存 yum clean all # 重新拉取所有啟用倉庫的元數(shù)據(jù) yum makecache # 看當(dāng)前生效的倉庫列表確認(rèn)新加的兩個都 enabled yum repolistyum clean all會清掉/var/cache/yum下的元數(shù)據(jù)和包緩存第一次配置源時必做yum makecache是把各倉庫的repomd.xml和 primary 數(shù)據(jù)拉回本地后面yum list、yum install都基于它yum repolist輸出里如果某個倉庫顯示0個包說明 baseurl 或者網(wǎng)絡(luò)有問題別急著往下裝先把這個倉庫修好。2.2 docker-ce.repo 五個字段里最容易寫錯的是哪個倉庫文件放在/etc/yum.repos.d/下文件名隨意習(xí)慣叫docker-ce.repo。內(nèi)容按手冊給的最小集寫[docker-ce-stable] nameDocker CE Stable - 7 # 注意這里寫死 centos/7不要用 $releasever baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable enabled1 gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/docker-ce/linux/centos/gpg逐字段說清楚因為每個字段都有對應(yīng)的一種翻車方式。[docker-ce-stable]是倉庫 ID后面--enablerepo、--disablerepo都靠這個名字改名之后腳本里的參數(shù)要同步改。baseurl里的$basearch由 yum 在運行時替換成機(jī)器架構(gòu)aarch64 機(jī)器替換成aarch64x86_64 替換成x86_64所以同一份文件在兩種機(jī)器上都能用不用手改。真正容易出問題的是路徑里的那個7。麒麟 V10 的VERSION_ID是 10如果寫成$releaseveryum 會拼出.../linux/centos/10/aarch64/stable這個目錄在鏡像站上不存在直接 404報錯是Failed to download metadata for repo docker-ce-stable或者Cannot download repomd.xml看起來像網(wǎng)絡(luò)問題實際是路徑拼錯了。這也是手冊里寫死7的原因。同理baseurl結(jié)尾的斜杠別丟某些 yum 版本在拼接repodata/repomd.xml時不做補斜杠處理少了就變成stable/repodata之外的怪路徑。gpgcheck1配合gpgkey是校驗包簽名用的保證裝上的 rpm 沒被篡改。gpgkey指向的是 docker 倉庫的 GPG 公鑰yum 首次安裝時會自動下載并導(dǎo)入。這一項如果出問題報錯長這樣Public key for docker-ce-18.09.7-3.el7.aarch64.rpm is not installed處理辦法在后面的避坑章里展開。配完之后先別裝用一條只讀命令確認(rèn)倉庫里到底有哪些版本可裝# 列出所有可見的 docker-ce 版本倒序排列讓新版本在上 yum list docker-ce --showduplicates | sort -r--showduplicates是關(guān)鍵參數(shù)不加它 yum 只顯示每個包的最高版本你會誤以為倉庫里只有一個 20.10從而以為“只能裝最新版”。加上它18.09.7-3.el7、19.03.x、20.10.x 會全部列出來后面的版本選型就有了依據(jù)。sort -r只是讓輸出順序更符合直覺不影響結(jié)果。2.3 麒麟源為什么必須單獨加gpgcheck0 能不能忍只用 docker-ce 倉庫裝不下去因為container-selinux這類包 docker 倉庫不提供。麒麟官方源要單獨加一個文件按手冊的寫法[ks10-os-media] name Kylin Linux Advanced Server 10 - Os baseurl http://archive.kylinos.cn/yum/v10/sp1-openstack-q/aarch64/os/ gpgcheck 0 enabled 1寫入/etc/yum.repos.d/kylin_aarch64.repo。手冊原文這里路徑寫成了/etc/yum.repos./kylin_aarch64.repo少了個d照著敲的話系統(tǒng)會提示目錄不存在或者更壞的情況——你以為寫進(jìn)去了其實文件落在別處yum repolist里根本沒有這個倉庫。這是純手誤但確實有人卡在這一步很久。baseurl里的aarch64是寫死的x86_64 的機(jī)器要換成x86_64這個路徑不認(rèn)$basearch。gpgcheck 0意味著不校驗這個源的包簽名屬于妥協(xié)做法內(nèi)網(wǎng)或歸檔源經(jīng)常沒有正確部署 GPG 公鑰開校驗會直接卡住依賴安裝。判斷標(biāo)準(zhǔn)很簡單——這個源是你信任的、走內(nèi)網(wǎng)或官方歸檔的可以關(guān)來源不明的第三方源別為了裝上去就關(guān)校驗。關(guān)校驗的風(fēng)險是沒有完整性保護(hù)屬于“能跑但不該長期這樣”的狀態(tài)。兩個源都就位后再跑一次yum repolist應(yīng)該能看到docker-ce-stable和ks10-os-media都在列表里并且包數(shù)量不為 0。這一步看著瑣碎但它把后面 80% 的報錯擋在了門外。3. 報錯拆解nothing provides container-selinux 2:2.74到底缺什么3.1 依賴鏈條docker-ce 不是一個人在戰(zhàn)斗yum install docker-ce解析出來的依賴不是一條線是一個小圖。docker-ce 依賴 containerd.io容器運行時、docker-ce-cli命令行、container-selinuxSELinux 策略模塊、libcgroup、libseccomp、iptables、device-mapper-libs 等等。其中 containerd.io 和 docker-ce-cli 由 docker 倉庫自己提供版本能對上container-selinux、libcgroup、iptables 這些由發(fā)行版?zhèn)}庫提供也就是麒麟源。報錯里的 2:2.74是版本約束2:是 epoch可以理解成版本號的最高優(yōu)先級字段2.74是版本主體。這句話翻譯過來是docker-ce 20.10.17 這個包要求系統(tǒng)里有一個 epoch 為 2、版本不低于 2.74 的 container-selinux而當(dāng)前啟用的所有倉庫加起來沒有任何一個包能滿足這個條件。注意是“沒有任何一個包”不是“版本低了裝不上”——如果麒麟源里有 2.60yum 的報錯會變成requires container-selinux 2:2.74, but 2:2.60 is available之類的形式。所以看到nothing provides第一反應(yīng)應(yīng)該是“這個包名在當(dāng)前倉庫里根本不存在”而不是“版本差一點”。驗證方法就一條命令# 看麒麟源里到底有沒有 container-selinux以及它提供的版本 yum info container-selinux # 如果上面查不到再確認(rèn)是不是包名不同或被合并進(jìn)了別的包 yum provides container-selinux 2/dev/null yum search selinux | grep -i containeryum info能查到就說明包在重點看Version和Epoch兩行查不到就是徹底沒有這種情況在麒麟的精簡版?zhèn)}庫里不罕見有些鏡像干脆把 SELinux 相關(guān)包裁掉了。yum provides是按文件反查包參數(shù)給包名本身意義不大但配合2/dev/null可以快速排掉噪音看有沒有同名不同源的候選。3.2--nobest和--skip-broken為什么救不了這個錯報錯末尾那句(try to add --skip-broken to skip uninstallable packages or --nobest to use not only best candidate packages)是 dnf 后端自動附帶的建議它坑過不少人。先說清楚麒麟 V10 的yum實際是 dnf 的兼容前端所以輸出是Last metadata expiration check這種 dnf 風(fēng)格這也解釋了為什么yum會提示 dnf 的參數(shù)。--skip-broken的語義是“遇到裝不上的包就跳過把能裝的裝上”。用在這里docker-ce 正是裝不上的那個于是它被跳過yum 退出碼是 0看起來成功了。你回頭docker --version提示命令不存在或者只裝了 docker-ce-cli 沒有 daemon。這不是解決問題這是把問題藏起來屬于典型的自欺欺人。--nobest的語義是“不要只挑最優(yōu)最新版本允許退而求其次”。這個參數(shù)方向是對的但它有個前提倉庫里必須存在一個依賴能被滿足的版本。如果倉庫里最老的 docker-ce 是 19.03而 19.03 同樣要求 container-selinux 2:2.74那--nobest一樣失敗只是報錯信息變長。所以--nobest是“可能有用”不是“一定有用”能不能成得看倉庫里有哪些版本。真正有效的做法是反過來先看有哪些版本再逐個確認(rèn)依賴最后指定版本裝。這里有個很實用的技巧是“試運行”只解析不落盤# --assumeno 會在解析完依賴后自動回答 no只輸出計劃不真的安裝 yum install --assumeno docker-ce-18.09.7-3.el7--assumeno會讓 yum 把所有需要安裝、升級、替換的包列出來然后停下。如果依賴不滿足報錯在這一步就出現(xiàn)了系統(tǒng)不會被改動。比起真裝一次再卸載這個命令安全得多也快得多。把候選版本挨個試一遍哪個能過依賴解析就裝哪個。3.3 為什么最終選 18.09.7-3.el7 而不是 20.10手冊的結(jié)論很明確docker-ce裝最新版會失敗因為最新版的依賴組件在麒麟系統(tǒng)上無法滿足暫時沒有找到解決辦法所以退回18.09.7-3.el7。這個版本能裝上的核心原因是它的依賴門檻更低——老版本對 container-selinux 的最低要求比 20.10 寬松麒麟源里現(xiàn)有的包能過線。選版本時有幾個判斷依據(jù)不只是“能裝上就行”。第一是內(nèi)核兼容性docker 18.09 對內(nèi)核版本的要求比 20.10 低麒麟 V10 SP1 自帶的內(nèi)核如果是 4.19 系列18.09 跑起來更穩(wěn)overlay2 存儲驅(qū)動和 cgroup 的支持不會踩到新版才引入的特性。第二是 CLI 與 daemon 的版本必須一致docker-ce 和 docker-ce-cli 要裝同一個版本號混裝會出現(xiàn)client version 18.09.7 is too old或者 API 版本不匹配的報錯所以兩條命令里的版本號要成對改。第三是后續(xù)升級路徑18.09 是比較老的版本如果業(yè)務(wù)側(cè)要求 compose v2、buildx 這些新特性遲早要面對升級問題這時候的正確做法是先解決 container-selinux 的來源問題比如從更高版本的發(fā)行版?zhèn)}庫里找兼容包或者關(guān)掉 SELinux 后不裝這個包再升 docker而不是硬升。一個務(wù)實的判斷順序先yum list docker-ce --showduplicates | sort -r看有哪些版本從高到低用--assumeno試依賴第一個能過的版本就是你的天花板。這個結(jié)論要記下來因為下一次換機(jī)器、換麒麟小版本天花板可能變方法不變。4. 按版本裝先 cli 后 ce這個順序不是玄學(xué)4.1 為什么手冊堅持先裝 docker-ce-cli 再裝 docker-ce兩條命令分開敲看似只是排版習(xí)慣實際解決的是“報錯信息混在一起看不清”的問題。如果一條命令裝兩個包yum 會把兩個包的依賴合并解析一旦失敗你看到的是長長一串Problem:里面既有 cli 的依賴也有 daemon 的依賴很難判斷到底是哪個環(huán)節(jié)斷了。分開裝之后yum install docker-ce-cli-18.09.7-3.el7這一步只解析 cli 的依賴它依賴的是比較底層的庫libc、libseccomp 之類通常能順利通過通過之后再裝docker-ce如果這一步報錯你就很確定問題出在 daemon 的依賴上范圍一下縮小一半。這不是玄學(xué)是把排查變量控制住。尤其是第一次在這臺機(jī)器上裝不確定源配得對不對分開裝能最快告訴你“源沒問題是版本門檻的問題”。先裝 cli 的另一個好處是版本號能先鎖死。docker-ce-cli-18.09.7-3.el7裝完之后rpm -q docker-ce-cli能看到確切版本后面裝 daemon 時照著這個版本號寫不會出現(xiàn)“cli 是 18.09、daemon 是 19.03”這種低級的版本錯配。4.2 兩條安裝命令的完整寫法和驗證動作# 第一步先裝命令行客戶端鎖死版本號 yum install docker-ce-cli-18.09.7-3.el7 # 第二步再裝 daemon 本體版本號必須和上面一致 yum install docker-ce-18.09.7-3.el7 # 確認(rèn)兩個包的版本完全對齊 rpm -q docker-ce docker-ce-cli containerd.io命令里的18.09.7-3.el7是完整的 NEVRA 里的版本段格式是主版本.次版本.修訂號-打包號.el7.el7表示這是給 RHEL 7 系打的包麒麟 V10 兼容這個 ABI所以能裝。版本號寫全的好處是 yum 不會自作主張?zhí)糇钚掳嫜b出來的東西和你驗過的完全一致可復(fù)現(xiàn)。生產(chǎn)環(huán)境建議一直這么寫別用yum install docker-ce這種不帶版本的形式否則哪天倉庫更新了同一份腳本在不同時間跑出不同結(jié)果。rpm -q那一條是驗證動作輸出三行版本應(yīng)該都是18.09.7-3.el7containerd.io 的版本號體系不一樣不用強(qiáng)求一致。如果docker-ce-cli顯示not installed說明第一步?jīng)]成或者被第二步的某個obsoletes換掉了這時候別急著往下走回頭查。裝完之后還有一個容易漏的動作確認(rèn) SELinux 狀態(tài)。如果系統(tǒng)開了 enforcing而 container-selinux 版本又剛好卡在邊緣容器啟動時會報permission denied卻看不出原因。查一下getenforce # 輸出 Enforcing 表示強(qiáng)制模式Permissive 表示只記錄不攔截這一步不是讓你馬上去關(guān) SELinux而是留個記錄如果后面容器起不來且日志里全是avc: denied那就是它。關(guān)掉是應(yīng)急手段正確的做法是裝對應(yīng)的策略模塊但麒麟環(huán)境下這個包不好弄很多團(tuán)隊的做法是把 SELinux 調(diào)成 permissive 并記進(jìn)變更單。取舍自己判斷。4.3 啟動、自啟和第一次拉鏡像# 啟動服務(wù) systemctl start docker # 設(shè)為開機(jī)自啟服務(wù)器重啟后容器能自己回來 systemctl enable docker # 看守護(hù)進(jìn)程狀態(tài)Active: active (running) 才算成功 systemctl status docker --no-pager # 驗證版本 docker --version # 期望輸出Docker version 18.09.7, build 2d0083dsystemctl start docker如果失敗systemctl status只會給你一句Job for docker.service failed because the control process exited with error code真正的信息在 journal 里# 看 docker 服務(wù)最近 50 行日志定位啟動失敗原因 journalctl -u docker -n 50 --no-pager-u docker限定單元-n 50只取最近 50 行--no-pager避免輸出被分頁卡住。常見的失敗原因有三類/etc/docker/daemon.json的 JSON 語法錯誤少個逗號、多個逗號最常見、存儲驅(qū)動不支持overlay2需要內(nèi)核支持日志里會說failed to mount overlay、cgroup 掛載異常。服務(wù)起來之后docker --version只是客戶端版本真正要看的是docker info# 看 Server 段是否正常重點看 Storage Driver 和 Cgroup Driver docker info 2/dev/null | grep -Ei server version|storage driver|cgroup driver輸出里Server Version: 18.09.7說明 daemon 正常Storage Driver: overlay2是最理想的如果是devicemapper或者vfs說明沒走對驅(qū)動性能和磁盤占用都會難看。Cgroup Driver是cgroupfs還是systemd也要留意后面如果要在這個節(jié)點上跑編排系統(tǒng)cgroup driver 不一致會導(dǎo)致節(jié)點注冊失敗這是個經(jīng)典問題。最后拉一個鏡像驗證網(wǎng)絡(luò)docker pull hello-world docker run --rm hello-world拉不動是另一個話題net/http: TLS handshake timeout或dial tcp ... i/o timeout屬于鏡像源和網(wǎng)絡(luò)層的問題處理辦法在下一章第五個坑里。5. 避坑六個反復(fù)翻車的點這一章把我自己踩過和幫別人排查過的六種情況寫下來每條按現(xiàn)象、原因、解決三步走??吹綄?yīng)報錯直接抄解決那欄就行。5.1 repo 文件路徑寫成/etc/yum.repos./現(xiàn)象按手冊原文敲vim /etc/yum.repos./kylin_aarch64.repovim 提示E212: Cant open file for writing或者更隱蔽的情況——你用的是cat 重定向文件寫進(jìn)了一個新建的不存在的目錄如果權(quán)限允許然后yum repolist里怎么都看不到這個源。原因路徑少了d/etc/yum.repos.d/才是倉庫目錄。手冊排版時丟字符是純粹的文檔錯誤但新手照著敲會一頭霧水。解決改成/etc/yum.repos.d/kylin_aarch64.repo。養(yǎng)成個習(xí)慣配完源立刻ls /etc/yum.repos.d/確認(rèn)文件名再yum repolist確認(rèn)倉庫加載成功兩步都不花時間能擋掉后面一堆“為什么源不生效”的疑問。5.2 baseurl 用了$releasever報Failed to download metadata for repo現(xiàn)象yum makecache或yum install時報Failed to download metadata for repo docker-ce-stable、Cannot download repomd.xml、Status code: 404有時還伴隨長時間的等待。原因docker-ce 的 CentOS 倉庫路徑里有一段固定是centos/7而麒麟 V10 的$releasever解析成10拼出來的地址.../linux/centos/10/aarch64/stable根本不存在。另外%24basearch拼錯、結(jié)尾少斜杠也會造成類似問題。解決baseurl里寫死7架構(gòu)段保留$basearch讓它自動替換。改完yum clean all yum makecache再yum repolist看有沒有報錯。以后配任何第三方 el7 倉庫在麒麟上都要先想一遍“這個地址里的版本段會不會被自動替換成 10”。5.3yum install docker-ce直接裝nothing provides container-selinux現(xiàn)象Error: Problem: cannot install the best candidate for the job - nothing provides container-selinux 2:2.74 needed by docker-ce-3:20.10.17-3.el7.aarch64。原因不帶版本號的yum install會挑倉庫里最新的 docker-ce最新版對 container-selinux 的要求超出麒麟源能提供的范圍。解決yum list docker-ce --showduplicates | sort -r看全部版本從高到低用yum install --assumeno docker-ce-版本試依賴第一個能過的就裝它并且docker-ce-cli用同一版本號。不要用--skip-broken掩蓋問題。5.4 安裝正常但systemctl start docker失敗現(xiàn)象Job for docker.service failed because the control process exited with error code.systemctl status docker看不出有用信息。原因大致三類。/etc/docker/daemon.json有 JSON 語法錯誤多一個逗號、少一個引號存儲驅(qū)動不被內(nèi)核支持cgroup 或 iptables 在工作環(huán)境里有沖突。解決journalctl -u docker -n 50 --no-pager看真實報錯。如果是 JSON 問題用python3 -m json.tool /etc/docker/daemon.json校驗一遍格式比肉眼找逗號靠譜。如果是failed to mount overlay換成storage-driver: vfs先讓服務(wù)起來性能差但能跑再回頭解決內(nèi)核模塊。改完daemon.json一律systemctl daemon-reload systemctl restart docker別只 restart。5.5 鏡像拉不下來TLS handshake timeout現(xiàn)象docker pull hello-world卡住很久最終報net/http: TLS handshake timeout或dial tcp ...: i/o timeout。原因默認(rèn)鏡像倉庫在公網(wǎng)上訪問不穩(wěn)定或者被限速DNS 解析慢也會加劇這個問題。裝 docker 成功和拉鏡像是兩個獨立環(huán)節(jié)前者只驗證了包管理后者才驗證網(wǎng)絡(luò)。解決配鏡像加速地址寫進(jìn)/etc/docker/daemon.json{ registry-mirrors: [https://你的加速地址], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } }registry-mirrors是加速地址列表按可達(dá)性排序native.cgroupdriversystemd讓 cgroup 驅(qū)動和系統(tǒng)保持一致避免以后接入編排系統(tǒng)時踩坑后面兩行是日志輪轉(zhuǎn)不加的話/var/lib/docker/containers/*/*-json.log會把磁盤吃滿這個坑通常在跑了一兩個月之后才炸。改完systemctl daemon-reload systemctl restart docker用docker info看Registry Mirrors段有沒有生效。5.6 裝完docker: command not found或者裝成了 podman 兼容包現(xiàn)象yum install docker執(zhí)行成功docker version提示command not found或者有輸出但 Server 段是 podman。原因麒麟源里docker這個名字可能指向 podman-docker 之類的兼容包它提供/usr/bin/docker的軟鏈實際調(diào)用 podman另一種情況是只裝了 docker-ce 沒裝 cli二進(jìn)制不在 PATH 里。解決rpm -qa | grep -Ei docker|podman看清楚到底裝了什么。如果發(fā)現(xiàn) podman-docker先yum remove podman-docker再按版本裝 docker-ce-cli 和 docker-ce。裝完which docker應(yīng)該指向/usr/bin/dockerdocker version的 Client 和 Server 段版本號要一致。6. 快速定位三條命令分清是源問題、依賴問題還是版本問題裝不上的時候別急著換源、換版本、重裝系統(tǒng)先花三十秒做分類。我的習(xí)慣是三步順序固定。第一步確認(rèn)倉庫在不在yum repolist | grep -E docker-ce|ks10兩個倉庫都應(yīng)該出現(xiàn)包數(shù)量不為 0。只有 docker-ce 沒有麒麟源說明依賴解析注定失敗一個都沒有說明 repo 文件沒生效回頭查文件名和路徑。第二步確認(rèn)版本有哪些yum list docker-ce docker-ce-cli --showduplicates | sort -r如果只列出一兩個版本說明倉庫元數(shù)據(jù)沒更新或者 baseurl 指錯了如果列出一長串但全都裝不上說明是依賴門檻問題不是版本缺失。第三步用試運行定位到底缺哪一環(huán)yum install --assumeno docker-ce-18.09.7-3.el7報錯里出現(xiàn)nothing provides就是依賴包在源里不存在出現(xiàn)but X is available就是版本低了。這兩句話的處置方向完全不同前者要補源或者換版本后者只能換版本。把常見報錯和根因?qū)φ粘梢粡埍碛龅讲徽J(rèn)識的報錯先在這張表里找最像的報錯片段大概率根因下一步命令Failed to download metadata for repobaseurl 路徑錯$releasever被替換成 10、結(jié)尾少斜杠yum repolist看完整 URLnothing provides container-selinux版本門檻超出麒麟源能提供的范圍yum list --showduplicates換低版本Public key ... is not installedgpgkey 沒生效或沒導(dǎo)入重新導(dǎo)入 key或臨時gpgcheck0No match for argument倉庫里沒這個版本或緩存沒更新yum clean all yum makecacheJob for docker.service faileddaemon.json 語法、存儲驅(qū)動、cgroupjournalctl -u docker -n 50TLS handshake timeout鏡像倉庫不可達(dá)配registry-mirrors后重啟驗證環(huán)節(jié)也有個固定的收尾動作裝完必跑三條docker --version看客戶端docker info看 Server 和 Storage Driverdocker run --rm hello-world看端到端通不通。三條都過才算這臺機(jī)器真的能跑容器而不是“裝上了”。血淚教訓(xùn)是我早期在這類國產(chǎn)化系統(tǒng)上裝東西總想著“先把包裝上再說”結(jié)果每次都在依賴上反復(fù)一周能修三四臺同款機(jī)器。后來改成固定順序先 repolist 確認(rèn)倉庫、再 showduplicates 確認(rèn)版本、再 assumeno 確認(rèn)依賴最后才動手裝。從那以后我每次在新機(jī)器上裝 docker不管是不是麒麟都強(qiáng)制把這三條命令走一遍寧可多花兩分鐘也不要在--skip-broken的假成功里浪費半天。這份手冊的價值也在這里——它把“能裝上”的那條路徑固定下來了源怎么配、版本選哪個、裝完怎么驗照著走一遍就有結(jié)果。希望幫到你。本文還有配套的精品資源點擊獲取