はじめに
はじめまして、新卒1年目のyykaoruです。
今回はDockerを勉強しようと思い、DockerでPHPの実行環境を構築してみたお話です。
前提
- Docker、docker-composeがインストールされていること
やってみること概要
今回行うことは、phpコンテナにローカルストレージのsrcをマウントし、nginxコンテナからアクセスして確認、という流れです。
ファイル構成とソースコードを順番に説明し、最後に実行してみたいと思います。
ファイル構成
今回DockerでPHPの実行環境を作成する上でのファイル構成は以下の通りです。
- nginx
- Dockerコンテナ起動時、nginx内の設定ファイルに書かれている設定に上書きします。
- なぜDockerファイルがないかは後に記述します。
- php
- 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でインストールしています。
-
- ここではコンテナ側のポートとローカル側のポートをつなぐ役割をしています。
- 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
- COPY
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にアクセスすると以下のような画面が表示されます。
これでphpの実行環境は完成です!
後は、src内でphpファイルを変更したりしてみましょう!
最後に
今回はDockerを利用してPHPの実行環境を構築してみました。
今回は必要最小限の構成なので、次回記事を書く機会にはPHPのフレームワークであるLaravel開発環境をDockerを利用して構築したお話をしたいと思います。
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com