web開発

macにdockerでlaravelの環境構築をしてみた【やり方・つまづきやすいポイント】

こんにちは。もんしょー(@sima199407)です。

環境構築したい人
環境構築したい人
ローカル環境でサクッとlaravelを使ってみたい

そんな方に向けて今回書いていこうと思います。

laravelで開発するときに、FTPソフト経由でレンタルサーバーで開発したり、MAMPでの開発を行っていましたが、
「もっと軽く」「もっと自由に」ということでdockerを使ってlaravelを立ち上げてみました。
docker自体は多少触った経験はありますが、復習も兼ねて解説をしていきたいと思います。

dockerとは?

dockerとは?

仮想環境を立ち上げるために使うツール。
いろんな環境を並行で使えるので、企業でも使用していることが多いです。
環境を作って壊すことが容易なので、勉強用にはもってこい。

サクッと説明すると
「イメージ」と言われる設計図をもとに「コンテナ」という箱を作って、
そのコンテナ内に環境が作られている感じ。

by:cultivate

今回の流れ

[準備]dockerをインストールしよう

ここからdockerをインストールします。

インストールが終わったら、以下を叩き、

docker -v

バージョンが確認できたら次のステップに行きましょう。

shoheiMBP:jobvel_1 shohei$ docker -v
Docker version 18.09.1, build 4c52b90
shoheiMBP:jobvel_1 shohei$

こんな感じで確認できたらオッケーです。

githubからクローン

laradockなど有名なものもありますが、
今回はgithubで良さげのがあったので使っていこうと思います。

git clone https://github.com/takeru56/Laravel_Template.git 

 

クローンしたディレクトリに移動します

cd Laravel_template

 

一回、docker-compose.ymlの中身を見てみよう

version: '2' 

services:
  web: 
    build: ./docker-config/php
    volumes:
      - .:/var/www
    depends_on:
      - mysql

  nginx:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - .:/var/www
      - ./docker-config/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - web

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: development
      MYSQL_ROOT_USER: root 
      MYSQL_ROOT_PASSWORD: testdb 
      MYSQL_USER: test 
      MYSQL_PASSWORD: testdb
    volumes:
      - ./db-data:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=testdb
    links:
      - mysql
    ports:
      - 8080:80
    volumes:
      - /sessions

多分こんな感じでかいてあると思います。

nginxのポートを80以外にしたいと思ったら、

ports:
      - "81:80"

という感じでやると変更できます。
phpmyadminのところも同じ要領で変えることができます。

また、mysqlのデータは、後述する.envファイルと同じすることを忘れないでください。

dockerを立ち上げます

docker-compose up -d --build

phpのパッケージをインストール

docker-compose run web composer install

環境設定

.env.exampleファイルの「DB_DATABASE」「DB_USERNAME」「DB_PASSWORD」を変更します。

[before]
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
[after]
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=development
DB_USERNAME=root
DB_PASSWORD=testdb

.env.exampleを.envファイルにコピーする

cp .env.example .env

秘密鍵の設定

docker-compose run web php artisan key:generate

[おまけ]nodeのモジュールもインストール

docker-compose run web npm install

アクセスできるか確認します

localhost:[docker-compose.ymlで設定したポート番号(デフォルトは80)]

laravelのwelcomeページが出てくれば成功です。

phpmyadiminも確認してみましょう

localhost:[docker-compose.ymlで設定したポート番号(デフォルトは8080)]

どうでしょうか?
一度できるようになると簡単に環境構築ができます。

よくあるエラー

Q.migrateができない

こんな感じのエラーが出たときに使えると思います。

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known  

A.webのコンテナ内に入ってみる

外からマイグレーションしようとしても動かないときはコンテナにアクセスしましょう。

webのコンテナ名を確認する

docker ps
shoheiMBP:jobvel_1 shohei$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                            NAMES
308419dc6408        nginx                   "nginx -g 'daemon of…"   28 hours ago        Up 28 hours         0.0.0.0:81->80/tcp               jobvel_1_nginx_1
cb9ddababe87        jobvel_1_web            "docker-php-entrypoi…"   28 hours ago        Up 28 hours         9000/tcp                         jobvel_1_web_1
0f085d85f2cc        phpmyadmin/phpmyadmin   "/run.sh supervisord…"   28 hours ago        Up 28 hours         9000/tcp, 0.0.0.0:8081->80/tcp   jobvel_1_phpmyadmin_1
7b2e68120581        mysql:5.7               "docker-entrypoint.s…"   28 hours ago        Up 28 hours         3306/tcp, 33060/tcp              jobvel_1_mysql_1
shoheiMBP:jobvel_1 shohei$ 

コンテナ内に入る

docker exec -it [CONTAINER ID or IMAGE] bash
shoheiMBP:jobvel_1 shohei$ docker exec -i -t  jobvel_1_web_1 bash
root@cb9ddababe87:/var/www# 

この状態で以下を叩いてみる

php artisan migrate

Q.View [home] not found.というエラー

A.viewのキャッシュが残っている可能性が高いです。

localhostにアクセスしたときに出てくることがあります。

設定のキャッシュをクリアします

php artisan config:clear

参考:stack overflow

Q.dockerのコンテナがうまく立ち上がらない

A.docker-compose.ymlのファイルをもう一度確認してみましょう。

こちらのファイルはインデントで制御されています。
なので、文字列的には合っていても段落があっていないとエラーが出たりします。

[bad]  mysql:
    image: mysql:5.7
    environment:
     MYSQL_DATABASE: jobvel //←インデントがズレている
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: testdb
[OK]  mysql:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: jobvel //揃えることが大事
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: testdb

参考

https://github.com/takeru56/Laravel_Template

dockerのチートシート

よく使いそうなものだけまとめてみました。

イメージを作成

docker build

コンテナを作成

docker run

コンテナを起動

docker start [CONTAINER ID]

コンテナを停止

docker stop [CONTAINER ID]

コンテナを削除

docker rm [CONTAINER ID]

イメージを削除

docker rmi [IMAGE ID]

コンテナの確認

docker ps

コンテナの再起動

docker-compose restart

全てのコンテナを停止

docker stop $(docker ps -a -q)

全てのコンテナを削除

docker rm $(docker ps -a -q)