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言語

Go言語の基礎〜Go 1.11 開発環境構築とパッケージバージョン管理〜

はじめに こんにちは、雨の日が最近多く、気温の変化が激しくて、体調管理に気をつけなければと思うこの頃です。 さて、今回はGo言語についてです。Go言語をご存知の方は、最近ですと、2018年8月末に1. ...

Go言語

Go言語でテスト作成 testifyの基本的な使い方

はじめに こんにちは、suzukiです。 先週から引き続きgo強化週間です。新しい言語の習得に四苦八苦しております。 第5回目の発表内容は、testifyを利用してテストの作成について触れさせていただ ...

rails

Railsのバリデーション

はじめに 今回はRailsのActiveRecordのバリデーションについて簡単にまとめます。 基本的なバリデーション ある属性に必ず値が入っていること、何文字以内であることなど、一つの属性に対するバ ...

laravel logo

Laravelで認証APIを作る

はじめに 一般的にWebには認証機能があるケースが多いと思います。今回はLaravelで認証APIを作る方法として、JWTを使った方法を紹介します。 条件 以下のバージョンを対象としています。 PHP ...

Go言語

Go言語の基礎〜基本構文その2〜

はじめに 昨日に引き続きGo言語の連載3回目です。 基本構文その1より個人的にはGoの特色が出ているだろう基本文法に関して紹介させていただきます。 配列 Goの配列は固定長です。可変長配列は後述するス ...

フォロー

blog-page_side_responsive

2019年3月
日 月 火 水 木 金 土
 12
3456789
10111213141516
17181920212223
24252627282930
31  

アプリ情報

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