将 systemd 添加到 docker 容器的启动中

将 systemd 添加到 docker 容器的启动中

我在 docker 中有一个 ubuntu:22.04 容器。我需要访问systemd它。现在,我已经通过我的 Dockerfile 安装了 systemd。但运行映像后,systemctl命令产生以下错误:

root@d0184b7fe9ce:/var/www# systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

我该怎么做才能解决这个问题?


我为什么需要systemctl
我正在尝试在我的容器上安装 php8.2。成功安装后,我没有 php 和 php-fpm 套接字/var/run/。我认为这是因为 systemctl 不起作用。

答案1

docker 不是这样的作品这显然不是它在这里应该工作的方式。

粗略地说,docker-run 进程是:

  • 上下文由以下内容组成:
    • 文件系统(由相互安装的各种卷映像组成,并在配置时安装到这些卷映像之上)
  • dockerfile 说明在该上下文中运行什么。

您可以在各种其他配置上分层,但它只是在内核下独立环境中运行的进程树。它不是一个完整的系统,也不是无法“启动”的虚拟机。init 系统将完全消除薄型虚拟机管理程序模型。


因此将其拉回到“我在 docker 中有一个 ubuntu:22.04 容器”。这很好,但那里的 Ubuntu 与 PHP 无关。如果你想要 PHP,请运行PHP 图像并使用其配置来绑定您的文件系统(例如您想要提供的 PHP)或将 FPM 服务器公开给 Web 服务器(无论它在哪里运行)。

您可能还拥有一个数据库和一个 httpd。编写一个 docker-compose 文件可能会对您有所帮助,该文件包含所有这些功能(来自不同的图像)并将它们绑定在一起。结果将是几个进程树一起运行,每个进程树都相当独立但仍可集中控制。如果您需要为不同的站点提供不同版本的内容,那么这是一个很好的选择。

但我认为,将 Ubuntu 基础镜像视为可部署镜像的做法是错误的。可以—你绝对可以—但这不是docker的重点。如果你想要一个类似裸机的配置,用KVM或XEN创建一个合适的虚拟机。

相关内容