RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

Dockerを利用してPHP実行環境を構築してみた

f:id:yykaoru:20200830162250p:plain

はじめに

はじめまして、新卒1年目のyykaoruです。
今回はDockerを勉強しようと思い、DockerでPHPの実行環境を構築してみたお話です。

前提

  • Docker、docker-composeがインストールされていること

やってみること概要

今回行うことは、phpコンテナにローカルストレージのsrcをマウントし、nginxコンテナからアクセスして確認、という流れです。
ファイル構成とソースコードを順番に説明し、最後に実行してみたいと思います。

ファイル構成

今回DockerでPHPの実行環境を作成する上でのファイル構成は以下の通りです。

  • nginx
    • Dockerコンテナ起動時、nginx内の設定ファイルに書かれている設定に上書きします。
    • なぜDockerファイルがないかは後に記述します。
  • php
    • PHPコンテナを建てるために必要なDockerファイルと、PHPコンテナの中に配置するPHPの環境設定ファイルとしてphp.iniを作成しておきます。
  • src
    • 実行するphpファイルを配置しておきます。
    • このsrc配下のファイルがnginxで配信されます。
  • docker-compose.yml
    • このファイルでnginx、phpコンテナをまとめてインストールできます。ホント便利。
│  docker-compose.yml
│  
├─nginx
│      default.conf
│
├─php
│      Dockerfile
│      php.ini
│
└─src
        index.php

ソースコード

それでは今回使用するファイルのソースコードを紹介していきます。

docker-compose.yml

version: '3'

services:
  nginx:
    image: nginx:stable-alpine
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

  php:
    build: ./php
    volumes:
      - ./src:/var/www/html

docker-compose.ymlには、nginx,phpコンテナのインストール内容が書かれています。 それぞれのコマンド名を簡単に説明していきます。

  • version:
    • composeファイルのフォーマットのバージョンを明記しています。
  • services:
    • コンテナのインストール内容が書かれます。
  • nginx:
    • サービス「nginx」のインストールを示しています。
  • php:
    • サービス「php」のインストール内容を示しています。
  • image:

    • Dockerでは後述するDockerfileでコンテナのイメージ名を明記してインストールするのが基本ですが、imageでインストールイメージを指定することもできます。
    • 今回はnginxコンテナはcomposeファイルでインストール、phpコンテナはDockerfileでインストールしています。
  • ports:

    • ここではコンテナ側のポートとローカル側のポートをつなぐ役割をしています。
    • nginxの場合は「- "8080:80"」と書かれていますが、ローカル側の8080番をコンテナ側の80番とつなぐという意味を表しています。
  • volumes:

    • ここではローカル側のディレクトリ内容をコンテナにマウントする設定が書かれています。
    • 今回はnginx配下で「- ./src:/var/www/html」と示していますが、これはローカル側の./srcをコンテナ側の/var/www/htmlにマウントするという意味を表しています。
  • build:
    • 作成したDockerfileの場所を指定することで、指定したDockerfileの内容に従ってコンテナがインストールされます。

※以前まではlinks:というものを書いてコンテナ間のネットワークに参加させる必要があったのですが、現在は書かなくてもデフォルトでnetwork:というものが働く様になったようで、これにより各コンテナはそのネットワークに参加した状態になるということのようです。

default.conf

server {
    listen 80;
    root  /var/www/html;
    index index.php index.html;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}

default.confにはnginxの設定内容を記述します。
よくハマってしまう点としては「fastcgi_pass」の設定です。
デフォルトのfastcgi_passは127.0.0.1:9000を指定しており、これはnginxコンテナのlocalhostを指定してしまうために502エラーを返してしまいます。(BadGateway)
このエラーを解決するためにはphpコンテナを指定する必要があり、「fastcgi_pass php:9000;」と明記することでサービス名(php)でphpコンテナを指定することができます。

Dockerfile

FROM php:fpm
COPY php.ini /usr/local/etc/php/

Dockerfileではphpのコンテナイメージのインストール、php設定ファイルの上書きを行っています。

  • FROM
    • php:fpmと指定することでDocker公式が提供しているPHPイメージをインストールします。
  • COPY
    • ローカルにあるphp.iniをインストールしたphp.iniにコピー、上書きします。

php.ini

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

php.iniにはphp実行環境の設定を記述します。
必要に応じて設定を追加します。

index.php

<?php
echo "Hello World!";
phpinfo();

ここではphpスクリプトを書いています。 内容はお好みでどうぞ!

実行

以上のファイルが用意できたら、Docker、Docker-composeがインストールされている環境で以下のコマンドを入力します。

docker-compose build

コマンド入力後、dockerコンテナのビルドが走ります。
ビルドが正常に終了したことが確認できたら、以下のコマンドでコンテナを立ち上げます。

docker-compose up

コンテナが立ち上がった後にlocalhost:8080にアクセスすると以下のような画面が表示されます。 f:id:yykaoru:20200830162301p:plain これでphpの実行環境は完成です!
後は、src内でphpファイルを変更したりしてみましょう!

最後に

今回はDockerを利用してPHPの実行環境を構築してみました。
今回は必要最小限の構成なので、次回記事を書く機会にはPHPフレームワークであるLaravel開発環境をDockerを利用して構築したお話をしたいと思います。

Copyright © RAKUS Co., Ltd. All rights reserved.