DockerでPHP＋Apacheの環境を構築する

## はじめに
この記事では、Docker環境を構築するための準備から、PHP+ApacheのWebサーバー上で`"Hello World!"`を表示するまでの手順を紹介する。

|  |環境情報  |
|---|---|
|PC  |Apple M1 Pro  |
|OS  |Sonoma 14.4  |
|Docker  |27.2  |
|PHP  |8.2  |
|Apache  |2.4  |

## 1. Docker Desktopをインストールする
(1) [公式サイト](https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/install/)からDocker Desktop for Macをダウンロードし、Applicationsフォルダに追加する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853295/92d1d37b-3b1f-b993-8354-3b0ea4b95172.png" width=70%>

(2) ApplicationsフォルダからDocker Desktopを選択し、起動する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853295/222f01a0-c54c-74f3-e5b8-d7e94df25c81.png" width=70%>

(3) メニューバーにDockerのアイコンが表示されたらインストール完了。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853295/654493e9-edfb-9cc3-4928-4c1461bfe437.png" width=50%>

## 2. イメージを選択する
イメージは、Docker Hubの [イメージ一覧ページ](https://hub.docker.com/search?image_filter=official&type=image) から探すことが出来る。
各イメージのページにある「Tags」というタブから、使用するタグ（バージョンのようなもの）を選ぶ。

![スクリーンショット 2024-09-19 18.08.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853295/d7886328-dfc5-f103-0477-15af5605dcec.png)

今回は、`php:8.2-apache`を使用する。

![スクリーンショット 2024-09-19 18.13.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853295/194c7208-c10f-d1b5-9c4f-3aad6d7e2183.png)

「Layers」という項目に、そのイメージを構成するレイヤーが記載されており、特に重要なのは以下の2項目。

![スクリーンショット 2024-09-22 18.50.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853295/22850e73-6a08-f476-330c-084d38c53559.png)
- `WORKDIR /var/www/html`：Webサーバーのドキュメントルートが`/var/www/html`である
- `EXPOSE 80`：コンテナがポート80を使用して外部と通信する

## 3. Dockerプロジェクトを作成する

(1) Docker環境を構築するためのプロジェクトディレクトリを作成する。
```terminal
$ mkdir docker_project
```

(2) プロジェクトディレクトリ配下に`src/index.php`と`Dockerfile`を作成する
```terminal
$ cd docker_project
docker_project $ mkdir src && touch src/index.php Dockerfile
```



## 4. Dockerfileを編集する
```Dockerfile:Dockerfile
# イメージを指定
FROM php:8.2-apache

# src配下をドキュメントルート配下にコピーする
COPY src/ /var/www/html/
```

このDockerfileを元にイメージをbuildすることで、`php:8.2-apache`をベースイメージとして使用し、`src/index.php`をドキュメントルート配下にコピーした新しいDockerイメージが作成される。

## 5. index.phpを編集する
```php:src/index.php
<?php

echo ('Hello World!');
```
このファイルがドキュメントルート配下に置かれることで、Webサーバーへアクセスした際に`Hello World!`と表示されるようになる。


## 6. Dockerfileからイメージを構築する
4で作成したDockerfileを元に、イメージをbuildする。
```terminal
docker_project $ docker build -t php-app:latest .
[+] Building 3.0s (7/7) FINISHED                                                                                                                                                 docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                                                                             0.0s
 => => transferring dockerfile: 81B                                                                                                                                                              0.0s
 => [internal] load metadata for docker.io/library/php:8.2-apache                                                                                                                                2.9s
 => [internal] load .dockerignore                                                                                                                                                                0.0s
 => => transferring context: 2B                                                                                                                                                                  0.0s
 => [internal] load build context                                                                                                                                                                0.0s
 => => transferring context: 96B                                                                                                                                                                 0.0s
 => CACHED [1/2] FROM docker.io/library/php:8.2-apache@sha256:d821ef9306199fe2df0f5a62c43076bc56e3c3bfa469431284aa00a610e62a26                                                                   0.0s
 => [2/2] COPY src/ /var/www/html/                                                                                                                                                               0.0s
 => exporting to image                                                                                                                                                                           0.0s
 => => exporting layers                                                                                                                                                                          0.0s
 => => writing image sha256:e0c9f0489f5f6150efe7f79c0bf22fc20ca2a5aa6465c114b25fa46dc56e0f92                                                                                                     0.0s
 => => naming to docker.io/library/php-app:latest 
```
- `docker build`：Dockerfile とコンテキストからDockerイメージを構築するコマンド
- `-t <image_name>:<tag>`：イメージに名前とタグを付けるためのオプション
- `.`：Dockerfileが存在するディレクトリのパス（ビルドコンテキスト）

<br>
Docker Desktopで、イメージが構築されたことを確認。

![スクリーンショット 2024-09-23 10.44.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853295/f51b1e80-999e-49ee-ff47-29045c4ed5b7.png)


## 7. コンテナを起動する
```terminal
docker_project $ docker run -p 8080:80 -d -v "$(pwd)"/src:/var/www/html --name php-container php-app:latest
85ab8ec05f5c147ee67e9c3c3a93ca72af2339373f2df2000ff5833d822c9636
```
- `docker run`：Dockerコンテナを起動するコマンド
- `-p <host_port>:<container_port>`：ホストとコンテナのポートをマッピングするためのオプション
- `-d`：デタッチモード（Dockerコンテナをバックグラウンドで実行するモード）にするオプション
- `-v <host_path>:<container_path>`：ホストのディレクトリやファイルをコンテナ内にマウントするためのオプション
- `--name <container_name>`：コンテナに名前を付けるためのオプション
- `php-app:latest`：使用するDockerイメージとタグの名前

<br>
Docker Desktopで、コンテナが立ち上がったことを確認。

![スクリーンショット 2024-09-23 11.07.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853295/2bc8536a-fd2f-1907-2237-b39b878494fc.png)

## 8. Webサーバーにアクセスして表示を確認
ホストのポート`8080`をコンテナのポート`80`にマッピングしている状態なので、`localhost:8080`にアクセスして、`index.php`の内容が表示されればOK。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853295/1d651012-5ba8-1cfe-6e37-6c5f13557c66.png" width=70%>