1. 背景
一般來說,yum默認安裝的docker版本都比較低,導致有時候docker build都有問題,因為不能解析對應的語法。所以我們需要更新我們通過yum安裝的docker。
2. 解決方案
來源:Install Docker Engine on CentOS
2.1 卸載舊版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
如果 yum報告沒有安裝這些軟件包,那也沒關(guān)系。
/var/lib/docker/的內(nèi)容,包括image、container、volumes, and networks,將被保留。Docker 引擎包現(xiàn)在被稱為 docker-ce.
2.2 安裝方法
您可以根據(jù)需要以不同方式安裝 Docker Engine:
- 大多數(shù)用戶設(shè)置 Docker 的存儲庫并從中安裝,以便于安裝和升級任務。這是推薦的方法。
- 一些用戶下載 RPM 包并手動安裝并完全手動管理升級。這在某些情況下非常有用,例如在無法訪問互聯(lián)網(wǎng)的氣隙系統(tǒng)上安裝 Docker。
- 在測試和開發(fā)環(huán)境中,部分用戶選擇使用自動化便捷腳本來安裝Docker。
2.3 設(shè)置存儲庫
安裝 yum-utils包(提供 yum-config-manager 實用程序)并設(shè)置穩(wěn)定 存儲庫。
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
2.4 安裝 Docker 引擎
- 安裝最新版本的 Docker Engine 和 containerd,或者進入下一步安裝特定版本:
sudo yum install docker-ce docker-ce-cli containerd.io
- 要安裝特定版本 的 Docker Engine,請在 repo 中列出可用版本,然后選擇一種并進行安裝:
列出并排序您的存儲庫中可用的版本。本示例按版本號對結(jié)果進行排序,從高到低,并被截斷:
yum list docker-ce --showduplicates | sort -r
返回的列表取決于啟用的存儲庫,并且特定于您的 CentOS 版本(.el7在本示例中由后綴表示)。
通過完全限定的包名稱安裝特定版本,即包名稱 ( docker-ce) 加上從第一個冒號 ( :)開始的版本字符串(第 2 列),直到第一個連字符,由連字符 ( -)分隔。例如,docker-ce-18.09.1。
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
此命令會安裝 Docker,但不會啟動 Docker。它還會創(chuàng)建一個 docker組,但是,默認情況下它不會向該組添加任何用戶。
-
啟動 Docker。
sudo systemctl start docker 通過運行
hello-world映像驗證 Docker Engine 是否已正確安裝。
sudo docker run hello-world
此命令下載測試映像并在容器中運行它。當容器運行時,它會打印一條消息并退出。
3. 可能碰到的問題
3.1 docker 升級后或者重裝后,啟動容器提示:Error response from daemon: Unknown runtime specified docker-runc
3.1.1 解決方法:
更改/var/lib/docker/containers目錄中的文件參數(shù),把docker-runc替換為runc
grep -rl 'docker-runc' /var/lib/docker/containers/ | xargs sed -i 's/docker-runc/runc/g'
注:
- grep -rl:遞歸搜索目錄和子目錄,只列出含有匹配的文本行的文件名,而不顯示具體的匹配內(nèi)容
- xargs:銜接執(zhí)行之前得到的值
總體意思是把/var/lib/docker/containers中含有‘docker-runc’的文件搜索出來,并把‘docker-runc’字符為runc
重新啟動docker
sudo systemctl daemon-reload
sudo systemctl restart docker
大功告成