LoginSignup
3
2

More than 3 years have passed since last update.

Docker-composeでLaravel、Nginx、MySQLのローカル開発環境を作る

Last updated at Posted at 2020-05-28

はじめに

以下のリンクをまとめて自分の使いやすいようにした。

【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン
Laravelの開発環境をDockerを使って構築する

メイン参考リンク

DockerでLaravel環境を構築する①~webサーバーの立ち上げ~

最終完成リンク

Docker に Composer をインストールするベストプラクティス(と解説)
Dockerでいい感じにPHP(Laravel)のローカル開発環境を作る

完成図

gitでクローンされる中身

.
├── .env
├── docker
│   ├── nginx
│   │   └── default.conf
│   └── php
│       └── Dockerfile
├── docker-compose.yml
└── src
    └── index.php

使い方

1.git clone https://github.com/yCroma/Laravel-env.git アプリ名
2..envファイルでアプリ名の設定とデータベースの設定を済ませる
(以降はアプリ名がtestの場合を想定して書く)
3.docker-compose up -d --buildでコンテナを作成する

Laravelの設定

# コンテナに入る
$ docker exec -it test-app bash

# アプリの作成(今回は`test`という名前で作成)
# composer create-project --prefer-dist laravel/laravel test "6.*"

# アプリのディレクトリに移動
# cd test

# 一応.envのコピーとアプリケーションキーの準備
# cp .env.example .env
# php artisan key:generate

# 権限の設定
# chmod 777 -R storage
# chmod 777 -R bootstrap/cache

# .envの設定
# vi .env
.env
DB_CONNECTION=mysql
DB_HOST=mysql         ← 修正
DB_PORT=3306
DB_DATABASE=homestead ← 修正
DB_USERNAME=homestead ← 修正
DB_PASSWORD=secret    ← 修正
# コンテナから出る
# exit

Nginxの設定

default.confのドキュメントルートを修正。アプリ名がtestの場合は以下のようになる。

server {
    listen 80;

    root  /var/www/html/test/public;     # 修正
    index index.php index.html index.htm;
    charset utf-8;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        root  /var/www/html/test/public; # 修正
        try_files $uri $uri/index.php;
    }
    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;
    }

}

docker-compose.ymlの設定

別に設定しなくてもいいですが、すると少し幸せになるのでやります。appの所の環境変数を変更して、入った時にすぐに作業ができるようにしておきましょう。

docker-compose.yml
app:

    working_dir: /var/www/html/test # アプリケーション名の追加

composeファイルを編集したので、コンテナの立て直しと再起動。

$ docker-compose up -d
$ docker-compose restart

最後にマイグレーションまでできたら完璧。

$ docker exec -it test-app bash

# コンテナ内
# php artisan migrate

高速化

アプリケーションのインストール、マイグレーションまで終わった後に重いと感じると思います。これはマウントの都合上仕方がないので、高速化の方法を示しておきます。手始めに、docker-compose.ymlのコメントアウトを外してください。

docker-compose.yml
      - vendor-volume:/var/www/html/${APP_NAME}/vendor
      - storage-volume:/var/www/html/${APP_NAME}/storage

volumes: 
  db-store:
  vendor-volume:
  storage-volume:

次に、この処理を適応するためにコンテナを立ち上げなおします。

$ docker-compose up -d

そうすると、vendorの保存先が変わります。フォルダを用意しなおしてあげましょう。

$ mkdir -p storage/framework/cache/data
$ mkdir -p storage/framework/sessions 
$ mkdir -p storage/framework/views  
$ chmod 777 -R storage 

# 上のコマンドを試しても動かなかったら
$ composer install
$ composer update

おまけ

DBへの接続法

GUIアプリが使えるなら

Name: docker-laravel(任意)
Host: 127.0.0.1
Port: 3306
User: homestead
Password: secret
Database: homestead

コンテナから入るなら。

$ docker exec -it test-mysql bash -c 'mysql -uroot -p${MYSQL_PASSWORD} ${MYSQL_DATABASE}'

完全な消し方。

$ docker-compose down --volumes --rmi all

注意点と大事なこと

(いずれ、DBはトップレベルボリュームに修正するのですが、伝えたいこと)
.envファイルをtestのままで作っている場合、データベースがトップレベルボリュームされることになる。その場合、保存先が気になったことはないだろうか?簡単に調べることができる。今回は、初期のままではtest-mysqlがコンテナ名となるため以下のコマンドで確認できる。

$ docker inspect test-mysql

"Mounts":[
  "Source": "/var/lib/docker/volumes/test_db-store/_data"
]

また、これはボリュームを削除する時に消えてしまう。それが嫌な場合は、ディレクトリにマウントすると良いだろう

おわりに

今度はNodeのコンテナも追加して、そこも分けれるようにしよう。

参考

cloneしたリポジトリを別リポジトリとしてリモートにpushする
ComposerでPlease provide a valid cache pathとなったときの対応方法

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2