Docker中启动Centos7容器无法使用systemctl命令的解决办法
今天在docker容器中使用centos7官方镜像启动了一个容器,在安装ssh服务后,想使用systemctl启动服务,结果报下列错误:
[root@eb58e337fdc7 /]# systemctl
Failed to get D-Bus connection: Operation not permitted
百度搜了一下,网上有的文章说加一个--privileged
参数即可解决,于是重新创建容器,命令如下:
docker run -d -it -p 22:22 --name nginx --privileged centos:centos7.7.1908
启动后测试,错误仍然存在,遂查了一下docker帮助中的这个参数的定义:
$ docker run --help
--privileged Give extended privileges to this container
意思就是赋予此容器扩展的特权,使用该参数,container内的root拥有真正的root权限。
否则,container内的root只是外部的一个普通用户权限。但这个参数的默认值是false,所以必须显示指定--privileged=true
然后继续:
$ docker run -d -it -p 22:22 --name nginx --privileged=true centos:centos7.7.1908
容器创建成功,测试systemctl
,仍然报错:
Failed to get D-Bus connection: Operation not permitted
有些郁闷了,继续网上搜,发现有篇文章说创建容器时加上/usr/sbin/init
即可,但这篇文章中并没有加--privileged=true
参数,于是我拿掉了这个参数,使用如下命令创建容器:
$ docker run -d -it -p 22:22 --name nginx centos:centos7.7.1908 /usr/sbin/init
马上试了一下,错误依旧,没办法,于是将两种方法结合起来试试,说干说干,马上创建容器,命令如下:
docker run -d -it -p 22:22 --name nginx --privileged=true centos:centos7.7.1908 /usr/sbin/init
进入容器测试systemctl
,奇迹出现了,居然可以用了:
$ docker exec -it nginx /bin/bash
[root@8d6474af502c /]# systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION
dev-md1.device loaded activating tentative /dev/md1
dev-zram0.device loaded activating tentative /dev/zram0
dev-zram1.device loaded activating tentative /dev/zram1
-.mount loaded active mounted /
dev-mqueue.mount loaded active mounted POSIX Message Queue File System
etc-hostname.mount loaded active mounted /etc/hostname
etc-hosts.mount loaded active mounted /etc/hosts
etc-resolv.conf.mount loaded active mounted /etc/resolv.conf
sys-fs-fuse-connections.mount loaded active mounted FUSE Control File System
sys-kernel-config.mount loaded active mounted Configuration File System
..........
总结一下:要想使用systemctl
命令,必须使用参数--privileged=true
,且加上/usr/sbin/init
,二者缺一不可。