仕事

【Docker & Laravel】DockerでLaravelローカル環境構築する方法

2022年10月20日

昔はXAMPPを使ってローカル環境構築をしてたけど、今じゃDocker使うのが当たり前。正直まだまだ俺のDockerの理解は浅いんだけど、どうしてもこのクジラをペットにしたいので勉強してみる。

とういうことで今回は最初のステップとして、Laravel + Apache + MySQL + phpMyAdmin のローカル環境構築をDockerを使用してする方法を解説する。

どうも、スニーキーボットです。

ゴール

Dockerを使ってLaravelの開発環境を構築する。会社では、リーダーでない限りGitHubやBacklogからリポジトリをローカルにcloneするところから始めることが多い。しかし今回はDockerfileやYMLを作成するところからスタート。

手順は下記。

  1. ディレクトリとファイルを作成(まだ中身は空でOK)
  2. Dockerfileの作成
  3. 000-default.conf(バーチャルホスト)の作成
  4. php.ini の作成
  5. my.cnf の作成
  6. docker-compose.ymlの作成
  7. コマンドでImage作成してコンテナ起動
  8. Laravelプロジェクトの作成
  9. 動作確認

ディレクトリとファイルを作成(まだ中身は空でOK)


フォルダ構成はこんな感じでOK。php.iniはPHP設定用のファイルで000-default.confはApacheの設定ファイル。 dbフォルダのdataフォルダ内にはMySQLのデータを保存して、my.cnfはMySQLの設定ファイル。 srcフォルダにはLaravelのソースを格納するフォルダになる。

Dockerfileの作成

# どんな docker イメージを利用して構築をするかを指定
# FROM : 今回はPHPの公式イメージの「php:7.4-apache」というイメージを指定
# このイメージはPHPとApacheが両方パックでインストールされているイメージで、Docker Hubというサイトからダウンロードされる。
FROM php:7.4-apache

# 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる
# ADD:ローカルのファイルをDockerコンテナ内にコピーする
# 左側の「php.ini」はローカルで右側の「/usr/local/etc/php/」はDockerコンテナ内
ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

# Composerのインストール
# RUN:コンテナ内でコマンド実行
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

# ミドルウェアのインストール
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \
libpng-dev \
libpq-dev \
&& docker-php-ext-install pdo_mysql

RUN pecl install xdebug-2.9.1 && docker-php-ext-enable xdebug

# Laravelで必要になるmodRewriteの有効化
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite

Dockerfile とは、Dockerイメージを作成するための設定値が記述されるファイルで、このファイルをビルドすることでDockerイメージが作成される。コンテナを作成するときに利用するイメージ情報を主に記述。

000-default.conf(バーチャルホスト)の作成

<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html/practicedocker/public
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       <Directory /var/www/html/practicedocker/public>
           AllowOverride All
       </Directory>
</VirtualHost>

「practicedocker」というフォルダは、あとで作成するLaravelプロジェクト名。

php.ini の作成

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

xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host=host.docker.internal
xdebug.remote_port=9003
xdebug.remote_log=/tmp/xdebug.log

my.cnf の作成

[mysqld]
character-set-server=utf8

my.cnf とは Linux の設定ファイル。 MySQLの文字コードがをShift-JIS から UTF-8 に変えるために my.cnf を修正。

docker-compose.ymlファイルの作成

# Compose fileのバージョン指定
version: '3'

# どんなコンテナを立ち上げるか
services:

# ---laravelを動かすコンテナ --------------------------------------
  app:
    # どのポートを開いて繋ぐか。下記はコンテナの80番ポートを開いて、ホストの80番につなぐ
    ports:
      - "80:80"
    # 先ほど作ったDockerfileを使って、コンテナをビルドするという指定
    build: ./docker/app
    # コンテナの名前を指定
    container_name: laravel_app
    # ローカルのディレクトリとコンテナ上のディレクトリのリンクを設定
    # ./src は docker-composer.yml のディレクトリ直下にある src を設定している
    # コンテナが作成されると src ディレクトリからコンテナの /var/www/html にアクセスすることができる
    volumes:
      - ./src:/var/www/html

# ---MySQLを動かすコンテナ----------------------------------------
  db:
    # Docker HubからMySQL5.7の公式イメージをダウンロードしてくる指定
    image: mysql:5.7
    container_name: laravel_db

    # コンテナ内の環境変数を指定。環境変数を渡すとビルド時に設定してくれるDockerイメージがあるので、利用の際はDocker Hubのサイトで確認する
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: laravel_db
      MYSQL_USER: laravel_user
      MYSQL_PASSWORD: laravel_pass
      TZ: 'Asia/Tokyo'

    # 起動時のコマンド
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    # ディレクトリ同期。設定ファイルとMySQLのデータが保存される場所を同期している。コンテナは基本的に起動時に変更されてもコンテナ自体が止まるとデータが消えてしまうため、保存しておきたいものはホストマシンと同期しておく必要がある。
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    ports:
      - 3306:3306

  # phpMyAdminを動かすコンテナ
  phpmyadmin:
    image: phpmyadmin/phpmyadmin:5

    environment:
      PMA_HOST: 'db'
      PMA_USER: 'laravel_user'
      PMA_PASSWORD: 'laravel_pass'

    # コンテナの名前
    container_name: phpmyadmin

    # コンテナと他のサービスを繋げる
    links: 
      - db
    
    # localhost:8080 で phpmyadmin の管理画面にアクセス
    ports:
      - 8080:80
    
    # セッション情報をボリュームに設定して永続化
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions
例えば↓こんな感じにプロジェクト合うように↑を修正。

launch.jsonにデバッグの設定

VSCODE側の設定としてlaunch.jsonを以下のように設定

"configurations": [
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003, // //php.iniで設定したxdebug用のport番号
            "pathMappings": {
                "/var/www/html": "${workspaceRoot}/src" // {docker上のdocument root}:{ローカルのdocument root}
            }
        },

コマンドでImage作成してコンテナ起動

# プロジェクトディレクトリに移動
$ cd PracticeDocker

# Dockerイメージを作成(直下にdocker-compose.ymlがあること)
$ docker-compose build

# Dockerを起動
# -d オプションでバックグランド起動
$ docker-compose up -d

# 起動しているコンテナが表示される
$ docker ps

Laravelプロジェクトの作成

# appコンテナ(名称:laravel_app)に入る
$ winpty docker-compose exec app bash
# 以下でもdockerコンテナに入れる
$./container.sh

# Laravelプロジェクト作成
$ composer create-project --prefer-dist laravel/laravel practicedocker "6.18.*"

# Laravelプロジェクト移動
$ cd practicedocker

# ストレージの権限変更
$ chmod 777 -R storage/

# composerをインストール
$ composer install

ホスト側のsrcディレクトリ直下にもpracticedockerディレクトリが同期される。

動作確認

http://localhost

http://localhost:8080

上記にアクセスして、Laravel のスタート画面とphpMyAdminの管理画面が表示されてれば成功。

.gitignoreファイル追加


db配下のファイルはpushしたくないので、git管理下に置かない。

shell

container connect

# shell起動
$ ./container.sh
root@390cfc38dae:var/www/html# [コマンド]

DB connect

# shell起動
$ ./db-connect.sh
mysql> [コマンド]

次にデータベースに接続できるように設定をする必要がある。以下を参照すればOK!
Docker上のMySQLのDBコンテナにLaravelコンテナ、phpMyAdminコンテナとロカールPCのDBeaverから接続する

参照したサイト

下記のサイトがマジ超分かりやすい。当記事の内容は下記のサイトを参照してます。 ⇒https://laraweb.net/environment/8652/

-仕事