目录
解决方法
原理详解
D-Bus 是什么
为什么 Docker 默认不启动D-Bus服务
docker 命令参数 --privileged=true
docker 的 entrypoint
参考链接
虽然之前也用过docker搭建环境,但都比较简单,对docker的设计理念和用法也没多少了解,所以遇到了这次报错。
我最初想用 VM 搭建测试环境,但物理机内存有限,所以为了节省资源,下载了 CentOS 7 的镜像启动,安装 nginx 服务器后像以往通过 systemctl 命令管理服务,结果出下面的报错信息:
[root@47e9a4c3d6a7 /]# systemctl status nginx Failed to get D-Bus connection: Operation not permitted
又试了几次还是这样,百思不得其解,我一脸黑人问号,操作好像没问题啊
解决方法
退出 CentOS 7 容器,用 root 权限停止运行,然后把容器删掉
docker stop centos7
docker rm centos7
以特权模式运行容器,添加参数 --privileged=true,entrypoint 设置为 /usr/sbin/init
docker run -itd --name centos7 --privileged=true centos:centos7 /usr/sbin/init
安装好 nginx ,再次运行 systemctl 命令
原理详解
D-Bus 是什么
D-Bus是一个用于在Linux系统上进行进程间通信的系统总线。而 systemctl 命令用于管理系统服务,并且通常依赖于D-Bus进程间通信系统。然而,在 Docker 容器中,默认情况下并没有运行D-Bus服务,因此无法建立与D-Bus的连接。
"Failed to get D-Bus connection" 错误通常出现在Linux系统中,它指示正在尝试与D-Bus(Desktop Bus)通信时发生了问题。
为什么 Docker 默认不启动D-Bus服务
在Docker容器中,默认情况下不启动D-Bus服务的主要原因是为了保持容器的轻量性和单一用途性。
Docker容器被设计为独立、可移植的应用程序运行环境。每个容器通常专注于运行单个应用程序或进程,并且在隔离的环境中运行,与宿主操作系统和其他容器相互隔离。为了实现这种轻量性和隔离性,许多与主机操作系统紧密相关的服务和进程在容器中是被禁用或没有启动的。
D-Bus是一个系统总线,用于在Linux系统中进行进程间通信,它通常与桌面环境、用户会话和系统服务紧密相关。然而,在典型的应用程序容器中,通常不需要桌面环境或与D-Bus直接交互的功能。因此,默认情况下,在Docker容器中不启动D-Bus服务,以减少容器的复杂性和资源消耗。
如果在Docker容器中需要使用D-Bus服务,可以手动启动D-Bus服务,并进行相应的配置。但这可能会增加容器的复杂性,并且需要谨慎处理容器与主机操作系统之间的隔离性,所以不推荐
docker 命令参数 --privileged=true
--privileged=true 用于在运行容器时给予容器特权访问主机系统的权限,Docker会为容器提供一组特权,使得容器内的进程可以执行一些通常需要主机系统权限才能执行的操作。
使用 --privileged=true 选项时,容器内的进程将具有对主机系统的完全访问权限。这意味着容器内的进程可以执行许多操作,例如加载内核模块、修改网络配置、修改主机文件系统等等。
docker 的 entrypoint
在 Docker 容器中,将 CMD 或 ENTRYPOINT 设置为 /usr/sbin/init 可以启动 systemd 进程,从而实现在容器内部启动包括 D-Bus 在内的系统服务。
systemd是一个系统和服务管理器,它可以管理和控制各种系统服务,并提供对D-Bus服务的支持。通过启动 systemd,D-Bus服务将自动启动,从而使得在容器中可以使用D-Bus进行进程间通信。
/usr/sbin/init 是 Linux 系统中的初始化进程,它负责启动和管理系统中的各种服务和进程。通过在 Docker 容器中运行 /usr/sbin/init,可以模拟一个完整的操作系统环境,包括启动系统服务和进程。
参考链接
docker出现问题:Failed to get D-Bus connection: Operation not permitted解决方案-CSDN博客
Docker容器出现使用systemctl问题:Failed to get D-Bus connection: Operation not permitted · 浩翰Redamancy的博客
docker Failed to get D-Bus connection 报错_51CTO博客_docker failed to start