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