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

问题复现

  1. Docker 启动一个 MySQL 容器
docker run -it -p 3306:3306 rockylinux:8 /bin/bash
  1. 安装 mysql-server 和 procps(获得 ps 命令)
dnf install -y procps mysql-server
  1. 使用 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”

fail-to-start.gif

分析问题及解决方案

我们仔细看一下这个报错信息:“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

image.png

我们可以看到,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 的进程信息

image.png

可以看到 PID 为 1 的进程已经不再是 /bin/bash 了,而是 /sbin/init,然后就可以正常使用 systemctl 启动服务了,\oWo/

参考链接

  • Docker