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

Docker上でLaravelを動かしてみよう(laradockなしで)

More than 1 year has passed since last update.

はじめに

Laradockを使わず、Laravelの開発環境をDocker上で構築していきます。
立ち上げるコンテナは、以下3つです。
1. nginx
2. PHP
3. MySQL

環境

  • Docker version 18.09.2, build 6247962
  • docker-compose version 1.23.2, build 1110ad01
  • ホストOS:Mac OS Mojave 10.14.6(18G84)

ディレクトリ構成

$ tree
.
├── docker
│   ├── nginx
│   │   └── default.conf
│   └── php
│       ├── Dockerfile
│       └── php.ini
├── docker-compose.yml
└── server

Docker-composeファイル編集

今回は、nginx、MySQL、PHPの3つのコンテナを立ち上げます。

docker-compose.yml

version: '3'

services: 
  php: #phpコンテナを定義します。
    container_name: php #コンテナの名前
    build: ./docker/php #Dockerイメージがあるディレクトリ
    volumes: 
    - ./server:/var/www #データ永続化領域の定義
                        #今回はホストのserverディレクトリを、コンテナ内/var/wwwディレクトリにマウント

  nginx:
    image: nginx #nginxの公式イメージを使用
    container_name: nginx
    ports: #ホスト:コンテナポート間のマッピング
    - 8000:80 
    volumes: 
    - ./server:/var/www
    - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on: # コンテナ起動順番の制御、phpコンテナのあとにnginxコンテナを起動
    - php

  db:
    image: mysql:5.7
    container_name: db
    environment: #DB環境定義
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: docker
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./docker/db/data:/var/lib/mysql
    - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./docker/db/sql:/docker-entrypoint-initdb.d #image起動時に実行するSQLやスクリプト
    ports:
    - 3306:3306

Dockerfile編集

まず、PHPコンテナ構築に必要なDockerfileを編集します。
Composerと、Laravelのインストールも済ませてしまいましょう。
Composerのインストールは、公式サイトを参考にしてください。

/docker/php/Dockerfile

FROM php:7.2-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
    && apt-get install -y zlib1g-dev default-mysql-client \
    && docker-php-ext-install zip pdo_mysql

#Compose install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin
RUN mv composer.phar /usr/local/bin/composer


WORKDIR /var/www

RUN composer global require "laravel/installer"

PHP設定ファイルの編集

/docker/php/php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

nginx設定ファイルの編集

Laravel用に、nginxのconfigを編集します。

/docker/nginx/default.conf
server {
  listen 80;
    index index.php index.html;
    root /var/www/public;

  location / {
    root /var/www/public;
    index  index.html index.php;
    }

  location ~ \.php$ {

    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
 }


Laravelプロジェクトの作成

下記の通り、docker-compose.ymlファイルがあるディレクトリで3つ全てのDockerコンテナを起動します。
その後、PHPコンテナへ入り、Laravelプロジェクトを作成します。

$ docker-compose up -d #バックグラウンドでDockerコンテナを起動

$ docker-compose exec php bash #phpコンテナに入る

$ laravel new #phpコンテナ内で実行、Laravelプロジェクトを作成する


動作確認

ブラウザから、http://127.0.0.1:8000
へアクセスすると以下のように画面が表示されるはずです!

https___qiita-image-store.s3.amazonaws.com_0_290840_2bce8e3d-ef19-27f4-692e-f777def7362d.jpeg

mysqlコンテナも確認しておきましょう。

$ docker-compose exec db bash

$ mysql -u docker -p # dbコンテナ内で実行、パスワードは"docker"

まとめ

DockerでLaravel環境を構築できましたね!

bluesDD
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