Ubuntu 的 Docker 無法使用的問題


前幾天,手邊幾台 Ubuntu 20.04 的電腦似乎是在 apt 更新完後,就開始出現 docker 容器無法正確執行的問題了?

錯誤訊息基本上是:

OCI runtime create failed: container_linux.go:348: 
starting container process caused: error adding seccomp filter rule for syscall clone3: permission denied: unknown

這個問題基本上應該不是個案,在網路上也可以找到相關的討論。

在 containerd 的 GitHub 上,就有人提出《issue creating containers due to seccomp failure (error adding seccomp filter rule for syscall clone3: permission denied: unknown, Docker 20.10.10)》這個 issue;而在《Incompatible with docker.io update pending for Ubuntu 20.04: “error adding seccomp filter rule for syscall clone3: permission denied: unknown"》這邊,也可以看到同樣的錯誤。

所以看起來,應該是 docker.io 更新後,和 NVIDIA 提供的 nvidia-container-runtime(為了使用 GPU)衝突所導致的?


已經失效的簡單解法

而 Heresy 注意到的時候,最簡單的解決方法,就是把安裝的 docker.io
降回沒問題的版本就好了;理論上有問題的版本應該是「20.10.7-0ubuntu5~20.04.2」,而只要降版到「20.10.7-0ubuntu1~20.04.2」就沒問題了。

要安裝指定這個特定版本的話,可以透過下面的指令來操作:

apt install docker.io=20.10.7-0ubuntu1~20.04.2

Heresy 發現的時候,當下立刻用這個方法來處理,看來是有效的。但是後來不確定是不是不小心做了什麼事,docker.io 的版本又自己跑回去了?而且如果想要再次降到這個版本,又會出現找不到這個版本的錯誤、而無法完成…

所以,只能放棄這個最簡單的解法了。 orz


暫時放棄 GPU

由於主要的問題應該是 docker 和 nvidia-container-toolkit 衝突,所以如果暫時放棄 nvidia 的 runtime、而回去用標準的 runc 的話,應該是可以用、沒有問題的。

如果要修改的話,可以去開啟「/etc/docker/daemon.json」這個檔案,把預設的 runtime 由「nvidia」改成「runc」。

雖然這樣一般的 Docker 容器都可以正常地執行,但是相對地,要使用 CUDA 的容器就還是會有問題,所以其實不能算是一個好方法。


使用 RC 版的 nvidia-container-toolkit 1.6.0

這邊另一個可能有效的解法,就是將 nvidia-container-toolkit 切換到 experimental repo 的 16.0~rc.2-1(目前正式版是 1.5.1-1)。

這個方法 Heresy 沒有去測試,如果要用這個方案的話,可以參考 NVIDIA 的官方文件(連結)。

這邊可能稍微要注意的,一般安裝 nvidia-container-toolkit 前所加入的 repository 會是 stable 版的,如果要裝 experimental 的版本,會需要另外加入 experimental 的 repository。


目前使用的方法:改用 docker-ce

Heresy 之前安裝 Docker,都是比較簡單、直接使用 Debian 提供的 docker.io 這個
package;他基本上版本大多會比較舊,但是基本上會是 Ubuntu 官方提供的版本。

而實際上,Docker 官方則還有透過自己的 repository,提供 docker-ce 和
docker-ee,讓使用者安裝;理論上版本會比較新,也會較快得到安全性修正。

像是現在 docker.io 的版本是 20.10.7-0ubuntu5~20.04.2,而 docker-ce 的版本則是 5:20.10.10~3-0~ubuntu-focal。

除了版本的新舊會有明顯的差別之外,兩者的套件相依性架構應該也是有所不同的(參考參考)。

而 Docker 官方文件中的安裝教學(連結),也是建議移除 docker.io 等套件(他把這些稱為「舊版」)後,加入 docker.com 提供的
repository 來安裝 docker-ce。

其流程如下:

  1. 移除舊版,指令為

    remove docker docker-engine docker.io containerd runc
  2. 加入 Docker 官方的 repository,指令為:

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  3. 安裝 docker-ce

    apt update
    apt install docker-ce docker-ce-cli containerd.io

不過,如果之前沒有做過類似的操作,可能得在第二步之前,先安裝 ca-certificates、curl、gnupg、lsb-release 這些套件。

在這個問題剛發生的時候,就算是使用 docker-ce 似乎也還是得用較舊的版本才能正確運作。

不過實際上,Heresy 今天在安裝 docker-ce 後,似乎最新版也可以正確地搭配 nvidia 的 runtime 使用了?


所以理論上,現在應該是將 docker.io 移除,改裝 docker-ce 就可以恢復正常了。

不過,Heresy 這邊在重新安裝後,要跑有用到 GPU 的 docker 的時候,會先出現下面的錯誤:

Failed to initialize NVML: Driver/library version mismatch

網路上也有可以找到有人碰過類似的錯誤,解決的方法出乎意料地簡單,就是重開機就好了(參考)。 XD

對「Ubuntu 的 Docker 無法使用的問題」的想法

  1. 啊這,我2018年之後都是用docker-ce的。ubuntu源裏面那個docker實在過於詭異。
    然後我看了下你給的那個參考,這個我說的“詭異”問題應該是解決了,不過debian源的更新速度實在太慢,如果有什麼比較急的Bug的話是不能指望靠debian快速修復的。
    感覺ce和io兩個版本的現狀有點像當年的mysql和mariandb,雖然問題根源不相同。不過折騰了這麼多年後我仍然覺得mysql比mariandb好用,mariandb只能算備用方案,所以我估計我還是會用docker-ce。
    另外如何使用docker在容器內調用主機硬件資源,我一直搞不定。

    • Debian 的套件更新向來都慢幾版,這點有的時候會很困擾;但是相對地好處,就是是統一管理,理論上可以讓系統乾淨一點…(希望

      MarianDB 哪邊理論上是已經和 mySQL 切出去了,後來的開發都是獨立的、也已經有不同的地方了,和這邊的例子應該不大一樣?

      • 兩者的契機都是開源走商業化道路,然後商業化道路使用非常內聚的維護方式,與傳統的原子化維護方式相悖,分開維護。MarianDB一開始也是和MySQL一起走的,也是最後越走越遠,最後除了API大部分兼容之外現在就是倆東西了。MySQL現在也是一安裝就帶一堆自己維護的工具(其實還挺方便的,可以做到開箱即用),MarianDB現在安裝之後還要手寫海量的配置文件才能啓動。
        Docker只是走得還不夠久,可能哪一天DockerInc搞個什麼奇葩舉動,就有可能徹底分叉了。

        • 不是吧?
          我的理解是:docker.io 和 docker-ce 用的是同一份版本的程式,只是套件相依性的處理不一樣,再加上 Debian 用的版本向來比較舊而已。
          Debian 那邊應該並沒有去動 docker-ce 的程式碼。

          要說商業化的不同,應該是 docker-ce 和 docker-ee 啊~

          • 還不夠遠,別急,再過幾年就說不準了。
            docker-ce 和 docker-ee 對應的是 MySQL Community 和 MySQL Enterprise Edition。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.