phpコンテナの構築
Dockerfileを用いてLAMP環境を構成するコンテナのうちphpコンテナを構築してみましょう。
あらかじめ ~/MyDocker/php_sample ディレクトリを作成し、その中にDockerfileを作成しておきます。
1. phpイメージの利用
まず、dockerhubから公式イメージのphp:7.4-apacheをpullして利用します。このイメージはdebian上にapache2およびphpモジュールのインストールを実行したものとなります。
# apacheとphp7.4がインストールされたwebサーバ
FROM php:7.4-apache
2. iniファイルの準備
続いて、日本語向けの環境が利用できるように、php.iniファイルの準備を行います。Dockerfileのあるディレクトリに、php.ini を作成し
php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
として保存しておきましょう。 これによってタイムゾーンの設定や日本語環境の設定などが行われます。
なお、iniファイルのiniとは、初期化を表す initialize の省略形です。
3. iniファイルのコピー
作成したiniファイルをイメージ内にCOPYコマンドでコピーします。
php:7.4-apache イメージにおける設定ファイルの設置場所は /usr/local/etc/php/ です。
# apacheとphp7.4がインストールされたwebサーバ
FROM php:7.4-apache
# 設定ファイルをコンテナにコピー
COPY ./php.ini /usr/local/etc/php/
4. 各種phpモジュールのインストール
つづいて、各種php拡張モジュールのインストールを行います。 今回インストールするモジュールは以下とします。
- pdo_mysql: PDO(PHP Data Object)をmysqlで利用
- mysqli: mysqli_queryなどの利用
- mbstring: マルチバイト文字関連処理の利用
- exif: 画像ファイルのexif情報を扱う処理の利用
phpモジュールのインストールは通常apt-getを用いて行いますが、dockerを利用した構築の場合、代わりに docker-php-ext-install を用います。
# apacheとphp7.4がインストールされたwebサーバ
FROM php:7.4-apache
# 設定ファイルをコンテナにコピー
COPY ./php.ini /usr/local/etc/php/
# 各種PHPモジュールのインストール
RUN apt-get update && apt-get install -y libonig-dev && docker-php-ext-install pdo_mysql mysqli mbstring exif
以上でphpコンテナの構築用のDockerfileの準備は完了です。
イメージのビルド
~/MyDocker/php_sample に移動して、イメージのビルドを行います。
docker build -t [ユーザ名]/php_sample:1.0 .
上記のコマンドでイメージを作成し、
docker container run --name php -p 8080:80 --rm [ユーザ名]/php_sample:1.0
でコンテナを立ち上げましょう。
にアクセスすると、apacheの画面が開きます。(現時点ではドキュメントルートにファイルが存在しないためエラー表示となります)
docker exec -it php bash
上記のコマンドでphpコンテナにログインし、/var/www/html (ドキュメントルート)にいることを確認して
echo "<?php echo 'Hello, World';" > index.php
として、index.phpを作成してみましょう。
再度 http://localhost:8080 にアクセスすると、phpから出力された「Hello, World!」の文字が出力されます。
これでphpコンテナの作成は完了です。
コンテナからexitして、
docker container stop php
でphpコンテナを停止しておきましょう。
ボリュームのアタッチ
現状では、コンテナ内のファイル操作にはコンテナへのログインを行い、さらにコンテナ内でファイルの作成を行う必要があります。これは非効率です。
ボリュームのマウントを行うことで、利用しているOSのフォルダをコンテナ内のフォルダとして扱うことが可能です。
まず、コンテナを立ち上げる際に、-vオプションを使うことでボリュームのマウントが可能です。
-v オプションは
-v [ローカルのフォルダパス(絶対パス)]:[コンテナ内のフォルダパス]
という形式で設定可能です。
docker container run --name php -p 8080:80 -v [php_sampleのパス]/www:/var/www --rm [ユーザ名]/php_sample:1.0
としてコンテナを実行してみましょう。(php_sampleのパスは、php_sampleフォルダ内でpwdを実行して確認しましょう。)
正常に実行されると、php_sampleディレクトリ内にwwwディレクトリが作成され、その中にhtmlディレクトリがある状態になります。
VSCodeなどでhtml内にindex.phpファイルを作成し、
index.php
<?php
echo 'volumeのテスト';
として保存してみましょう。
http://localhost:8080 にアクセスすると、index.phpが実行され「volumeのテスト」と表示されます。
このように、ボリュームのマウントを使うことで
- コンテナ内のデータをローカルのデータであるかのように編集できる
- 次回以降もマウントしたフォルダを再度利用することでデータを再利用できる
といったメリットがあります。