2021/12/08
今回は Docker を使って Laravel + Apache + MySQL のローカル環境構築を行いたいと思います。
PHP:7.4
MySQL:5.7
事前知識
Dockerとは
・一台のマシン上に複数の隔離された環境を構築する軽量なコンテナ型の仮想化技術です。
・特定のプロセスの実行環境を Dockerイメージ という単位で管理できます。
プロセスとは
プロセスとは、処理のことです。情報処理においてはプログラムの動作中のインスタンスを意味します。
仮想化とは
ホストOSというのがパソコンに搭載されているOSです。Windows とか Mac です。
そこに VM Ware や Virtual Box といった仮想化ソフトウェアがあります。
その上にさらにOS(ゲストOS)が稼働します。
ゲストOSの上でプロセスが稼働します。
このプロセスは、例えばExcelが1つ起動すると、1つのプロセスが起動する、つまり1アプリケーション=1プロセスと考えます。
「ホストOS」→「仮想化ソフトウェア」→「ゲストOS」→「プロセス」
という構成になります。
コンテナとは
仮想化ソフトウェア+ゲストOSが不要になります。
コンテナ内のプロセスはホスト内のOSを使います。
「ホストOS」→「コンテナで区切られたプロセス」
という構成になります。
事前準備
Hyper-vの有効化(Windows Pro)
Dockerのインストール前に Hyper-v という仮想化機能を有効化する必用があります。
この機能は Windows Pro系にしか導入されていないみたいで、その他の場合は VirtualBox などほかの仮想化技術の導入をする必用があります。
Hyper-v の有効化については以前、記事をエントリーしていますので、よかったら参考にしてください。
フォルダ構成
ディレクトリ構成にルールはありませんが、今回は下記のようにわかりやすい形で構成します。
事前にディレクトリとファイル(※中身は空でOK)を作成しておきましょう。
各種ファイルを編集していくので、このフォルダ構成のルートディレクトリを丸ごと PhpStormなどで開いておくと楽です。
今回のゴール
とりあえず、Laravelのスタートページを表示させるところまで行きます。
DBの接続とNode.jsのインストール、Authの実装は次回やる予定です。
手順
1)Docker のインストール
Docker を使えるように Docker Desktop をインストールします。
基本的にはバイナリをダウンロードして、指示にしたがってインストールすれば使えるようになります。
ただ、Windowsの人は自分がそうだったようにいろいろ苦労するかもしれません。
Windows Pro版の方は以下をご参照ください。
Docker のインストール先URLは以下になります。
Docker Desktop for Windows インストール(Pro版)
Docker Desktop for Windoes インストール(Home版)
ターミナルで以下のコマンドを打ち込んで、コマンド一覧が表示されればインストールOKです。
$ docker
2)Dockerfile の作成
Dockerfile とは、Dockerコンテナを作るための構成が書かれているものになります。
コンテナに利用する イメージ情報 とそのイメージに追加する パッケージ や 構成変更を行うコマンド 等を記述することができます。
Dockerfile の中身を以下のように記述していきます。
# どんな docker イメージを利用して構築をするか
# FROM : ここではPHPの公式イメージである「php:7.4-apache」というあらかじめPHPとApacheがインストールされているイメージを、Docker Hubというサイトからダウンロードしてくるようになっている。
FROM php:7.4-apache
# 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる
# ADD:ローカルのファイルを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
# Laravelで必要になるmodRewriteを有効化する
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite
上から順番にコマンドが実行されていき、Dockerコンテナの元となるDockerイメージが作られます。
3)000-default.conf(バーチャルホスト)の作成
laraveltokyo というディレクトリは、作成予定のLaravelプロジェクト名です。
適宜、ご自身のプロジェクト名に置き換えてください。
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/laraveltokyo/public
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html/laraveltokyo/public>
AllowOverride All
</Directory>
</VirtualHost>
4)php.ini の作成
必用最低限にしています。
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
5)my.cnf の作成
[mysqld]
character-set-server=utf8
Windows に MySQL をインストールした直後は、文字コードが Shift-JIS になっていて UTF-8 に変えたいときに my.cnf を修正します。
6)Docker Compose の設定(docker-compose.yml)
Docker Compose を利用すると、複数のコンテナを管理し、イメージ作成からコンテナ起動までいっぺんに実行することができます。
その設計図のようなものが docker-compose.yml ファイルです。
Laravel が入る appコンテナ とMySQLが入る dbコンテナ をまとめて管理するために、Docker Compose の設定をしていきましょう。
ここでは 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
7)Docker Composeでコンテナを立ち上げる
Git bash を開いて先ほど作ったディレクトリのルートディレクトリに移動し、以下のコマンドを実行していきます。
# ホームディレクトリ直下にあるDockerPracticeディレクトリに移動
$ cd DockerPractice
# Dockerイメージを作成
$ docker-compose build
# Dockerを起動
# -d でバックグランド起動
$ docker-compose up -d
# 起動しているコンテナが表示される
$ docker ps
$ docker-compose up -d
ERROR: Cannot start service コンテナ名 : b'driver failed programming external connectivity on endpoint
【 解決方法 】
①タスクバーにあるクジラマーク(Docker)のアイコンをクリック
②Restartを押す
③クジラの背中に乗ってるコンテナが動かなくなるまで待つ
④もう一度 docker-comose up -d
$ docker-compose up -d
ERROR: for php-phalcon Conflict. The name "/hogehoge" is already in use by container …
【 解決方法 】
# コンテナを削除するか、リネームしろという意味
# コンテナが持っているデータが消えても良ければ、docker rm で削除
$ docker rm -f コンテナ名
8)Laravelのプロジェクトを作成
# appコンテナ(名称:laravel_app)に入ります
$ winpty docker-compose exec app bash
# Laravelプロジェクト作成
$ composer create-project --prefer-dist laravel/laravel laraveltokyo "6.18.*"
# Laravelプロジェクト移動
$ cd laraveltokyo
# ストレージの権限変更
$ chmod 777 -R storage/
$ php artisan key:generate
Docker for Windows + Git for Windows環境で、dockerコンテナに入るために、
docker execコマンド
を実行するとエラーになります。この場合、
winpty
を先頭につけるとエラーにならずにコンテナに入ることができます。
上記のコマンドを実行すると、ホスト側の srcディレクトリ直下にも laraveltokyo ディレクトリが同期されて存在します。
開発時にはこのソースをエディターで開き、直接編集することになります。
9)動作確認
ホスト側にポート80番でつないでいるので、ブラウザ等で
にアクセスすると、Laravel のスタート画面が表示されます。
# コンテナの停止
$ docker-compose stop
# 開発環境を一旦クリーンにして、ゼロから作り直したい
$ docker-compose down
以上です。
Udemyを使ったLaravel学習方法
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。