dockerでApache+phpのイメージ作成

Dockerを使ってApache+PHPのイメージを作ってみたいと思います。環境としては以下となります
※Dockerなどは既にインストールされている前提です

ホスト側

  • OS:CentOS7
  • カーネル:3.10.0-1160.42.2.el7.x86_64
  • Docker:20.10.17, build 100c701
  • Docker Compose:version v2.6.0

ホスト側はCentOS7となります。実験ではDebian11などでも試しましたが問題なく動きました。ホスト側のOSはCentOS、AlmaLinux、Debianなら動くと思います

Dockerイメージ

  • ベースイメージ:almaLinux8
  • Apache:2.4.x
  • PHP:8.0/FastCGI
  • 確認方法:phpinfoをブラウザで表示する
  • ポート:8080

ディレクトリパス

ディレクトリは以下のようになってます

1/home/ユーザー名/docker
2                
3                ├Dockerfile
4                
5                └docker-compose.yml

Dockerfile

※コードを載せます

01FROM almalinux
02 
03#実行コマンドを書いていく
04RUN dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
05RUN dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
06RUN dnf module enable php:remi-8.0 -y
07RUN dnf install -y httpd
08RUN dnf install -y php
09RUN mkdir /run/php-fpm/
10 
11#実行
12CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

コード解説

CentOS8から使えるようになったmodule機能があります。これを使ってPHP8をインストールします。最初の2行はリポジトリを追加してます。

デフォルトでインストールされるPHPをその後8.0にしてます。その後apacheとPHPのインストールをしてます

  • mkdir /run/php-fpm/

ここでディレクトリを作成してます。Dockerは基本的に軽くするため、余計な機能などはないのが多いです。例えばRedHat系でおなじみのsystemctl コマンドはベースイメージのダウンロードした状態では使えません。

そのため、php-fpmを使おうにもエラーとなります

エラー文

1ERROR: unable to bind listening socket for address '/run/php-fpm/www.sock': No such file or directory (2)
2ERROR: FPM initialization failed

これを回避するためにビルドに組み込んでおきます。

docker-compose.yml

今度はDockerFileではなくymlファイルを作成します

1version: '3'
2services:
3  almalinux8:
4    container_name: "almalinux8"
5    build:
6       dockerfile: ./Dockerfile
7    tty: true  # ← これがないとコンテナにログインできない
8    ports:
9        - 8080:80

コンテナの名前はalmalinux8としてます。ここでは同じディレクトリにあるDockerfileを実行してねとかいてあるだけです。portsは8080で開きますという意味です。

ビルドを実行

エラーが出なければビルド成功です

コンテナ実行

1[docker@vultr lamp]$ docker-compose up -d
2[+] Running 2/2
3⠿ Network lamp_default 
4⠿ Container almalinux8  Started 
5 
6$ docker ps
7CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                                   NAMES
84384e3216f7a   lamp_almalinux8   "/usr/sbin/httpd -D /FOREGROUND"   48 seconds ago   Up 47 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   almalinux8

このようになればコンテナの起動は成功です。

テストページ確認

でApacheのテストページが見えてます。

だと応答しないとなります。

コンテナにログインをして実行

コンテナにログインをして、php-fpmを実行します

1docker-compose exec almaLinux8 bash
2 
3[docker@vultr lamp]$ docker-compose exec almalinux8 bash
4[root@4384e3216f7a /]#  ←このようにコンテナIDになったらログイン成功
5[root@4384e3216f7a /]# php-fpm

これでphp-fpmが実行できます

phpinfoを表示

これはドキュメントルートに直接ファイルを作成します

1[root@4384e3216f7a /]# vi /var/www/html/info.php
2<?php
3phpinfo();
4?>

これで表示されればOKです

なぜコンテナログインしないといけないのか?

DockerfileにあるCNDコマンドは1回しか使えません。しかし、FastCGIの場合はphp-fpmの起動が必要になります

  • httpdの実行
  • php-fpmの実行

この二つをCMDでやることはできません。

毎回手動でコンテナにログインをしないといけないのか?

毎回手動となるとかなりの手間になります。そこで自動化する方法をとりたいと思います。次回の記事でそれを記載していきます

個人支援・寄付について

サイトラボでは個人支援・寄付を受けております。ご協力いただける方はお願いいたします。当サイトではビットコインで受け付けております。

  • ビットコイン:3LHnADwZwUbic2L45EnVJEykiG6KfbqrwS