docker.service啟動(dòng)失?。篣nit not found的原因及解決辦法
背景
因?yàn)樽罱恢痹谡垓vKubernetes集群版本升級(jí)、Docker版本升級(jí),所以不停的把測(cè)試環(huán)境安裝、還原、升級(jí)、降級(jí),簡(jiǎn)直亂的不行。終于,在測(cè)試Docker版本升級(jí)后,啟動(dòng)Docker時(shí),遇到了docker.service: Unit not found。問題雖然不大,但是卻折磨了我?guī)讉€(gè)小時(shí),所以在此mark一下。
操作系統(tǒng):Red Hat Enterprise Linux 7
原因1:docker.socket
最初在啟動(dòng)docker時(shí)遇到問題,是因?yàn)閐ocker.socket引起的,雖然記不清問題是表現(xiàn)為Unit not found還是執(zhí)行systemctl start docker.service命令時(shí)hang住了,但是也一并記錄在這里。
問題描述
我是從Docker 1.10.3升級(jí)到1.13.1版本,通過rpm包安裝的。由于要保留自定義的一些Docker配置,所以在升級(jí)后,使用原來的/usr/lib/systemd/system/docker.service覆蓋了新的docker.service。但是在1.10.3版本中,docker.service的[UNIT]里規(guī)定了Requires=docker.socket,也就是說,docker.service默認(rèn)依賴于docker.socket,因?yàn)樾枰褂胐ocker.socket來獲取容器的信息。
[Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network.target docker.socket Requires=docker.socket
但是在1.13.1版本中,已經(jīng)不再依賴于docker.socket了,所以系統(tǒng)里沒有docker.socket,而我繼續(xù)使用原來的docker.service,所以在啟動(dòng)的時(shí)候,就會(huì)出錯(cuò)。
解決辦法
刪除/usr/lib/systemd/system/docker.service的[UNIT]里包含的docker.socket,然后systemctl daemon-reload,最后systemctl start docker.service,發(fā)現(xiàn)啟動(dòng)成功了。
類似情況
如果是類似的情況,缺少docker.socket,但是新版本需要docker.socket。有兩種方法可以解決該問題:
- 可以卸載docker,再重新安裝,即可出現(xiàn)docker.socket?;蛘?/li>
- 創(chuàng)建一個(gè)/usr/lib/systemd/system/docker.socket文件,然后systemctl daemon-reload,最后systemctl start docker.service,即可啟動(dòng)成功。
/usr/lib/systemd/system/docker.socket文件如下:
[Unit] Description=Docker Socket for the API PartOf=docker.service [Socket] ListenStream=/var/run/docker.sock SocketMode=0660 SocketUser=root SocketGroup=docker [Install] WantedBy=sockets.target
原因2:flanneld.service
就如背景里描述的,我恰好在這臺(tái)出問題的機(jī)器上,安裝過Kubernetes,以及flannel,然后又刪掉了我之前以為的“所有”相關(guān)的文件。正是由于flannel的文件沒有刪除干凈,導(dǎo)致出現(xiàn)了docker.service: Unit not found的問題。
問題描述
在確定不是因?yàn)閐ocker.socket的問題導(dǎo)致的之后,我第一反應(yīng)就是刪除flannel導(dǎo)致的,因?yàn)槲伊私鈌lanneld.service與docker.service直接是有啟動(dòng)順序的關(guān)聯(lián)的:
[Unit] Description=Flanneld overlay address etcd agent After=network.target After=network-online.target Wants=network-online.target After=etcd.service Before=docker.service
真正困擾了我很久的是,/usr/lib/systemd/system/flanneld.service我已經(jīng)刪除了,也systemctl daemon-reload了,究竟還有哪個(gè)文件漏刪了。
經(jīng)過檢查,/etc/systemd/system/flanneld.service依然存在,并且存在/etc/systemd/system/docker.service.requires目錄,在該目錄下包含了軟連接flanneld.service,該軟鏈接指向了真正的flanneld.service,從而實(shí)現(xiàn)了兩個(gè)服務(wù)的啟動(dòng)順序的關(guān)聯(lián)。
定位該類問題,經(jīng)常會(huì)用到的命令有:
- systemctl list-unit-files 列出所有可用的Unit
- systemctl list-units 列出所有正在運(yùn)行的Unit
- systemctl --failed 列出所有失敗單元
- systemctl mask httpd.service 禁用服務(wù)
- systemctl unmask httpd.service
- systemctl kill httpd 殺死服務(wù)
- systemd-analyze critical-chain:分析啟動(dòng)時(shí)的關(guān)鍵鏈
- systemd-analyze blame 分析啟動(dòng)時(shí)各個(gè)進(jìn)程花費(fèi)的時(shí)間
解決辦法
使用systemctl unmask flanneld.service禁止flanneld服務(wù),然后刪除
/etc/systemd/system/docker.service.requires/flanneld.service,使用systemctl daemon-reload重新加載服務(wù)配置文件,最后systemctl start docker.service,發(fā)現(xiàn)docker啟動(dòng)成功了。
以上所述是小編給大家介紹的docker.service啟動(dòng)失?。篣nit not found的原因分析及解決辦法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
docker部署高斯數(shù)據(jù)庫的詳細(xì)步驟
文章詳細(xì)介紹了如何在Docker中部署高斯數(shù)據(jù)庫(openGauss),包括安裝Docker、拉取鏡像、運(yùn)行容器、設(shè)置環(huán)境變量和掛載數(shù)據(jù)卷等步驟,還提供了連接和配置遠(yuǎn)程連接的指導(dǎo),感興趣的朋友一起看看吧2024-12-12
如何解決mysql配置文件錯(cuò)誤導(dǎo)致在docker中無法啟動(dòng)的問題
這篇文章主要介紹了如何解決mysql配置文件錯(cuò)誤導(dǎo)致在docker中無法啟動(dòng)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
如何使用Docker部署briefing視頻聊天系統(tǒng)
briefing是一個(gè)開源的、安全的直接視頻群聊平臺(tái),這篇文章主要介紹了使用Docker部署briefing視頻聊天系統(tǒng)的詳細(xì)過程,需要的朋友可以參考下2024-01-01
解決docker數(shù)據(jù)文件過大導(dǎo)致根磁盤滿的問題
本篇文章主要介紹了解決docker數(shù)據(jù)文件過大導(dǎo)致根磁盤滿的問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04

