BackEnd

Laravelの開発環境をdocker-composeで一から構築してみる

投稿日:

はじめに

こんにちは。以前、LaradockでLaravelの開発環境を作っていました。ひとまずLaravelを触ってみたい時はそれで十分ですが、ほとんどチュートリアルのコピペで環境構築が終わってしまうので、dockerやdocker-composeが何をしているのかよく分からないままでした。

Laravel以外の環境構築もDockerで行えるようになっておきたいですし、今回は自力でdocker-composeを書いてローカル環境を構築してみます。

環境はmacOS High Sierra 10.13.6、Docker Desktop 2.0.0.2がインストール済みであることを前提とします。

nginxでwebサーバを立てる

適当なディレクトリを決めて、その中で作業します。どこでも構いませんが、今回は ~/test として、必要なコンテナを構築する情報を docker-compose.yml に記述していきます。

  • image: nginx:latest で、DockerHub上にあるnginxの最新版のDockerイメージを指定できます。ローカルにイメージがあればそれを使い、無ければダウンロードされます。
  • ports はそのままポート番号です。左側がホスト側、右側がコンテナ側です。上記の場合はいずれもhttp通信のデフォルトである80番を指定しています。
    例えば 8000:80 と記述した場合、ブラウザからアクセスする際は http://ホスト名:8000 となります。
  • volumes でコンテナと共有したいパスを指定します。ホスト側で作成した default.conf を、コンテナ側の同ファイルと置き換えます。
    ポートと同じく ホスト側パス:コンテナ側パス の順で記述します。

default.conf作成

nginxの設定ファイルです。ひとまず最低限の設定のみ記述し、PHP関連の設定は後で追記します。

index.html作成

nginxの動作を確認できればよいので、htmlの中身は1行で構いません。

nginxコンテナ起動

ブラウザで http://localhost にアクセスして Hello nginx. の文字が出てくればOKです。

nginxでPHP-FPMを動作させる

docker-compose.yml編集

静的コンテンツが見れるようになりましたので、次はPHP-FPMです。 docker-compose.yml にPHP-FPMコンテナの情報を記述していきます。
また、nginxにもPHP-FPMとの関連性を追記します。

  • image: php:7.3-fpm-alpine で、nginxと同様にdockerhub上のイメージを指定します。PHP-FPMのイメージはたくさんあるのですが、ここでは軽量なalpine Linuxのイメージを使っています。
  • depends_on: はコンテナの依存関係を示します。上記のように記述することで「php-fpmコンテナが起動したらwebコンテナを起動する」という意味になり、起動の順番を制御できます。

default.conf編集

nginxの設定ファイル default.conf にもPHP-FPMの設定を追記します。
fastcgi_pass の項にPHP-FPMへの接続情報を記述します。 docker-compose.yml でPHP-FPMの名前として指定している php-fpm を記述し、PHP-FPMのデフォルトポートである9000番を指定します。

index.php作成

index.html と同様に、起動を確認できれば充分です。

コンテナ起動

初回起動ではイメージのダウンロードが実行されます。最後2行の done が表示されたら起動OKです。再度 http://loalhost にアクセスしてみましょう。

MariaDBを立ち上げる

データベースはMariaDBを使用します。MySQLでも問題ありませんが、設定や接続方法はほとんど一緒(らしい)なので、試しに使ってみようという程度のチョイスです。

docker-compose.yml編集

db: 以下がMariaDBに関する記述です。また、 php-fpm にも上述の depends_on を追記しています。

environment 以下にMariaDBの情報を設定しています。MariaDB最新の10系はMySQL5.7がベースとなっており、MySQL用の設定がそのまま使えるようです。

  • MYSQL_ROOT_PASSWORD: rootユーザーの初期パスワードです。
  • MYSQL_USER root以外の初期ユーザーを設定できます。
  • MYSQL_PASSWORD ↑で設定した初期ユーザーのパスワードです。
  • MYSQL_DATABASE を指定することで、MariaDBコンテナに接続する際のデータベース名を定義できます。データベースが無い場合は作成されます。

コンテナ起動

docker-compose up -d でMariaDBコンテナも起動するようになります。

接続確認

PHPからMariaDBへの接続はLaravelインストール後に設定しますので、まずはMariaDBが立ち上がっていることの確認のみです。

Laravelインストール

ようやくLaravelです。ComposerやPHP拡張など、Laravelのインストールと動作に必要なパッケージを用意します。 php-fpm コンテナの中でコマンドを実行してもよいのですが、 docker-compose コマンド実行時に自動でよしなにやってくれるように、 docker-compose.yml を編集します。

