Docker 中无法使用 systemctl 启动服务
在 Docker 中使用 systemctl 启动 MySQL 时报错:System has not been booted with systemd as init system (PID 1). Can’t operate. Failed to connect to bus: Host is down
发布于 星期一,四月 1 2024
遇到的问题
使用 Docker 启动容器后,想要在里面使用 systemctl 启动 MySQL,输入下面命令后报错:
“System has not been booted with systemd as init system (PID 1). Can’t operate.Failed to connect to bus: Host is down”
# 执行这个命令后报错
systemctl start mysqld
问题复现
- Docker 启动一个 MySQL 容器
docker run -it -p 3306:3306 rockylinux:8 /bin/bash
- 安装 mysql-server 和 procps(获得 ps 命令)
dnf install -y procps mysql-server
- 使用 systemctl 启动 MySQL 服务
systemctl start mysqld
然后就报错:“System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down”
分析问题及解决方案
我们仔细看一下这个报错信息:“System has not been booted with systemd as init system (PID 1). Can’t operate.Failed to connect to bus: Host is down” 。大概意思就是没有 PID 1 的 init system 进程
那我们看一下系统中有哪些进程吧,使用 ps 命令(需要安装 procps 包)
ps
我们可以看到,PID 为 1 的进程是 bash,也就是我们刚刚创建 Docker 容器的那个命令后面跟的 /bin/bash
docker run -it -p 3306:3306 rockylinux:8 /bin/bash
看到这大概是知道了因为PID 为 1 的进程运行的不是init system 进程,导致 systemctl 无法启动服务,那我们是不是只要把PID 为 1 的进程设置为 init system 进程是不是就行了?
应该怎么办呢,可以手动指定 Docker 容器启动时执行 /sbin/init
# 在后台启动一个名为 rocky_test_mysql 的容器并获取 root 权限
docker run -d --name rocky_test_mysql -p 3306:3306 --privileged=true rockylinux:8 /sbin/init
-
--privileged=true:这个必须指定,让我们拥有 root 权限用的
-
/sbin/init:以 /sbin/init 运行,而不是
/bin/bash
或者/bin/sh
之类的运行
# 进入容器并使用 /bin/bash
docker exec -it rocky_test_mysql /bin/bash
-
ps:列出当前进程
-
ps f1:显示 PID 为 1 的进程信息
- ps f1,2,3,4:显示 PID 为 1、2,3、4 的进程信息
可以看到 PID 为 1 的进程已经不再是 /bin/bash 了,而是 /sbin/init,然后就可以正常使用 systemctl 启动服务了,\oWo/
参考链接
- Docker