【Docker/PHP】dockerでLaravelの環境構築を行う方法。
今回の記事ではdocker環境でApache+PHP+Laravelの環境構築を行う方法についてご紹介していきます。
dockerが便利すぎて困ります。。
ローカルPCに詰め込みすぎずに色々できるの最高です。
では今回の指針を紹介していきます。
・ディレクトリの作成
・各イメージのbuildと確認
・laravelプロジェクトの作成
今回はdockerfileのみではなく各dockerfileをまとめてbuildできるdocker-compose.ymlを用います。下記ページが非常に参考になったのでほぼそれにしたがって行なっていきます。
まあ勉強用の備忘録兼参考になればなー程度です。笑
こちら。
では早速見ていきましょう。
・ディレクトリの作成
始めに作成するディレクトリは下記です。これを作ってください。
Macでめんどくさい方は下記コピーでも!
mkdir docker-compose-laravel && cd docker-compose-laravel && mkdir docker docker/web && touch docker/web/default.conf && touch docker-compose.yml index.html
tree
下記になってたらOK!
.
├── docker
│ └── web
│ └── default.conf
├── docker-compose.yml
└── index.html
・各イメージのbuildと確認
docker-compose.ymlの編集を行います。
まずは何もない状態なので下記から順に追っていきましょう。
version: '3'
services:
web:
image: nginx:1.15.6
ports:
- '8000:80'
volumes:
- ./docker/web/default.conf:/etc/nginx/conf.d/default.conf
- .:/var/www/html
Version3の設定はテンプレと思っていい。(安定の現バージョンが3のため)
services:以下にbuildするものを書いていく感じかな。
webは根棚の名前でそのさらにしたのimageとかからが実行する内容を書いてる感じ。
portはportね。(ホスト:コンテナ )
volumesは大事です。ホストのディレクトリ:コンテナ側のディレクトリの繋がるところ。
具体的に書くと./docker/web/default.confがコンテナ側の/etc/nginx/conf.d/default.confに反映され、さらに、ホスト側(ローカル)のルートディレクトリ(ここでは、作成したディレクトリ./docker-compose-laravel)(まあ今いるディレクトリのこと)の内容がホスト側の/var/www/htmlに反映されます。つまりコンテナに入ってlsなどでなかみればローカルの構成と同じになっているはずです。後で確認しましょうか。
次にdefault.confのファイルを編集していきましょう。
Nginxの設定ファイルです。
server {
listen 80;
root /var/www/html;
index index.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
listenでは、Webサーバがリクエストを受け付けるIPアドレスやポート番号を設定します。こここでは、IPアドレスを省略しており(本当はポート:IP)、デフォルトの設定として、すべてのIPアドレスの80番ポートでリクエストを受け付けます。
root, indexでは、それぞれ、ドキュメントルートのディレクトリ・インデックスとして使われるファイル名を設定します。
ここでは、リクエストのURIが/で終わっている(つまりディレクトリになっている)ときに、/var/www/html/(リクエストのURI)/index.htmlをレスポンスとして返すように設定しています。
access_log, error_logでは、それぞれ、アクセスログの出力先パス・エラーログの出力先パスを指定しています。
ではindex.htmlにかきを記載して確認に移りましょう。
<h1>TEST</h1>
docker-compose up -d
-dでバックグラウンドでの起動になるのでターミナルいじれます。記載しましょう。
上記でコンテナの作成と起動を行なってくれます。
こちらで確認してください。TESTと記載されていればOK!
ここまででおそらくエラーになるところはないと思いますのでかき間違い等を疑って見てください。
では次に進みましょう。
次にPHPをNginxで動かします。
version: '3'
services:
web:
image: nginx:1.15.6
ports:
- '8000:80'
depends_on:
- app
volumes:
- ./docker/web/default.conf:/etc/nginx/conf.d/default.conf
- .:/var/www/html
app:
image: php:7.2-fpm
volumes:
- .:/var/www/html
変更点気付きづらいかもなんで全部コピーして気づいてください笑。
まず、servicesにappを追加します。イメージはphp:7.2-fpmを指定します。
volumesは、/var/www/html配下のファイルやディレクトリを永続化させます。
これで、このdocker-compose.ymlはWebサーバーを立ち上げるコンテナと、PHPを動作させるコンテナの2つのコンテナを定義していることになります。
次に、webにdepends_onを追加し、appを設定します。
depends_onは、サービスの依存関係を定義。要はコンテナ立ち上げの際に都合のいいような順番に調節してくれる。
PHPコンテナが起動→Nginxコンテナが起動するようになります。
server {
listen 80;
root /var/www/html;
index index.php index.html index.htm;
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_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
変更点
・indexの追加:複数設定の場合、先に記述したファイルを優先。今回だとindex.phpとindex.htmlではphpの方を優先させるので表示差っるのはindex.php。
・location設定:URIごとにどのファイルを配信するのかを設定しています。
10行目のlocationでは、URIのパスにファイルがあるか、なかった場合ディレクトリがあるか、ファイルもディレクトリもなかった場合、index.phpを返す、という設定をしています。また、$is_args$argsでは、getパラメータを取得。
14行目のlocationでは、NginxがPHP-FPMにリクエストを渡すための設定。
fastcgi_passのapp:9000についてですが、本来は127.0.0.1:9000のように設定するのですが、docker-composeではすべてのサービス間に自動でリンクが張られており、appのようなサービス名で設定することができます。9000はPHP-FPMが起動するデフォルトのポート番号。
新しいファイルを作成して保存しましょう。
階層は同じところ。
<h1>docker-compose-laravel</h1>
<p>Served by Nginx</p>
<?php phpinfo();?>
docker-compose up -d
tree
.
├── docker
│ └── web
│ └── default.conf
├── docker-compose.yml
└── index.html
└── index.php
同じくこちらで確認してください。PHP情報のページが表示されておればOK!!
次にMySQLの設定です。
version: '3'
services:
web:
image: nginx:1.15.6
ports:
- '8000:80'
depends_on:
- app
volumes:
- ./docker/web/default.conf:/etc/nginx/conf.d/default.conf
- .:/var/www/html
app:
image: php:7.2-fpm
volumes:
- .:/var/www/html
depends_on:
- mysql
mysql:
image: mysql:5.7
environment:
MYSQL_DATABASE: sample
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: password
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
イメージはMySQL。
enviromentに細かい情報をかく。
portはポート番号。
volumesは二つ設定していますが階層が深い方、servviceの中にある方はコンテナ単体の設定、階層の浅いvolumesは全てのコンテナからmysql-dataにアクセスできるように設定する記述です。
これでかきコマンド実行。
docker-compose up -d
docker-compose exec mysql bash
このdocker-compose exec ~コンテナ内での操作を行えるようになります。
↓コンテナ内のbash操作
mysql -h localhost -u user -p
パスワード聞かれるので設定したもの!
show databases;
データも設定したものがちゃんとあるか確認しましょう。あればOK!
次にPHPのDockerfileを作成します。
ディレクトリdockerにdocker/php/Dockerfileを作ります。
現在のtree
.
├── docker
│ ├── php
│ │ └── Dockerfile
│ └── web
│ └── default.conf
├── docker-compose.yml
├── index.html
└── index.php
そのdockerfileにはかきを記載。
FROM php:7.2-fpm
# install composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim
RUN apt-get update \
&& apt-get install -y libpq-dev \
&& docker-php-ext-install pdo_mysql pdo_pgsql
WORKDIR /var/www/html
FROMでphp:7.2-fpmを指定。
RUNでDockerイメージビルド時にDockerコンテナ内で実行するコマンドを定義しています。要はターミナル操作してる感覚。curlコマンドを使ってComposerをインストール、apt-getコマンドでgit, zip, unzip, vimをインストール。
docker-php-ext-installコマンドは圧縮され拡張機能を解凍・インストールするコマンドでPDOをインストール
WORKDIRは、RUNなどの命令を実行するときの作業ディレクトリ。
このDockerfileを実行してもらうためにymlファイルにも追加でbuildの記載。
version: '3'
services:
web:
image: nginx:1.15.6
ports:
- '8000:80'
depends_on:
- app
volumes:
- ./docker/web/default.conf:/etc/nginx/conf.d/default.conf
- .:/var/www/html
app:
build: ./docker/php
volumes:
- .:/var/www/html
depends_on:
- mysql
mysql:
image: mysql:5.7
environment:
MYSQL_DATABASE: sample
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: password
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
buildでDockerfileのあるディレクトリの指定。
では起動!
docker-compose up -d
かなり時間かかります。
docker-compose exec app bash
composerがインストールされています。
上記でコンテナに入っているのでlaravelプロジェクトを作っていきます。
composer create-project --prefer-dist laravel/laravel my-laravel-app
かなり時間かかります。
.
├── docker
│ ├── php
│ │ └── Dockerfile
│ └── web
│ └── default.conf
├── docker-compose.yml
├── index.html
├── index.php
└── my-laravel-app
できましたらlaravelプロジェクトの中のMySQ L設定の.envをいじります。
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=sample
DB_USERNAME=user
DB_PASSWORD=password
上記の箇所を変更するだけでOK!
docker-compose up -d
docker-compose exec app bash
cd my-laravel-app
php artisan migrate
データのmigration!
これでMySQLとの接続もOK!
Nginxの設定も合わせる。
server {
listen 80;
root /var/www/html/my-laravel-app/public;
index index.php index.html index.htm;
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_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
いよいよです、http://localhost:8000でlaravelのページが表示されていればOK!
今回はかなり時間をかけましたがこの設定ファイルをgithubにでも上げておけばいつでもcloneでローカルにコピーしてコンテナの作成・起動を行えば環境構築できると考えると楽です!
データのmigrateはしないと接続はできてないのかな?
今度確認して見ます。
コメント