php:7.3-fpm-alpine イメージには上述のパッケージが含まれていませんので、別途 Dockerfile を作成し、そこにインストールコマンドを記述します。

build: に記述したパスに Dockerfile を作成します。
$ mkdir ./docker/php && vi ./docker/php/Dockerfile

  • RUN 以降をシェルコマンドとして、コンテナ起動時に実行します。
  • apk add でパッケージインストールを行います。alpine以外のイメージだと大抵は apt-get で、CentOSなどのRedHat系で言う yum ですね。
  • $PHPIZE_DEPS を指定することで、phpizeに必要なパッケージが自動でインストールされます。phpizeはPHP拡張モジュールを動的にビルドするのに必要で、これがないとPHP拡張を導入する際、いちいちPHP本体をビルドし直すことになってしまいます。
  • pecl install xdebug はdockerとは関係なく、peclライブラリを入れる時のコマンドそのままですね。必要に応じてimagickやredisなどお好きなものを。
  • docker-php-ext-install でPHP拡張をインストールし、 docker-php-ext-enable で有効化します。意味こそコマンド名そのままですが、dockerコンテナ上ではこういう書き方になるんですね。
    MariaDBはMySQL用のライブラリで接続可能ですのでpdo_mysqlを入れます。その他mbstringなど最低限必要そうなものを入れていますが、ここもお好みで。
  • RUN composer の行はLaravelのインストールを実行するコマンドです。 testapp はプロジェクト名ですので、ここは自由にどうぞ。

コンテナ再構築

docker-compose up -d を実行しましょう。パッケージのダウンロード/インストール/ビルドが一斉に走りますので、結構かかります。
上述のDockerfileの最後にLaravelインストールのコマンドを記述すればコンテナ構築と同時にインストールも実行されますが、Dockerfileに書くとコンテナ起動時に毎回Laravelのインストールが走ってしまうので、あとでコンテナに入って実行します。

Laravelインストール

ここでもLaravelが依存するComposerのパッケージ群がモリモリ入りますので、数分お待ち下さい。

Laravelのwelcomeページを表示する

Laravelの公開ディレクトリをドキュメントルートにするため、 default.conf を編集します。 location の中に下記の1行を追記し、 docker-compose restart で変更を反映してください。

LaravelからMariaDBに接続する

Laravelプロジェクト内の .env ファイルに、 docker-compose.yml で設定した接続情報を記述します。 DB_HOST にはMariaDBのコンテナ名が入ります。この場合は db ですね。

マイグレーション実行

php-fpm コンテナ内で実行します。DB接続に成功すれば、最初から入っているマイグレーションファイルが実行されます。

上記のようなメッセージが表示されればOKです。お疲れ様でした。

さいごに

Laradockはチュートリアルが充実していたおかげで、docker-composeについてはほぼ知識ゼロでも構築ができてしまっていました。今回 docker-compose.yml を調べながら一項目ずつ書くことで、それぞれがどのような意味で何が実行されているのか、多少は把握することができるようになりました。

おすすめ書籍

Docker/Kubernetes 実践コンテナ開発入門 PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

laravel logo

Laravel Cashier サブスクリプションに使用するテーブルを理解する

1 はじめに2 Laravel Cashierのテーブル2.1 usersテーブル2.2 subscriptionsテーブル2.3 supscription_itemsテーブル3 課金情報の更新方法4 ...

aws

ALB+EC2な環境でhttpをhttpsにリダイレクトする

1 はじめに1.1 前提条件2 ALBの設定3 Nginxの設定3.1 注意点4 さいごに はじめに httpsに対応済みのWebサイトの場合、httpでアクセスされた時にhttpsでリダイレクトする ...

rails

Ruby、Railsの時間に関するメソッドを使用してみた

はじめに 普段PHPのお仕事をしています、tonnyです。 半年程前からRuby on Railsの勉強を始めました。 今回はよく使う時間に関するメソッドついてまとめたいと思います。 目次 1 はじめ ...

docker-syncでファイルの同期を高速化する

1 はじめに2 docker-syncの導入3 設定ファイルの作成3.1 docker-composer.yml3.2 docker-compose-dev.yml3.3 docker-sync.ym ...

[Dialogflow + CF] アクア様が罵倒してくれたり天気を教えてくれるSlackボットを作る

1 はじめに2 Dialogflowの準備2.1 プロジェクトを作る2.2 Intentを作る2.3 試してみる2.4 WELCOME Intentを作る3 Slackボットを作る4 名前を答える5 ...

フォロー

blog-page_side_responsive

2019年3月
 12
3456789
10111213141516
17181920212223
24252627282930
31  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。