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
-,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


  1. YAT より:

    Laravelインストールの項目で用意する ./docker/php/Dockerfile の5行目にある
    curl-devel
    でエラーが出て、これは正しくは
    curl-dev
    でしょうか?

    調べると teratail の記述のアンサーで解決できたのでお知らせさせていただきました。
    https://teratail.com/questions/310977

comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Go言語

gorpを使ってDBを操作する

1 はじめに1.1 GoのORM1.2 gorpの紹介2 gorpの基本操作2.1 insert2.2 select2.3 update2.4 delete3 構造体のmapping4 テーブルの作成 ...

aws

CodeWhispererを使ってみた

1 はじめに2 CodeWhispererとは3 導入4 使い方5 データの取り扱い6 さいごに7 おすすめ書籍 はじめに AWSからコード生成サービスのCodeWhispererが一般公開されたので ...

rails

configに追記したのに、rails runnerが起動しない?

1 はじめに1.1 環境2 rails runnerを使用してみる2.1 バッチファイルの作成2.2 configにパスを追記2.3 実行3 ところが…3.1 解決方法4 おまけ(runnerコマンド ...

js

GoogleAppsScriptを使ってmBaaSの定期実行処理を実装する

1 はじめに1.1 簡単な状況説明1.2 定期実行を行う方法2 実装2.1 実装の流れ2.2 JavaScriptの実装2.3 スクリプトをアップロードする2.4 Google Apps Script ...

laravel logo

Laravel Admin でCSVインポートを実装する

1 はじめに2 下準備2.1 Laravel Adminの導入2.2 Laravel Excelの導入3 Laravel Excelの実装3.1 Importクラスの作成3.2 モデルのfillabl ...

フォロー

blog-page_side_responsive

2019年3月
 12
3456789
10111213141516
17181920212223
24252627282930
31  

アプリ情報

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