Linux Docker systemctl 命令无法使用的解决方案
作者:
M4LLKN0W
,
2021-10-19 18:36:13
,
所有人可见
,
阅读 3373
问题介绍:在 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
参考文章:
所以说,Linux的环境配置确实如y总所说,挺蛋疼的