docker運行Ubuntu16.04並使用systemd

報錯

最近使用docker運行ubuntu16.04鏡像,進入鏡像後使用systemctl命令後發現報錯,報錯如下:

Failed to connect to bus: No such file or directory

原因

查到原因如下:

Docker的設計理念是在容器裏面不運行後臺服務,容器本身就是宿主機上的一個獨立的主進程,也可以間接的理解爲就是容器裏運行服務的應用進程。一個容器的生命週期是圍繞這個主進程存在的,所以正確的使用容器方法是將裏面的服務運行在前臺。

再說到systemd,這個套件已經成爲主流Linux發行版(比如CentOS7、Ubuntu14+)默認的服務管理,取代了傳統的SystemV風格服務管理。systemd維護系統服務程序,它需要特權去會訪問Linux內核。而容器並不是一個完整的操作系統,只有一個文件系統,而且默認啓動只是普通用戶這樣的權限訪問Linux內核,也就是沒有特權,所以自然就用不了!

因此,請遵守容器設計原則,一個容器裏運行一個前臺服務!

解決方法

但是有時候我們只是想去容器裏面實現一些功能,我就是想運行後臺服務怎麼辦?

網上大部分解決方法如下:

  1. 創建容器:
docker run -itd --name=容器名稱 --privileged=true 鏡像名稱 /usr/sbin/init
  1. 進入容器:
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
所以解決方法如下:

  1. 創建容器:
docker run -itd --name=容器名稱 --privileged=true 鏡像名稱 /sbin/init
  1. 進入容器:
docker exec -it 容器名稱 /bin/bash

這時候發現已經可以使用systemctl命令了,問題解決!

發佈了33 篇原創文章 · 獲贊 15 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章