报错

最近使用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 -v \
/sys/fs/cgroup:/sys/fs/cgroup 镜像名称 /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命令了,问题解决!

docker 容器运行Ubuntu16.04并使用systemd
Tagged on:

发表评论

电子邮件地址不会被公开。 必填项已用*标注