技術スタック インフラDocker

Docker でcentos8+Apache2.4 の環境を作ろうとして詰まった

2020.11.27

この記事はosからイメージを指定して作ろうとして、FROM centos から構築して

Failed to connect to bus: No such file or directory docker System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down

というエラーで詰まってブチ切れそうになっている人は以下の方法を確認してみてください。原因は「公式に解決法がありました」から述べていきます。

この記事で使用したOSとdockerのバージョン

  • docker:19.03.13
  • maxOS Catalina 10.15.5

Dockerfileからcentos8+apache2.4の環境作ろうとした

apacheのイメージを入れるとosがUbuntuだったりで、できたらosから指定したいなーと思ってcenots8の環境にapacheを入れて行こうと思い以下のようにDockerfileを記述

Dockerfile
FROM centos:8

RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

RUN yum install -y epel-release && yum clean all

RUN rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-8.rpm

RUN yum -y update && yum clean all

RUN yum -y install httpd && yum clean all

RUN yum -y install php74-php php74-php-mysqli php74-php-gd php74-php-mbstring php74-php-opcache php74-php-xml php74-php-pear php74-php-devel php74-php-pecl-imagick php74-php-pecl-imagick-devel php74-php-pecl-zip

RUN ln /usr/bin/php74 /usr/bin/php

RUN chown -R apache:apache /var/www/html

RUN systemctl enable php74-php-fpm

RUN systemctl enable httpd 

php入っていますがとりあえず上のような感じで必要なものを入れて、apacheを常にONにすれば行けるだろ思い、ビルドする

$ docker build -t centos_apche:1.0 .

ビルドは普通に成功しました。イメージが作られたのを確認していざコンテナを起動。

docker run -t -d -p 9000:80 centos_apche:1.0

しかし localhost:9000 にアクセスすると「データが送信されませんでした」と真っ黒(chrome)。docker ps で稼働状態を調べてもコンテナはきちんと動いている。つまりコンテナの中で何か起きている。

docker exec -it {container_id or name} /bin/bash
...
[root@32212888398b /]# 
[root@32212888398b /]# systemctl httpd status 
System has not been booted with systemd as init system (PID 1). Can't operate. 
Failed to connect to bus: Host is down

「は?」とりあえずhttpdが動いていないそうな上に「Host is down」とos自体がダメと言うことか?systemctlだけ打ってもエラーしか出ない。

公式に解決法がありました。

いろいろ調べましたが systemd を起動する方法がcentos7、centos:latest(つまり8)ではデフォルトでアクティブにならず一工夫必要だそうです。

公式ドキュメント

私も詳しい仕組みまではわからないのですが、まずDockerfileを以下のように追記します。

Dockerfile
FROM centos:8
#ここから
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]
#ここまで
RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

RUN yum install -y epel-release && yum clean all

RUN rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-8.rpm

RUN yum -y update && yum clean all

RUN yum -y install httpd && yum clean all

RUN yum -y install php74-php php74-php-mysqli php74-php-gd php74-php-mbstring php74-php-opcache php74-php-xml php74-php-pear php74-php-devel php74-php-pecl-imagick php74-php-pecl-imagick-devel php74-php-pecl-zip

RUN ln /usr/bin/php74 /usr/bin/php

RUN chown -R apache:apache /var/www/html

RUN systemctl enable php74-php-fpm

RUN systemctl enable httpd 

そしてビルドは普通に行い、コンテナを立ち上げる際はボリュームともう一つオプションを指定します。

docker run -v /sys/fs/cgroup:/sys/fs/cgroup:ro --privileged -t -d -p 9000:80 centos_apched:1.0

-v /sys/fs/cgroup:/sys/fs/cgroup:roでファイルシステムをホストマシンからボリュームし、--privilegedでコンテナにホストマシンのroot権限を与ます。どちらか片方が抜けてもいけません。

このオプションとボリュームを指定するとsystemdが動きます。実際にコンテナに入っていくとsystemctlコマンドが実行されました。

Copyright © 2021 jun. All rights reserved.