
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
ディレクトリパス
ディレクトリは以下のようになってます
Dockerfile
※コードを載せます
04 | RUN dnf install -y https: |
05 | RUN dnf install -y https: |
06 | RUN dnf module enable php:remi-8.0 -y |
07 | RUN dnf install -y httpd |
09 | RUN mkdir /run/php-fpm/ |
12 | CMD [ "/usr/sbin/httpd" , "-D" , "FOREGROUND" ] |
コード解説
CentOS8から使えるようになったmodule機能があります。これを使ってPHP8をインストールします。最初の2行はリポジトリを追加してます。
デフォルトでインストールされるPHPをその後8.0にしてます。その後apacheとPHPのインストールをしてます
ここでディレクトリを作成してます。Dockerは基本的に軽くするため、余計な機能などはないのが多いです。例えばRedHat系でおなじみのsystemctl コマンドはベースイメージのダウンロードした状態では使えません。
そのため、php-fpmを使おうにもエラーとなります
エラー文
1 | ERROR: unable to bind listening socket for address '/run/php-fpm/www.sock' : No such file or directory (2) |
2 | ERROR: FPM initialization failed |
これを回避するためにビルドに組み込んでおきます。
docker-compose.yml
今度はDockerFileではなくymlファイルを作成します
4 | container_name: "almalinux8" |
6 | dockerfile: ./Dockerfile |
7 | tty: true # ← これがないとコンテナにログインできない |
コンテナの名前はalmalinux8としてます。ここでは同じディレクトリにあるDockerfileを実行してねとかいてあるだけです。portsは8080で開きますという意味です。
ビルドを実行
1 | $ docker-compose build --no-cache |
エラーが出なければビルド成功です
コンテナ実行
1 | [docker@vultr lamp]$ docker-compose up -d |
4 | ⠿ Container almalinux8 Started |
7 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
8 | 4384e3216f7a 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を実行します
1 | docker-compose exec almaLinux8 bash |
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 |
これで表示されればOKです
なぜコンテナログインしないといけないのか?
DockerfileにあるCNDコマンドは1回しか使えません。しかし、FastCGIの場合はphp-fpmの起動が必要になります
この二つをCMDでやることはできません。
毎回手動でコンテナにログインをしないといけないのか?
毎回手動となるとかなりの手間になります。そこで自動化する方法をとりたいと思います。次回の記事でそれを記載していきます
個人支援・寄付について
サイトラボでは個人支援・寄付を受けております。ご協力いただける方はお願いいたします。当サイトではビットコインで受け付けております。
- ビットコイン:3LHnADwZwUbic2L45EnVJEykiG6KfbqrwS