DockerでLaravel+Apache+MySQLの開発環境を構築する
概要
こんにちは、システムグループのさんぞうです。
昨今、Dockerという単語はよく聞くと思いますし、活用している人もたくさんいると思います。
ただVirtualBox、Vagrantなどを使っていていざDockerに開発環境を移行してみようとしてもなかなか最初は難しいこともあり、自分も理解するまで大変でした。(まだまだ自分も理解が足りていません!)
そこで、今回は弊社でよく使われている開発環境の構築を通して、Dockerへの理解を深めようという記事です。
もし間違っているところがあればツッコんでいただけると幸いです!
Dockerについて
Dockerはコンテナ型の仮想環境を作れるプラットフォームです。
Vagrantで開発環境の構築をすると、OSのイメージを持ってきて、ミドルウェアを入れてといった作業があって大変だったりします。
また、イメージをもらっても、VirtualBoxのバージョンが違くて動かないといったことが多々ありました。
ですが、Dockerなら構築ファイルで管理できますし、イメージを配布してもDockerプラットフォーム内で完結するものなので、Windows、Mac、Linux関係なく動きます。
Dockerのインストール
Dockerを簡単に使えるようDocker Desktopをインストールします。
基本的にはバイナリをダウンロードして、指示にしたがってインストールすれば使えるようになります。
Docker Desktop for Windows インストール(Pro版)
Docker Desktop for Windows インストール(Home版)
インストール後、ターミナル 、コマンドプロンプト等で
docker
と打ち込んで、コマンド一覧が表示されればインストールできています。
フォルダー構成
実際にDockerでLaravel、MySQLを動かす環境を作っていきます。
.
├── docker/
│ ├── app/
│ │ ├ Dockerfile
│ │ ├ php.ini # PHP設定用のファイル
│ │ └ 000-default.conf # Apacheの設定ファイル
│ └── db/
│ ├ data/ # MySQLのデータを保存しておくディレクトリ
│ └ my.cnf # MySQLの設定ファイル
│
├── src/ # Laravelのソースを格納するディレクトリ
└── docker-compose.yml
ディレクトリ構成にルールはありませんが、上記のようにわかりやすい形で構成してみました。
各種ファイルを編集していくので、このフォルダ構成のルートディレクトリを丸ごとVS CodeやPhpStormなどで開いておくと楽です。
Laravelを動かすためのappコンテナの準備
まずdockerディレクトリ内のappディレクトリにある、Dockerfileを編集します。
Dockerfileとは、Dockerコンテナを作るための構成が書かれているものになります。
Vagrantを使ったことがある人は、Vagrantfileのようなものととらえるといいかもしれません。
# どんなdockerイメージを利用して構築をするか
FROM php:7.4-apache
# 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる
ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/
# Composerのインストール
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
# Laravelで必要になるmodRewriteを有効化する
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite
上から順番にコマンドが実行されていき、Dockerコンテナの元となるDockerイメージが作られます。
いろいろなコマンドがありますが、ここで使っているのは、FROM、ADD、RUNのみです。
・ FROM・・・ベースのDockerイメージを指定。ここではPHPの公式イメージである「php:7.4-apache」というあらかじめPHPとApacheがインストールされているイメージを、Docker Hubというサイトからダウンロードしてくるようになっている。
・ADD・・・ローカルのファイルをDockerコンテナ内にコピーする。
・RUN・・・コンテナ内でコマンドを実行する。
※ Docker Hubとは、Dockerコンテナイメージをユーザーが自由にアップロードして公開、共有できるサービスです。
PHPやWordPressなど、公式が公開しているイメージも多くあります。DockerイメージをFROMで持ってくるとき、Docker Hubに公開されているものであれば、上記のようにURLなどを指定しなくても自動で取ってきてくれます。
次に、上記で編集したDockerfileと同じ場所にある000-default.confファイルを編集します。
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/laravelapp/public
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html/laravelapp/public>
AllowOverride All
</Directory>
</VirtualHost>
特別なことはなく、VirtualBox等で環境構築をするときもこういったVirtualHostのファイルを作成すると思います。
laravelappというディレクトリは、作成予定のLaravelプロジェクト名です。
次にこちらも同じ場所にあるphp.iniファイルを編集します。
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
必要最低限にしています。こちらもVirtualHostなどで環境構築するときも中で直接編集したりするものと同様のものです。
MySQLを動かすためのdbコンテナの準備
dockerディレクトリ内のdbディレクトリにある、my.cnfファイルを編集します。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4
こちらもMySQLの構築をしている人にはおなじみだと思います。
ここでMySQLのコンテナにはDockerfileを書かなくていいのかという疑問が出てくる人がいるかもしれません。
もちろん書いてもいいのですが、次にDockerコンテナを複数立てて管理を楽にするためのDocker Composeというツールを利用するための設定ファイルを書くので、そちらで定義をします。(Docer Desktopを入れると入っています)
MySQLに関しても初期データを自動で投入したりなど、より細かい設定をしたい場合は、先ほど編集したappコンテナのようにDockerfileを別途書いておく必要があります。
コンテナを複数管理するために、Docker Composeの設定をする
次にLaravelが入るappコンテナとMySQLが入るdbコンテナをまとめて管理するために、Docker Composeの設定をします。ルートディレクトリ直下にある、docker-compose.ymlファイルを編集します。
# Compose fileのバージョン指定
version: '3'
# どんなコンテナを立ち上げるか
services:
# laravelを動かすコンテナ
app:
# どのポートを開いて繋ぐか。下記はコンテナの80番ポートを開いて、ホストの8000番につなぐ
ports:
- "8000:80"
# 先ほど作ったDockerfileを使って、コンテナをビルドするという指定
build: ./docker/app
# コンテナの名前を指定
container_name: laravel_app
# コンテナとホスト側のディレクトリを同期する場所の指定。laravelのソースが入る予定の場所
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=utf8mb4 --collation-server=utf8mb4_unicode_ci
# ディレクトリ同期。設定ファイルとMySQLのデータが保存される場所を同期している。コンテナは基本的に起動時に変更されてもコンテナ自体が止まるとデータが消えてしまうため、保存しておきたいものはホストマシンと同期しておく必要がある。
volumes:
- ./docker/db/data:/var/lib/mysql
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
ports:
- 3306:3306
各項目の説明はコメントを入れました。このファイルを使ってコンテナを立ち上げます。
Docker Composeでコンテナを立ち上げる
ターミナル 、またはコマンドプロンプトで先ほど作ったディレクトリのルートディレクトリに移動し、以下のコマンドを実行します。
docker-compose build
無事成功するとDockerイメージが作成されるので、次のコマンドで起動します。
docker-compose up
ログがたくさん出力されて起動できたことが確認できると思います。
もしバックグラウンド起動をしたい場合は、
docker-compose up -d
-d オプションをつけて起動します。
また、もう1つターミナルかコマンドプロンプトを起動して、以下のコマンドを実行します。
docker ps
すると起動しているコンテナが表示され、情報も一緒に表示されます。
コンテナを終了させる場合は、以下のコマンドになります。このコマンドもupコマンドと同じように、docker-compose.ymlファイルがあるルートディレクトリで行います。
docker-compose down
Laravelのプロジェクトを作成する
次にLaravelのプロジェクトをコンテナ内に入って作成をします。
コンテナには実際にVirtualBoxの仮想サーバーのように入って各種コマンドを実行することもできます。
docker exec -it laravel_app bash
execがコンテナ内でコマンドを実行するためのコマンドで、次にオプション、コンテナ名、実行したいコマンドになります。
オプションの -i は、標準出力を出し続けます。 -t は擬似ttyを割り当てるオプションになります。
この2つを実行することでコンテナのshellに入れます。
shellに入ったら、以下を実行します。
composer create-project "laravel/laravel=~6.0" --prefer-dist laravelapp
LTSバージョンである6を入れています。
プロジェクト作成が完了すると、ホスト側のsrcディレクトリ直下にも、laravelappディレクトリが同期されて存在しているはずです。
開発時にはこのソースをエディターで開き、直接編集すればすぐにアプリが実際に動いているコンテナ側にも同期されるので、開発がとても楽にできます。
また、ホスト側にポート8000番でつないでいるので、ブラウザ等で
にアクセスすると、Laravelのwelcomeページが表示されます。
データベースと連携する
Docker Composeで起動したコンテナ同士は、コンテナ名=ホスト名として認識できます。
laravel_appコンテナから、laravel_dbコンテナに接続するには、laravel_dbというホスト名の3306ポートにアクセスすれば、MySQLにアクセスできます。
また、MySQLのDB名やユーザー名、パスワード等は、docker-compose.ymlファイルに設定しました。
そのため、srcフォルダ下に作られたlaravelappフォルダ内にある.envファイルのDB接続箇所を以下のように変更します。
DB_CONNECTION=mysql
DB_HOST=laravel_db
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=laravel_pass
データベースに接続確認
LaravelがDBに接続できているか確認するために、コンテナに入ってmigrateを実行してみます。
デフォルトでユーザーテーブル等が作られるので、接続テスト用に試してみます。
コンテナに入り、Laravelのルートディレクトリに移動します。
docker exec -it laravel_app bash
cd laravel_app
migrateコマンドを実行します。
php artisan migrate
DBとの接続がされていれば、migrateが成功するはずです。
migrateを初期化する場合は、
php artisan migrate:refresh
これで元に戻ります。
あとはバリバリ開発を進めていくだけです!
まとめ
以上で駆け足でしたが、
・Dockerコンテナの作成
・Docker Composeでのコンテナ起動
・Laravelのプロジェクト作成
・LaravelのMySQLへの接続
までを紹介させてもらいました。
よかったら是非試してみてください!