LoginSignup
0
2

More than 1 year has passed since last update.

ubuntuでLaravel8.xをDockerを使って構築

Last updated at Posted at 2021-12-08

初めに

Dockerを使ってLaravelを構築しようと思ったので、構築しました。

Dockerについて
DockerComposeについて

環境


今回構築に使用した環境
% lsb_release -a                                                                                                                                                                                                                
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.2 LTS
Release:    20.04
Codename:   focal

% docker -v                                                                                                                                                                                                                     
Docker version 20.10.11, build dea9396

% docker-compose -v                                                                                                                                                                                                             
Docker Compose version v2.2.1

構成

以下の構成を想定して作成します。

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

1 Docker Compose

Composeは主に、複数のコンテナを定義するためのファイルである。
Composeにおいてはymlファイルを使ってアプリケーションサービスの設定を行います。

version: '3'

volumes:
  vendor-store:
  node_modules-store:

services:
  php:
    container_name: php
    build: ./docker/php
    volumes:
    - ./web:/var/www
    - vendor-store:/var/www/laravel/vendor
    - node_modules-store:/var/www/laravel/node_modules
    environment:
      TZ: Asia/Tokyo

  nginx:
    image: nginx
    container_name: nginx
    ports:
    - 8085:80
    volumes:
    - ./web:/var/www
    - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
    - php

  db:
    image: mysql:8.0
    container_name: db
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
      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
    ports:
    - 4306:3306

Serviceとは

アプリケーションを動かすための要素のこと。

imageとは

Nginxとdb(mysql)についてはDockerHubに上がっている既存のDockerImagesを使っている。

buildとは

Dockerfile のあるディレクトリのパスを指定する。この値が相対パスで指定された場合は、yml ファイル自身がある場所からの相対パスになる。

volumesとは

パスを指定して、パスをボリュームとしてマウントする。

2 Dockerfile

FROM php:8.0-fpm

COPY php.ini /usr/local/etc/php/

RUN apt update
RUN apt install -y wget git unzip libpq-dev

# Install Node.js 14
RUN apt install -y npm \
  && npm install n -g \
  && n 14

# Install PHP Extensions
RUN apt install -y zlib1g-dev mariadb-client libzip-dev libonig-dev \
  && docker-php-ext-install zip pdo_mysql

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php \
  && mv composer.phar /usr/local/bin/composer \
  && composer self-update
WORKDIR /var/www

# php-fpmはデフォルトのユーザwww-dataで動く。https://stackoverflow.com/questions/48619445/permission-denied-error-using-laravel-docker
# 変更する場合は /usr/local/etc/php-fpm.d/www.conf でユーザー名を変える。
RUN chown -R www-data:www-data /var/www

RUN composer global require "laravel/installer"
FROM

新しい 構築ステージbuild stage を初期化し、以降の命令で使う ベース・イメージ を指定します

RUN には2つの形式がある
RUN <コマンド> ( シェル形式shell form 。コマンドはシェル内で実行される。デフォルトは Linux が /bin/sh -c で、 Windows は cmd /S /C )
RUN ["実行ファイル", "パラメータ1", "パラメータ2"] ( 実行形式exec form )

RUNコマンドは、FROMで記載したベースイメージに対して追加で行っていく処理を表す。

COPY

追加したいファイル、ディレクトリを <コピー元> で指定すると、これらをイメージのファイルシステム上のパス <コピー先> に追加される。
WORKDIR

Dockerfile 内で以降に続く RUN 、 CMD 、 ENTRYPOINT 、 COPY 、 ADD 命令の処理時に(コマンドを実行する場所として)使う 作業ディレクトリworking directory を指定する。

4 php.ini

(php.ini) は PHP の起動時に読み込まれる。

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

5 Nginx


server {
  listen 80;
  root /var/www/laravel/public;

  add_header X-Frame-Options "SAMEORIGIN";
  add_header X-XSS-Protection "1; mode=block";
  add_header X-Content-Type-Options "nosniff";

  index index.php;
  charset utf-8;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  location = /favicon.ico { access_log off; log_not_found off; }
  location = /robots.txt  { access_log off; log_not_found off; }

  error_page 404 /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;
  }
  location ~ /\.(?!well-known).* {
      deny all;
  }
 }

LaravelをNginxで動作させる設定。
ApacheではLaravel同梱の.htaccessが設定してくれるのだがNginxでは.htaccessに当たるものがないためNginxのconfを修正する必要となる。

0
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
0
2