Help us understand the problem. What is going on with this article?

docker-composeでLaravelローカル環境を構築(Laradockは使わない)

More than 1 year has passed since last update.

初学者向けのものです。初学者がわからなくなるコマンド叩いていたらローカル側なのかコンテナ側なのかわからなくなってグチャグチャにならないように、ローカル側でのみコマンド実行すれば良いように構築しています。

前提

  • 本番環境向けの最適化された設定ではないので、Dockerイメージをそのまま本番利用はしないように注意ください
  • Macユーザ向けです
  • 以下、インストール済みであること
  • nginx,php-fpm,composer,mysqlの環境を作ります

インストール

ホームディレクトリに移動して、プロジェクトフォルダを作成

projectsフォルダが無いことを確認してください
HogeAppは自由に変更して大丈夫です

$ cd ~
$ mkdir -p projects/HogeApp/{docker,src}

こんなフォルダができる

projects
└── HogeApp
    ├── docker
    └── src

docker用ディレクトリを作成

$ cd ~/projects/HogeApp/docker
$ mkdir -p {nginx/conf.d,php-fpm,mysql-data}

Nginxの設定

Dockerfile(Nginx)

$ vim nginx/Dockerfile

以下を保存

nginx/Dockerfile
nginx/Dockerfile
FROM nginx:1.15.9-alpine

