BETA

個人学習メモ:Docker Compose で Laravel ( LEMP )環境を作った

投稿日:2020-08-01
最終更新:2020-08-07

Docker + Docker ComposeLaravel の開発環境を作った際の手順メモ。

目次

1. 学習目的

  1. Docker + Docker Compose での環境構築の理解
  2. PHP環境の構築の理解
  3. Homestead 等のパッケージを使用せずに Laravel 環境を作ってみる

2. Docker + Docker Compose の導入

Vagrant環境なら以下コマンドで両方終わる。

vagrant plugin install vagrant-docker-compose  

正式な手順は以前の記事

3. Webサーバー( Nginx )をたてる

何にしろWebサーバーをたてんことには始まらないので、 Nginx コンテナを用意してHTMLファイルを表示させてみる。

3.1. 何故 Apache ではなく Nginx なのか

特に論理的な理由はないが、 Nginx の方が最近は主流らしいことと、 Apache は触ったことがあるので学習のために。
突き詰めればお互い得意分野が違うだろうから、開発・運用するサービスによって選ぶべきなんだろうがそこまでの知識はまだない。

3.2. 実際にコンテタをたてる

作業ディレクトリに下記構成でファイル・ディレクトリを用意。

.  
├── docker  
│   ├── web  
│   │   └── default.conf # Nginx設定用のファイル  
│   └── php  
├── docker-compose.yml   # Docker Compose設定用のYAMLファイル  
└── index.html           # テスト表示用のHTMLファイル  

一応、ディレクトリとファイルの作成コマンドはこう。

$ mkdir ディレクトリ名  
$ touch ファイル名  

docker-compose.yml の編集。
今回はひとつのみだが、 Nginx コンテナを複数設置してリバースプロキシでの分散処理も出来るっぽい。 Docker 便利すぎて草。

version: '3'  
services:  
  web:  
    image: nginx:stable  
    ports:  
      - '80:80'  
    volumes:  
      - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf  
      - .:/var/www/html  
  • version docker-compose.yml のバージョン宣言。
  • services こっからコンテナの定義していきますよ的な。
    • web コンテナの名前。この下階層が web コンテナの定義になる。しかも名前解決できる。いやマジ Docker 便利すぎて草。
      • image 作成時に使用する Docker イメージを指定 :stable の部分はバージョンの指定、安定版を取得。この記述では Docker Hub から取ってきている。
      • ports ポートフォワードの指定。ホスト:コンテナ。今回では仮想マシン上に乗っていて、そちらでホスト:8000、ゲスト:80を指定しているので、この記述で http://localhost:8000 にブラウザでアクセスすれば表示されるはず。
      • volumes ホストとコンテナ間のファイル共有の設定。コンテナを止めると変更したファイルは消えてしまうので、ホスト側で保持する。

default.conf の編集

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;  
}  
  • listen リクエストを受け付けるIPアドレス・ポート番号の指定。IPアドレスは省略。
  • root, index ドキュメントルートディレクトリとファイルの設定。 index は右から優先される。
  • access_log, error_log そのまま各ログの出力先の設定。

index.html の編集

<h1>Hello, World on Docker!</h1>  

コマンドを実行してコンテナを起動

$ docker-compose up -d  
  • -d オプションでバックグラウンドで実行する。とりあえずつけとけ。

http://localhost:8000 にアクセスして index.html が表示されるのを確認。

4. Nginx 上でPHPを動かす

docker-compose.ymlPHP-FPM コンテナ定義を追加。追加したところハイライトしたい……。

version: '3'  
services:  
  web:  
    image: nginx:stable  
    ports:  
      - '80: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  
  • web 下記を追加。
    • depends_on 依存関係を示す。ざっくり言うとコンテナの起動順。こいつが起動したら起動しますよ、的な記述。"Depends on you."で「あなた次第よ」なんて言ったりしますね。 浜崎あゆみ。
  • app PHP用コンテナの名前。
    • image, volumes webと同じ。

