使用容器启动Apache的备忘录

使用Apache时需要注意的事项已整理为备忘录。

【环境】
操作系统:AmazonLinux 2
Apache版本:2.4

关于安装的事项

请按照以下内容进行实施。

yum install -y httpd.x86_64

有关容器操作的事项

希望在容器启动时一起启动Apache。
使用下面的命令确认当前状态。

bash-4.2# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd.service(8)

如果在容器中执行以下命令,即可启动Apache,但理想情况是在容器启动时就让服务运行起来。

httpd -k start

不使用systemctl无法确认状态吗?

从一开始就得出结论,但是就这一个选项

需要使用 root 权限来执行 Apache 的启动确认。

这意味着要检查httpd的状态,一定要涉及systemd(systemctl),对吧?
嗯,当在容器中启动时,应该以root身份运行,所以这没关系。

首先,systemctl是什么?

这是用于操作systemd的命令。

systemd是什么?

这是一套系统管理守护进程、库和实用程序,是管理和配置的核心平台。

对于系统管理来说,这是一个过程。

大多数主要的Linux发行版都采用systemd作为默认的初始化系统。

在我從事業務的時候,我只看到過init,所以對(UNIX)一無所知。

为了什么是init系统?

,UNIX及Unix系統中的一個程序,負責啟動其他所有進程。它以守護進程的身份運行,通常會被賦予PID 1。

那么让我们来谈谈正题吧。

在容器中无法使用systemctl。

通过上述内容,我已经理解了在Linux中在服务启动时使用systemctl命令。然而,在启动的容器中无法使用systemctl。
总之,在启动容器时追加了以下内容后,systemctl命令就可以使用了。
下面的页面非常有参考价值。
https://qiita.com/mikene_koko/items/4c71c969f55e3fe24190

docker-compose.yml为一种格式化的文件,旨在描述和配置Docker容器应用程序的服务、网络和卷等组件。

services:
  app:
    build:
      context: ..
      dockerfile: docker/test/Dockerfile.development
    command:
      - /sbin/init
    privileged: true

为什么选择/sbin/init作为初始程序?

当系统启动时,当内核加载完成后,最后会启动一个名为init的守护进程(/sbin/Init)来管理所有进程,作为它们的父进程。

这意味着没有这个,什么都无法开始。然而,你也可以通过指定选项来设置父进程,所以没有必要刻意使用/sbin/init。

以下内容可供参考,以回答这个问题:

CentOS7コンテナでsystemctlが使えない時

在容器中未启动systemd进程

/sbin/init 是链接到systemd的

当执行它时,systemd进程将在PID1启动,并可使用systemctl

尚、privileged选项基本上在容器内默认不允许启动所有设备(守护进程等),这是一个用于允许此操作的选项。

一种不需要使用systemctl的方法

虽然写了很多内容,但其实在启动Apache容器时,如果不传递“start”命令,httpd就无法启动,或者肯定还有其他方法吧。

容器启动后的当前状态是这样的。

bash-4.2# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd.service(8)

当看到”dead”这个词时,感觉像是异常终止,稍微有些吃惊(只是我一个人吗?)但实际上它是正常终止的状态。
只是默认情况下,并不是终止状态,我希望将其设置为启动状态。

方々寻找却毫无结果时,我突然记起有前辈的存在。

参考先人的文章

现在的情况如下:
– Dockerfile中只安装了httpd并复制了配置文件。
– 在docker-compose.yml中试图启动httpd。
– 通过compose文件还执行了/sbin/init。

在以下的参考文章中做如下更改:
– 在 Dockerfile 中启动 httpd 服务(在镜像创建时已经启动)
– 在 Dockerfile 中添加 /sbin/init 以在镜像创建时启动。

我本来不喜欢重新构建,所以在Dockerfile中只想做最少的事情,但如果在Docker Hub的官方信息中有这样的记载,那肯定是正确的,我想。

把下面的句子用中文本地化的方式改写,只需要一种选项:

由于通信环境差,镜像构建一直无法完成。而且在下载软件包时不断超时导致构建失败,无法进行运行确认。因此,我决定重新考虑在compose文件中启动的方法。(首先要重新考虑通信环境)

广告
将在 10 秒后关闭
bannerAds