使用容器启动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。
以下内容可供参考,以回答这个问题:
在容器中未启动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文件中启动的方法。(首先要重新考虑通信环境)