EXPOSE 80
RUN apk update && apk upgrade \
    && rm -r /var/cache/apk/*

COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./conf.d/default.conf /etc/nginx/conf.d/default.conf
COPY ./conf.d/php-upstream.conf /etc/nginx/conf.d/php-upstream.conf

nginx.conf

$ vim nginx/nginx.conf

以下を保存

nginx/nginx.conf
nginx/nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format json_combined escape=json '{ "time_local": "$time_local", '
     '"remote_addr": "$remote_addr", '
     '"remote_user": "$remote_user", '
     '"request": "$request", '
     '"status": "$status", '
     '"body_bytes_sent": "$body_bytes_sent", '
     '"request_time": "$request_time", '
     '"http_referrer": "$http_referer", '
     '"http_user_agent": "$http_user_agent" }';

    access_log  /var/log/nginx/access.log json_combined;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;
    server_tokens off;

    server_names_hash_max_size 512;

    include /etc/nginx/conf.d/*.conf;
}

default.conf

$ vim nginx/conf.d/default.conf

以下を保存

nginx/conf.d/default.conf
nginx/conf.d/default.conf
server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /var/www/public;
    index index.php index.html index.htm;
    charset utf-8;

    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar|svg|mp3)$ {
        try_files $uri =404;
    }

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_pass php-upstream;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HOME /var/www;
        include fastcgi_params;
    }
}

php-upstream.conf

$ vim nginx/conf.d/php-upstream.conf

以下を保存

nginx/conf.d/php-upstream.conf
nginx/conf.d/php-upstream.conf
upstream php-upstream {
  server php-fpm:9000;
}

PHP-FPMの設定

Dockerfile(php-fpm)

$ vim php-fpm/Dockerfile

以下を保存

php-fpm/Dockerfile
php-fpm/Dockerfile
FROM php:7.3-fpm-alpine

# Install PHP extensions
RUN apk update && apk upgrade --update && apk --no-cache add \
    git \
    vim less \
    icu-dev \
    autoconf \
    make \
    g++ \
    gcc \
    mysql-client \
    && rm -r /var/cache/apk/*

RUN docker-php-ext-install -j$(nproc) \
    iconv \
    intl \
    mbstring \
    pdo_mysql

COPY  ./php.ini /usr/local/etc/php/conf.d/my-php.ini
COPY  ./php-fpm.conf /usr/local/etc/php-fpm.d/my-php-fpm.conf

php.ini

$ vim php-fpm/php.ini

以下を保存

php-fpm/php.ini
php-fpm/php.ini
; timezone
date.timezone = Asia/Tokyo

; error reporing
log_errors = On
error_log = /dev/stderr
display_errors = Off

; mbstring
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

php-fpm.conf

$ vim php-fpm/php-fpm.conf

以下を保存

php-fpm/php-fpm.conf
php-fpm/php-fpm.conf
[www]
pm.status_path = /phpfpm_status

docker-composeの設定

$ cd ~/projects/HogeApp
$ vim docker-compose.yml

以下を保存

docker-compose.yml
docker-compose.yml
version: "3"

services:
  nginx:
    build: ./docker/nginx
    container_name: "nginx"
    ports:
      - "8080:80"
    restart: always
    volumes:
      - ./src:/var/www
    depends_on:
      - php-fpm
  php-fpm:
    build: ./docker/php-fpm
    container_name: "php-fpm"
    restart: always
    volumes:
      - ./src:/var/www
    working_dir: /var/www
    links:
      - mysql
    depends_on:
      - mysql
  composer:
    image: composer:1.8
    container_name: "composer"
    volumes:
      - ./src:/var/www
    working_dir: /var/www
  mysql:
    image: mysql:5.7
    container_name: "mysql"
    ports:
      - 33306:3306
    restart: always
    volumes:
      - ./docker/mysql-data:/var/lib/mysql
    environment:
      MYSQL_DATABASE: hoge-db
      MYSQL_USER: hoge-user
      MYSQL_PASSWORD: hoge-password
      MYSQL_ROOT_PASSWORD: root
      TZ: "Asia/Tokyo"
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

以下の環境変数部分はアプリに合わせて変更してください

environment:
MYSQL_DATABASE: hoge-db
MYSQL_USER: hoge-user
MYSQL_PASSWORD: hoge-password
MYSQL_ROOT_PASSWORD: root

ここまでの作成ファイルたちとフォルダ構成

projects
└── HogeApp
    ├── docker
    │   ├── mysql-data
    │   ├── nginx
    │   │   ├── Dockerfile
    │   │   ├── conf.d
    │   │   │   ├── default.conf
    │   │   │   └── php-upstream.conf
    │   │   └── nginx.conf
    │   └── php-fpm
    │       ├── Dockerfile
    │       ├── php-fpm.conf
    │       └── php.ini
    ├── docker-compose.yml
    └── src

コンテナ起動

$ cd ~/projects/HogeApp
$ docker-compose up -d

ズラズラっとコマンドが流れて最後にこれが出ればOK

Creating composer ... done
Creating mysql ... done
Creating php-fpm ... done
Creating nginx ... done

念の為、起動確認

$ docker-compose ps

  Name                Command               State                  Ports
---------------------------------------------------------------------------------------
composer   /bin/sh /docker-entrypoint ...   Exit 0
mysql      docker-entrypoint.sh mysql ...   Up       0.0.0.0:33306->3306/tcp, 33060/tcp
nginx      nginx -g daemon off;             Up       0.0.0.0:8080->80/tcp
php-fpm    docker-php-entrypoint php-fpm    Up       9000/tcp

この時点では、http://localhost:8080/にアクセスしても
File not found.となっているはず。

Laravelインストール

$ cd ~/projects/HogeApp
$ docker-compose run composer global require laravel/installer
$ docker-compose run composer create-project --prefer-dist laravel/laravel .

まぁまぁ時間かかるので、待ちます・・・
おわったら、srcフォルダにlaravelのファイル郡ができています。

もし以下エラーが出たら、別のネットワーク(テザリングとか、会社とかスタバとか)で試してください。

※この記事を見てもらう想定の「某学校」の人たちは絶対エラーなります。

[Composer\Downloader\TransportException]                                                                                 
  The "https://repo.packagist.org/packages.json" file could not be downloaded: failed to open stream: Network unreachable

ディレクトリのパーミッション変更

$ chmod -R a+w src/storage/*

確認

http://localhost:8080/にアクセスすると
image.png

Laravelの設定

.envファイルをいじって、設定していきます。

$ vim src/.env

src/.env
- APP_NAME=Laravel
+ APP_NAME=ご自身のアプリの名称に変更

- APP_URL=http://localhost
+ APP_URL=http://localhost:8080

- DB_HOST=127.0.0.1
+ DB_HOST=mysql

- DB_DATABASE=homestead
- DB_USERNAME=homestead
- DB_PASSWORD=secret
+ DB_DATABASE=hoge-db               # ← docker-compose.ymlのenvironmentで設定したやつ
+ DB_USERNAME=hoge-user
+ DB_PASSWORD=hoge-password

最終的なフォルダ構成

projects
└── HogeApp
    ├── docker
    │   ├── mysql-data
    │   ├── nginx
    │   │   ├── Dockerfile
    │   │   ├── conf.d
    │   │   │   ├── default.conf
    │   │   │   └── php-upstream.conf
    │   │   └── nginx.conf
    │   └── php-fpm
    │       ├── Dockerfile
    │       ├── php-fpm.conf
    │       └── php.ini
    ├── docker-compose.yml
    └── src
        ├── app
        ├── ~省略~
        └── vendor

あとはローカルのsrcフォルダ配下のLaravelを触っていけば基本的にOKです!

開発時の注意点

コマンドはdocker-compose.ymlファイルがあるフォルダで実行してください

composerの実行

docker-compose runをコマンドの頭につけてください

$ docker-compose run composer dump-autoload

artisanの実行

docker-compose exec php-fpmをコマンドの頭につけてください

$ docker-compose exec php-fpm php artisan route:list

コンテナの起動/終了

起動
$ docker-compose up -d
終了
$ docker-compose down

コンテナにログインしたいとき

$ docker-compose exec php-fpm /bin/ash

最後に

ご自身のアプリに合わせて必要応じてRedisやphpmyadminなどをdockerイメージで追加して、拡張していってください。

garcons
サーバサイドエンジニアです。laravelにはまってます。 フロントエンドも勉強中。 PHP(Laravel),.NET,Elixir,Java,DDD,TDD,docker,k8s,GCP,AWS,CI/CD
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした