
簡介這份文檔面向在國產化服務器環(huán)境中部署容器平臺的運維工程師與信創(chuàng)適配人員聚焦銀河麒麟 v10 SP1 Server 上 Docker 的落地安裝問題。由于官方源缺少 docker server 軟件包文檔給出阿里云 docker-ce 源與麒麟官方依賴源的配置方法并說明為何只能安裝 18.09.7 版本、無法直接升級到最新版。資源為 1 個 docx 文件壓縮包約 17KB體量輕便適合離線查閱或隨環(huán)境交付存檔。內容按「配置 yum 源—安裝 docker-ce-cli 與 docker-ce—啟動服務—查看版本」的順序組織附有完整 repo 文件內容、可復制的命令與真實報錯信息讀者可據此快速復現(xiàn)安裝流程并借助其中的 container-selinux 依賴報錯分析掌握排查思路。該文檔已有 7220 人學習下載對需要在麒麟系統(tǒng)上搭建容器運行環(huán)境的初、中級用戶具有直接參考價值。1. 從一臺 aarch64 服務器說起麒麟上裝 Docker 為什么先降版本第一次在銀河麒麟 v10 SP1 Server 上敲yum install docker-ce多數(shù)人以為十分鐘能收工結果終端甩回一行nothing provides container-selinux 2:2.74。機器是 aarch64 架構系統(tǒng)自帶源里壓根沒有 docker server 包第三方源里最新版的依賴又跟麒麟的 selinux 策略包對不上裝到一半就卡死。這類機器在國產化改造的場景里太常見了docker 銀河麒麟這個組合踩的坑九成都集中在「版本對不上」和「源沒配對」兩件事上。下面按我實際裝過的那套流程走一遍先核對架構和版本再配雙源然后按 cli → engine 的順序釘死 18.09.7最后給一套能自查的驗收命令。手上正卡在依賴報錯、或者裝完 docker 起不來的開發(fā)者可以照著復現(xiàn)。2. 裝前把底子摸清麒麟 v10 SP1 的架構、內核與版本取舍動手改源之前先花三分鐘做體檢。這一步偷懶的人最多后面翻車的也最多——源地址里的$basearch填錯、把 x86_64 的包往 aarch64 機器上懟、內核太老撐不起 overlay2都是在這個環(huán)節(jié)埋下的雷。2.1 三條命令確認系統(tǒng)版本、內核與 CPU 架構# 麒麟自己的發(fā)行版標識確認是不是 v10 SP1 cat /etc/kylin-release # 通用發(fā)行版信息重點看 ID 和 VERSION_ID cat /etc/os-release # CPU 架構aarch64 還是 x86_64直接決定源地址里 $basearch 展開成什么 uname -m # 內核版本4.19 及以上對 overlay2、cgroup v2 的支持才比較穩(wěn) uname -r/etc/kylin-release是麒麟特有的文件CentOS 上沒有用它確認小版本號最直接SP1 和 SP2 的源路徑不一樣抄錯一個字整段源就廢。/etc/os-release里的ID字段一般會寫成kylin有的鏡像版本寫成centos這會影響后面 yum 變量展開的行為裝之前心里要有數(shù)。uname -m是關鍵中的關鍵。飛騰、鯤鵬這類機器輸出aarch64海光、兆芯輸出x86_64。同一個 Docker CE 源里兩個架構的包是分目錄放的$basearch寫對了 yum 才會去對應目錄取包。我見過有人把 x86_64 機器的 repo 文件整體拷到 aarch64 機器上$basearch雖然會展開但如果寫成了硬編碼的x86_64yum 就會報「沒有可用軟件包」而且報錯信息完全不提架構的事特別迷惑。內核版本決定存儲驅動。麒麟 v10 SP1 常見內核在 4.19 一帶overlay2 能用如果碰上更老的 4.4 內核就得退回devicemapper性能和穩(wěn)定性都差一截。先看清楚省得裝完再折騰。檢查項命令期望值不匹配的后果系統(tǒng)版本cat /etc/kylin-releaseKylin Linux Advanced Server V10 (SP1)源路徑寫錯元數(shù)據拉不下來CPU 架構uname -maarch64 / x86_64拉到錯誤架構的包安裝直接失敗內核版本uname -r4.19 及以上overlay2 不可用需換存儲驅動磁盤空間df -h /var剩余 20G 以上鏡像一多就寫滿docker 服務假死2.2 版本選擇18.09.7-3.el7 與 20.10 的取舍Docker CE 在 EL 系倉庫里同時維護 el7 和 el8 兩個包線aarch64 的構建產物主要掛在centos/7/aarch64/stable下面。麒麟 v10 SP1 的 glibc 和 systemd 版本其實更接近 EL8 時代但 el7 的 docker 包依賴少、自帶組件多反而更容易在這套系統(tǒng)上落地。真正卡住的是新版。20.10 系列的 rpm 包在 spec 里硬性聲明了container-selinux 2:2.74而麒麟 v10 SP1 自帶源里的 container-selinux 版本低于這個門檻第三方源又不提供 aarch64 的 container-selinux于是依賴鏈在第一步就斷了。yum 給出的建議是加--skip-broken或--nobest這兩個參數(shù)看著像救命稻草實際上--skip-broken會把 docker-ce 本身也跳過--nobest則會降級去挑一個更老的候選包結果往往裝上一個版本號更亂的殘件。版本包名關鍵依賴在麒麟 v10 SP1 aarch64 的實際情況18.09.7docker-ce-18.09.7-3.el7依賴鏈短運行時組件內置能裝、能起、能跑容器20.10.xdocker-ce-3:20.10.17-3.el7container-selinux 2:2.74源里找不到滿足條件的包解析失敗所以這份環(huán)境里我固定用18.09.7-3.el7。它不算新但 Docker 的 API 版本兼容性一向做得好日常的鏡像構建、容器編排、私有倉庫對接都不受影響。真要上新版得先自己編譯 container-selinux 或者從別的源里找 aarch64 的包手動裝那是另一個工作量級的事不適合在業(yè)務機器上折騰。2.3 裝前清場卸掉殘留 docker 與沖突包很多麒麟機器出廠自帶 podman 或者裝過舊版 docker直接覆蓋裝會出現(xiàn)二進制打架、/etc/docker目錄殘留配置覆蓋新配置的問題。裝之前先清一遍。# 卸掉歷史遺留的 docker 相關包不存在也不會報錯 yum remove -y docker docker-client docker-client-latest docker-common \ docker-latest docker-latest-logrotate docker-logrotate docker-engine # 看看有沒有 podman / buildah / containerd / runc 占著底層依賴 rpm -qa | grep -E podman|buildah|containerd|runc # 殘留的運行時目錄確認沒在用再刪 ls -ld /var/lib/docker /etc/docker /run/docker.sock 2/dev/null第一條命令里的包名是從 EL 系歷史沿革下來的麒麟上大部分不存在yum remove對不存在的包會靜默跳過不會有副作用。第二條命令是重點podman 和 docker 都依賴 containerd、runc 這些底層組件但版本要求不一樣如果系統(tǒng)里已經裝了 podman 自帶的一套 runcdocker 裝上去可能跑的是不兼容的 runc 版本表現(xiàn)是容器起來了但秒退日志里報OCI runtime create failed。這種情況要么卸 podman要么用yum install時觀察 runc 是否被升級。/var/lib/docker目錄如果存在且里面還有舊數(shù)據新裝的 docker 會直接接管鏡像層格式不兼容時會出現(xiàn)「鏡像列表里有但起不來」的怪現(xiàn)象。確認沒數(shù)據就rm -rf有數(shù)據先備份。這一步做完環(huán)境才算干凈。3. 配置 yum 源docker-ce 源加麒麟官方源的組合打法麒麟官方源里查不到 docker server 的包這是前提事實所以必須引第三方源。但只加第三方源又不夠——docker 運行還需要libcgroup、iptables、container-selinux這類系統(tǒng)級依賴它們得從麒麟自己的源里來。兩個源各管一段缺一個都裝不完整。3.1 寫 docker-ce.repo$basearch與 gpgcheck 兩個關鍵參數(shù)先備份現(xiàn)有源出事能整段回滾這是血淚經驗。# 備份現(xiàn)有 repo 文件到 /root 下出問題直接拷回來 mkdir -p /root/repo-backup cp -a /etc/yum.repos.d/*.repo /root/repo-backup/ # 新建 docker-ce 源文件 vi /etc/yum.repos.d/docker-ce.repo文件內容如下[docker-ce-stable] nameDocker CE Stable - 7 baseurlhttps://鏡像站域名/docker-ce/linux/centos/7/$basearch/stable enabled1 gpgcheck1 gpgkeyhttps://鏡像站域名/docker-ce/linux/centos/gpgbaseurl里的鏡像站域名換成你環(huán)境里能訪問的 Docker CE 鏡像站域名內網有同步源就填內網地址比走公網穩(wěn)。路徑里的centos/7不是指操作系統(tǒng)必須是 CentOS 7而是 Docker 官方對 EL7 包線的目錄約定aarch64 的構建產物就在centos/7/aarch64/stable下面。$basearch是 yum 的內置變量在 aarch64 機器上自動展開成aarch64在 x86_64 上展開成x86_64所以這一行在兩個架構上都能用不要手寫成固定值。gpgcheck1配合gpgkey做包簽名校驗安全上應該開。但如果內網鏡像站是自建的、沒有同步 gpg 文件校驗會失敗并報GPG key retrieval failed這時候要么把 gpgkey 指向內網可達的地址要么臨時設gpgcheck0——后者是妥協(xié)裝完記得改回來。enabled1表示默認啟用。如果同一個 repo 文件里想禁用某個倉庫單獨寫enabled0即可不用刪文件。3.2 補一份麒麟官方源依賴包從這里來麒麟的源文件通常已經在/etc/yum.repos.d/下了文件名類似kylin_aarch64.repo。先看現(xiàn)有的# 列出所有 repo 文件 ls -l /etc/yum.repos.d/ # 看現(xiàn)有源里都配了哪些 baseurl抄一個能用的 grep -rh baseurl /etc/yum.repos.d/*.repo如果現(xiàn)有的源被禁用了或者地址失效需要補一份。內容參照這個結構[ks10-os-media] name Kylin Linux Advanced Server 10 - Os baseurl http://麒麟官方源域名/yum/v10/sp1-openstack-q/aarch64/os/ gpgcheck 0 enabled 1baseurl里的路徑要跟你的系統(tǒng)版本嚴格對應v10 和 v10 SP1 的目錄名不同sp1 后面還帶-openstack-q這類倉庫標識抄錯就 404。最穩(wěn)的辦法是從機器上已有的源文件里復制一行過來改不要憑記憶手敲。gpgcheck 0在這里是常見做法。麒麟官方源的 gpg key 分發(fā)不一定完整開了校驗經常拉不下來元數(shù)據導致整個源不可用。這個源只用來裝系統(tǒng)依賴包風險可控但對安全要求高的環(huán)境還是應該把 key 導進去再開校驗。3.3 刷新緩存并確認兩個源都生效源文件寫完不等于生效yum 有元數(shù)據緩存不清就是舊的。# 清掉所有緩存包括元數(shù)據和包 yum clean all # 重建緩存這一步會去兩個源拉元數(shù)據耗時看網絡 yum makecache # 列出所有啟用的倉庫確認 docker-ce-stable 和麒麟源都在 yum repolist # 看 docker-ce 有哪些可用版本重點確認 18.09.7-3.el7 在列表里 yum --showduplicates list docker-ceyum repolist的輸出里每個倉庫后面會跟一個包數(shù)量如果某個源顯示0或者狀態(tài)是repodata is over 2 weeks old說明元數(shù)據沒拉到先解決源連通性再往下走。--showduplicates list會把同一個包的所有可用版本列出來aarch64 的 18.09.7 應該出現(xiàn)在 docker-ce-stable 那一列沒出現(xiàn)就是$basearch或者路徑寫錯了。麒麟 v10 上yum其實是dnf的軟鏈接兩條命令等價但dnf的報錯信息更詳細排查依賴問題時用dnf往往能多看到一層原因。4. 用 yum 裝 docker-ce 18.09.7先 cli 再 engine 的順序不能反源配好之后安裝本身只有兩條命令但順序和版本號的寫法有講究。docker-ce這個包依賴docker-ce-cli的精確版本一次性裝會讓 yum 自己去解析依賴解析結果不一定是你要的那個版本。4.1 先裝 docker-ce-cli把版本號釘死# 顯式指定完整版本號連 release 號一起寫 yum install -y docker-ce-cli-18.09.7-3.el7版本號必須寫全18.09.7-3.el7只寫18.09.7會讓 yum 去匹配所有 release可能挑到el7之外的構建。-y是免交互確認腳本化部署時必帶。為什么先裝 clidocker-ce的 rpm 里聲明了Requires: docker-ce-cli 18.09.7-3.el7這樣的精確依賴。如果直接yum install docker-ce-18.09.7-3.el7yum 會順帶解析出 cli 的依賴理論上也能裝上。但實際情況是倉庫里同時存在 20.10 的 cliyum 的依賴解析器在遇到多版本候選時可能挑最新的那個裝完就變成 cli 是 20.10、engine 是 18.09.7docker version里 Client 和 Server 版本對不上某些 API 調用直接報client version too new。先把 cli 釘死engine 安裝時的依賴解析就只剩一層沖突概率大幅下降。這是我在幾臺機器上反復驗證過的順序不按這個來也能成但失敗的次數(shù)明顯更多。4.2 再裝 docker-ceengine 與 cli 版本對齊# 同樣寫全版本號 yum install -y docker-ce-18.09.7-3.el7裝完立刻核對 rpm 層面的一致性# 兩個包的版本號應該完全一致 rpm -qa | grep docker-ce正常輸出是兩行docker-ce-18.09.7-3.el7.aarch64和docker-ce-cli-18.09.7-3.el7.aarch64架構后綴也必須是 aarch64。如果看到x86_64或者只有一行說明依賴解析出了問題yum remove重來。有個參數(shù)值得提一句--setoptobsoletes0。某些第三方源里會把 docker-ce 標記為廢棄某個舊包加上obsoletes0能阻止 yum 順帶刪掉你不想刪的東西。一般用不上但在源比較雜的環(huán)境里是道保險。4.3 啟動、開機自啟與版本驗證# 啟動服務 systemctl start docker # 設開機自啟服務器重啟后容器要能自己回來 systemctl enable docker # 看服務狀態(tài)--no-pager 避免輸出被分頁截斷 systemctl status docker --no-pager # 只看客戶端版本 docker --version # 客戶端和服務端版本都看這個才是完整信息 docker versiondocker --version只打印一行Docker version 18.09.7, build 2d0083d那是客戶端版本服務端起沒起來它完全不管。很多人執(zhí)行完這條看到版本號就以為裝好了實際 dockerd 可能根本沒跑。docker version會分成 Client 和 Server 兩段輸出Server 段能打出來才說明守護進程活著。這是驗收環(huán)節(jié)最容易糊弄過去的一步。systemctl status的輸出里如果看到Active: active (running)就正常如果是failed往下翻幾行會有具體的錯誤原因配合journalctl -u docker -n 50 --no-pager能看到更詳細的啟動日志。4.4 配 daemon.jsondata-root、日志與 cgroup driver裝完能跑只是及格線配置文件不改跑一陣子會出問題。/etc/docker/daemon.json是守護進程的主配置改完要systemctl daemon-reload systemctl restart docker。{ data-root: /data/docker, log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, exec-opts: [native.cgroupdriversystemd], storage-driver: overlay2 }># 有網的機器上導出busybox 鏡像只有幾 MB docker save -o busybox.tar busybox:latest # 拷到目標機器后導入 docker load -i busybox.tar # 用導入的鏡像做冒煙測試能看到輸出就說明運行時鏈路完整 docker run --rm busybox:latest echo docker ok--rm讓容器退出后自動清理不留垃圾。這條命令打出來docker ok說明鏡像加載、容器創(chuàng)建、runc 調用、網絡命名空間初始化整條鏈路都是通的比單純看版本號有說服力得多。如果這一步報網絡相關的錯再加--network none試一次能跑就說明是網絡配置的問題不是 docker 本身。docker info里還有個容易被忽略的字段是Cgroup Driver配了 systemd 的話這里應該顯示systemd顯示cgroupfs說明exec-opts沒生效。另外docker network ls應該能看到bridge、host、none三個默認網絡少一個就說明 dockerd 初始化時出了問題去journalctl -u docker里翻。從那以后我每次裝完麒麟的 docker都強制走一遍docker version的雙端對齊檢查再跑一條離線鏡像的冒煙命令兩步都過了才往生產環(huán)境推。這套流程不復雜但能擋掉八成「裝完了但跑不起來」的返工。希望幫到你。本文還有配套的精品資源點擊獲取