Linux Docker systemctl 命令无法使用的解决方案
问题介绍:在 Ubuntu 20.04 的 Docker 容器中无法使用 systemctl 命令
众所周知 systemctl 可以用来启动、停止服务和查询服务状态的。
例如你可以使用 systemctl start apache2 这条命令来启动 Apache 服务。
使用 systemctl 命令时发生的错误代码
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
问题出现的原因是:
0 号进程不是 init,所以导致导致缺少相关文件无法运行
Docker的设计理念是在容器里面不运行后台服务,容器本身就是宿主机上的一个独立的主进程,也可以间接的理解为就是容器里运行服务的应用进程。一个容器的生命周期是围绕这个主进程存在的,所以正确的使用容器方法是将里面的服务运行在前台。
再说到systemd,这个套件已经成为主流Linux发行版(比如CentOS7、Ubuntu14+)默认的服务管理,取代了传统的SystemV风格服务管理。systemd维护系统服务程序,它需要特权去会访问Linux内核。而容器并不是一个完整的操作系统,只有一个文件系统,而且默认启动只是普通用户这样的权限访问Linux内核,也就是没有特权,所以自然就用不了!
因此,请遵守容器设计原则,一个容器里运行一个前台服务!
解决方法1:
解决这个问题的两个步骤(不推荐)
第一步:在创建 docker 容器的时候需要多增加一个参数 --privileged
即docker run --privileged -p xxxx:22 --name CONTAINER_NAME -itd CONTAINER_IMAGE_NAME
第二步:执行 /bin/bash 命令并进入容器
docker exec -it CONTAINER_NAME /bin/bash
解决方法2:
不用 systemctl 如何开启、停止或查看服务的运行状态呢?(推荐)
在绝对路径 /etc/init.d/ 下,存放了许多带执行权限的服务文件,如 apache2,ssh 等
于是我们可以直接使用这些文件用来开启、停止或查看服务的运行状态
这些服务文件有许多功能 {start|stop|reload|force-reload|restart|try-restart|status}
例如我需要查看 apache 服务的状态,输入 /etc/init.d/apache2 status,执行后就会返回 * apache is running