【Docker】Apache+MySQL+Laravelの環境を作成するまでの奮闘記【Mac M1】

当方、windows版のxamppを利用してLaravelアプリの開発を行っている者です。

最近Mac book airを買いまして。WindowsとMacBookの両方で開発をするようになってから、Dockerを用いて環境の共有をしたいと思っていたのですが・・開発環境を作成するまでにだいぶ苦戦してしまいました。

環境構築が成功するまでにぶつかった壁などを書いていきます。

環境

・Mac book Air M1 MacOS Monterey 12.5

・Docker Version 4.15.0

M1MacとDockerでApache+Laravel+MySQL+phpMyadminの環境を作成してみた

Dockerで使用するファイルの全体構成はこんな感じです。

-root
    -config
         -mysql
             -Dockerfile
             -my.cnf
        -php
            -Dockerfile
             -php.ini
 -html
 -docker-compose.yml

./config

MySQLとApacheはそれぞれDockerfileに設定を記載しています。

そのDockerfileと、コピーする用の設定ファイルをそれぞれ格納しています。

./config/mysql

MySQLのコンテナ作成において注意しなければならないのが、M1やM2チップを搭載したMacBookでは、動かないイメージが多いということです。

DockerHubの「OS/ARCH」の欄に、「Arm64」と記載されているものを選ぶ必要があります。

MySQL公式のDockerHubでは、MySQL8.0以上のイメージのみがArm64対応です。

もしIntelCPU搭載のPCやWindowsで開発する場合は、FROMコマンドの「arm64v8/」を削除すればOKです。

今回はMySQL公式の最新イメージ(2022/12/31時点で8.0.31)を使用していきます。

FROM arm64v8/mysql

#confファイルをコンテナ内に配置
COPY my.cnf /etc/mysql/conf.d/

confファイルには最低限の文字セット設定のみを記載しています。ここは環境の必要に応じて追記してください。

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

[client]
default-character-set=utf8

./config/php

Apache+PHPのコンテナ作成では、

Dockerfileでは、Laravelに必要なモジュールを追加する命令を記載します。また、設定ファイルの配置や作業ディレクトリ(Laravelのファイル群が入るフォルダ)の指定を行います。

MySQLのDorkerfileと同様、IntelCPU搭載のPCやWindowsで開発する場合は、FROMコマンドの「arm64v8/」を削除します。

FROM arm64v8/php:8.1-apache

RUN apt-get update && apt-get install -y \
    git \
    g++ \
    libicu-dev \
    libpq-dev \
    libzip-dev \
    zip \
    zlib1g-dev \
    libonig-dev \
  && docker-php-ext-install pdo_mysql mysqli\
    intl \
    opcache \
    pdo 

#confファイルをコンテナ内に配置
COPY php.ini /usr/local/etc/php/

#コンテナ内の作業ディレクトリを指定
WORKDIR /var/www/html

configファイルの内容はこちらのページを参考にさせていただきました。

display_errors = On
display_startup_errors = On
max_execution_time = 30
session.gc_divisor = 1000
session.sid_bits_per_character = 5
output_buffering = 4096
memory_limit = 128M
upload_max_filesize = 64M
post_max_size = 64M
max_input_vars = 1000
log_errors = On
error_log = /dev/stderr
error_reporting = E_ALL
expose_php = On
zend.exception_ignore_args = Off

[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.language = Japanese

[mysqlnd]
mysqlnd.collect_memory_statistics = On

[assertion]
zend.assertions = 1

./html

空のフォルダです。こちらがLaravelプロジェクトのソースファイルが入り、結果的に作業フォルダとなります。

./docker-compose.yml

docker-composeには、複数のコンテナイメージを一括で起動するための設定を行います。

phpMyAdminでは、設定ファイルのコピーなども特に必要ないので、当ファイルの設定のみでイメージが作成されることになります。

version: '3.8'
services:
  apache:
    build: ./config/php
    container_name: apache
    ports:
      - "8010:80"
    volumes:
    # ./htmlディレクトリとコンテナのhtmlディレクトリを紐付け
      - ./html:/var/www/html
    depends_on:
      - mysql
  mysql:
    build: ./config/mysql
    container_name: mysql
    ports:
      - 3306:3306
    volumes:
    # ./dataディレクトリにDBのデータを保持
      - ./data:/var/lib/mysql
    environment:
      #ROOTユーザ情報
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: root
      # Database名称の指定
      MYSQL_DATABASE: mydb
      # 作業用MySQLユーザー名称の指定
      MYSQL_USER: user
      # 作業用MySQLユーザーパスワードの指定
      MYSQL_PASSWORD: password
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./phpmyadmin/sessions:/sessions

実際にコンテナを起動してみる

今回、GitHub経由で自分のLaravelのプロジェクトをクローンして環境を作っていくテイで説明していこうとおもいます。

まず、ターミナルでrootフォルダに、以下のコマンドを実行します。

docker-compose up -d

コンテナが立ち上がったら、GitHubからLaravelプロジェクトのソースファイルをクローンします。git cloneのコマンドに関する説明は今回は省略させていただきます。これが完了すると、htmlフォルダにLaravelのソースファイルが入ります。

docker container exec apache git clone  https://[アクセストークン]:x-oauth-basic@github.com/[ユーザ名]/[リポジトリ名].git .

Laravelプロジェクトで使用するコンポーネントの取得を行うために、composerのインストールを行います。上から順にコマンドを実行していきます。

docker container exec apache php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

docker container exec apache php composer-setup.php

docker container exec apache php composer.phar install

UnexpectedValueExceptionが発生した

これで完了かな、と思い、「localhost:8010/public」にアクセスしてLaravelのホームを開いてみたら以下のエラーが表示されました。

UnexpectedValueException
The stream or file “/var/www/html/storage/logs/laravel.log” could not be opened: failed to open stream: Permission denied

“/var/www/html/storage/logs/laravel.log”のアクセス権がないというエラーらしいので、www-dataにstrorage/以下のアクセス権を付与します。

www-dataに関してはこちらのページを参考にさせていただきました。

docker container exec apache chown www-data storage/ -R

Not Foundエラーが発生した

やっと完了かな、と思ったのですが、「localhost:8010/public」以外のルーティングが機能していないみたいで、以下のエラーが表示されました。

Not Found
The requested URL was not found on this server.

ルーティングに必須のApacheのmod_rewriteモジュールが機能していないようですので、以下のコマンドを順に実行。

docker container exec apache a2enmod rewrite
docker compose restart

無事にルーティングが機能するようになりました。

Laravelの.envの設定

あとはLaravelの.envのDB接続設定などを変更して、開発環境は完成です。

コンテナ同士の通信をするためには、設定方法が結構特殊なんです。docker-compose.ymlで指定したMySQLの[container_name]の値をDB_HOSTにそのまま指定する必要があります。

DB_CONNECTION=mysql
#Dockerのコンテナ名を使用
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=mydb
DB_USERNAME=root
DB_PASSWORD=root

以上です。最後までお読みいただきありがとうございました。

コメント

タイトルとURLをコピーしました