Dockerに入門してみました。
Dockerを活かそう!というわけでPHPにも入門しました。
せっかくなので新しい感じのするLaravelを触ってみようというわけでMac + Docker + Laravelという環境でやってみました。
以下、その記録です。
##Dockerの準備
DockerでLAMP環境を作るには以下の記事を参考にしました。
Docker Hubのオフィシャルイメージを使ったLAMP環境(Apache+PHP+MySQL)構築
Docker Composeを使ってLAMP環境を立ち上げる
docker-composeを使うと複数コンテナの管理が便利に
今回の例では上記の参考記事(上2つ)で作成したDockerfileやdocker-compose.ymlがある前提で進めます。
##Laravelの準備
composerが必要なのであらかじめインストールしておきます。
composer global require "laravel/installer=~1.1"
これでインストール完了です。
最初のプロジェクトを作成します。
composer create-project laravel/laravel MyFirstLaravel
"Application key [(ランダムな英数列)] set successfully."と表示されたら成功です。
ここで表示されているApplication keyは暗号化の際に使用されるランダムな英数列です。
MyFirstLaravelディレクトリが出来ているの移動して「.env」ファイルを開いてみます。
APP_ENV=local
APP_DEBUG=true
APP_KEY=(ランダムな英数列)
DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
〜略〜
ここのAPP_KEYに先ほど出力されたApplication keyの値が設定されているのが分かります。
DB系の設定はDockerの環境に合わせて編集します。
DB_HOST=l72.XX.X.XXX
DB_DATABASE=testdb
DB_USERNAME=root
DB_PASSWORD=pass
DB_HOSTはDocker上で動いているmysqlコンテナのホストを指定します。
DB_DATABASEにはデータベース名を指定します。
あらかじめmysqlに作成しておきましょう。
ユーザー名とパスワードも設定に合わせて指定します。
##Laravel+Dockerの準備
Lalavelをdockerで動かすためにもう少しdocker-compose.ymlの編集が必要です。
最終的な記述は以下の通りです。
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: testdb
MYSQL_USER: test
MYSQL_PASSWORD: testtest
volumes:
- ./my.cnf:/etc/mysql/conf.d/my.cnf
- /var/lib/mysql
container_name: mysql
php:
build: php
ports:
- "80:80"
volumes:
- ./MyFirstLaravel:/var/www/html
- ./apache2.conf:/etc/apache2/apache2.conf
links:
- mysql:mysql
container_name: php
mysqlでデータベース「testdb」を作成し、testユーザーを追加しています。
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: testdb
MYSQL_USER: test
MYSQL_PASSWORD: testtest
php側のvolumesでapache2.confを上書きしています。
volumes:
- ./www:/var/www/html
- ./apache2.conf:/etc/apache2/apache2.conf
Laravelのプロジェクト全体がコンテナから見えるようにMyFirstLaravelを/var/wwww/htmlにマッピングしていますが、Laravelはさらにその下のpublicディレクトリがドキュメントルートであることを想定して動作します。
Laravel側で変更する方法があるんだろうとは思いますが、ここではコンテナ側のapache2.confを上書きしてドキュメントルートを/var/www/html/publicに変更しています。
(省略)
DocumentRoot /var/www/html/public
(省略)
他の部分はコンテナに入っているapache2.confそのままから変更ありません。
phpコンテナはphpディレクトリにDockerfileを用意してビルドしています。
FROM php:5.6-apache
RUN apt-get update \
&& apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libmcrypt-dev \
&& docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt \
次にMyFirstLaravel直下のstorageディレクトリのパーミッションを変更してコンテナのapacheから書き込めるようにしておきます。
サブディレクトリも全て変更しておきます。
これをしておかないと500 Internal ServerErrorが返ってきてハマります。
これでようやくコンテナを起動できます。
docker-compose.ymlのあるディレクトリに移動して以下のコマンドを実行します。
docker-compose up -d
phpコンテナとmysqlコンテナが起動していることを「doker ps」で確認しましょう。
Laravelは最初にmigrateする必要があるので以下のようにして実行します。
docker exec -it php php artisan migrate
Dockerfileかdocker-compose.ymlで自動実行してくれる方法がありそうなんですが、わからず。。
とりあえず1コマンドだけ手動でながしこんでいます。