default.conf にPHP実行用の記述を追加。

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;  
    }  
}  
  • location URLでどのファイルを返すかの設定。ここはよく分からんかったので別記事を参考に。 location の後のプレフィックスによって一致の仕方が変わる。 ※
    • try_files ファイルの存在確認。この記述ではリクエストのあったファイルやディレクトリが存在しない場合は、index.php を返す となってます。$is_args$args はGETパラメータのこと。
  • location ~.php で終わるファイルに対しての処理
    • fastcgi_split_path_info 正規表現で $fastcgi_script_name(1つ目) と $fastcgi_path_info(2つ目) の値を定義している。
    • fastcgi_pass プロキシ設定。PHPを処理するために投げている。本来 IPアドレス:ポート番号 で指定するところを、app で名前解決している。
    • fastcgi_index スラッシュで終わるURLに追加するファイル名。 $fastcgi_script_name の値になる。
    • include 設定ファイルのインクルード。
    • fastcgi_param FastGGIにわたすパラメータの設定。
プレフィックス 説明
なし 前方一致
^~ 前方一致。一致したら、正規表現の条件を評価しない。
= 完全一致。パスが等しい場合。
~ 正規表現(大文字・小文字を区別する)
~* 正規表現(大文字・小文字を区別しない)

※参考記事:nginx連載5回目: nginxの設定、その3 - locationディレクティブ

index.php を用意して。

<?php phpinfo();?>  

コンテナを再起動してから。

$ docker-compose down  
$ docker-compose up -d  

表示を確認。
http://localhost:8000

5. DBサーバー( MySQL )をたてる

いつもの。

version: '3'  
services:  
  web:  
    image: nginx:stable  
    ports:  
      - '80: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:  
  • app 下記追加。
    • depends_on 名前解決。
  • mysql MySQL 用コンテナ定義。
    • image, ports, volumes いつもの。
    • environment ログイン設定。
      • MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD, MYSQL_ROOT_PASSWORD 詳細
  • volumes トップレベルに書くことで他コンテナからも mysql-data を参照できるように。

コンテナを再起動して、 MySQL コンテナに入る。
ちなみに VScodeRemote Development + Docker プラグイン導入済み)なら、再起動後、 MySQL コンテナを右クリックして Attach Shell でもログイン可能。便利だね VScode

$ docker-compose down  
$ docker-compose up -d  
$ docker-compose exec mysql bash  

MySQLにログイン。パスワード入力しろって出ます。

mysql -h localhost -u user -p  

データベース一覧を確認。

show databases;  

下記のように表示されればok。

mysql> show databases;  
+--------------------+  
| Database           |  
+--------------------+  
| information_schema |  
| sample             |  
+--------------------+  

6. Laravel を導入する

docker/php に Dockerfile を作成。
このファイルでやっていることはコメントに記述。

FROM php:7.2-fpm  

# composerのインストール  
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer  
# git, zip, unzip, vimのインストール  
RUN apt-get update \  
&& apt-get install -y \  
git \  
zip \  
unzip \  
vim  

# PDOのインストール  
RUN apt-get update \  
    && apt-get install -y libpq-dev \  
    && docker-php-ext-install pdo_mysql pdo_pgsql  

# 作業ディレクトリの指定  
WORKDIR /var/www/html  

Dockerfile から app コンテナを立ち上げるようにする。

version: '3'  
services:  

  web:  
    image: nginx:stable  
    ports:  
      - '80: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:  
  • app 下記追加。
    • build image を置き換え。Dockerfileがあるディレクトリを参照する。

コンテナを再起動。PHP に入って、 Dockerfile からインストールした Composer を使って Laravel プロジェクトを作成。

composer create-project --prefer-dist laravel/laravel プロジェクト名  

結構時間がかかりますが docker-compose.yml と同じディレクトリに 上で指定したプロジェクト名と同じディレクトリが出来て、その中に Laravel のファイル群が展開されています。

プロジェクトディレクトリの中の .env を編集して、 MySQL と接続。

DB_CONNECTION=mysql  
DB_HOST=mysql  
DB_PORT=3306  
DB_DATABASE=sample  
DB_USERNAME=user  
DB_PASSWORD=password  

コンテナ再起動、phpログインして、マイグレートをかける。

php artisan migrate  

default.confrootLaravel のために変更しておきましょう。

root /var/www/html/my-laravel-app/public;  

はい、これでコンテナ再起動して、いざ http://localhost:8000 へ!
Laravel のトップページが表示されてたらOK。

Gitにあげる場合は .env 等をトラッキングから外すのを忘れないこと。

以上。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

One-Trick-Pony 一つの芸当しかできない子馬。転じて、一つしか才能(能力)のない人

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう