報錯
最近使用docker運行ubuntu16.04鏡像,進入鏡像後使用systemctl
命令後發現報錯,報錯如下:
Failed to connect to bus: No such file or directory
原因
查到原因如下:
Docker的設計理念是在容器裏面不運行後臺服務,容器本身就是宿主機上的一個獨立的主進程,也可以間接的理解爲就是容器裏運行服務的應用進程。一個容器的生命週期是圍繞這個主進程存在的,所以正確的使用容器方法是將裏面的服務運行在前臺。
再說到systemd,這個套件已經成爲主流Linux發行版(比如CentOS7、Ubuntu14+)默認的服務管理,取代了傳統的SystemV風格服務管理。systemd維護系統服務程序,它需要特權去會訪問Linux內核。而容器並不是一個完整的操作系統,只有一個文件系統,而且默認啓動只是普通用戶這樣的權限訪問Linux內核,也就是沒有特權,所以自然就用不了!
因此,請遵守容器設計原則,一個容器裏運行一個前臺服務!
解決方法
但是有時候我們只是想去容器裏面實現一些功能,我就是想運行後臺服務怎麼辦?
網上大部分解決方法如下:
- 創建容器:
docker run -itd --name=容器名稱 --privileged=true 鏡像名稱 /usr/sbin/init
- 進入容器:
docker exec -it 容器名稱 /bin/bash
新的問題
但是我按照此步驟操作時遇到了下面的錯誤:
docker: Error response from daemon: OCI runtime create failed: \
container_linux.go:346: starting container process caused \
"exec: \"/usr/sbin/init\": stat /usr/sbin/init: no such file or directory": unknown.
最終答案
看報錯信息應該是不存在/usr/sbin/init/
這個文件。
原因是上面的解決方法只適用於Centos
系統,而我容器裏面跑的是Ubuntu
系統,Ubuntu
裏面的systemd
文件名實際路徑爲/sbin/init
。
所以解決方法如下:
- 創建容器:
docker run -itd --name=容器名稱 --privileged=true 鏡像名稱 /sbin/init
- 進入容器:
docker exec -it 容器名稱 /bin/bash
這時候發現已經可以使用systemctl
命令了,問題解決!