当方、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
以上です。最後までお読みいただきありがとうございました。
コメント