Docker で Laravel5 のWelcome画面を表示するところまでを書いていこうと思います。
今回は CoreOS のオフィシャルイメージをもとにして、あれやこれやと自分で Dockerfile を書いてコンテナ立てていきます。
・・・が、自分は Docker 歴1週間ちょっとのひよっこなので間違ってたりするかもしれませぬ。
そんなときは容赦なく突っ込んでいただけると助かります。
用意するもの
- docker engine
- これがなくちゃ始まらないです
- docker-compose
- 複数コンテナの管理をいい感じにやってくれます
- DockerHub アカウント
- AutomatedBuilds を使ってDockerfileからイメージをビルドします
- GitHub or Bitbucket アカウント
- DockerHub の AutomatedBuilds は GitHub や Bitbucket への push をフックしてイメージをビルドしてくれます
今回の環境
今回は Vagrant で CoreOS の VM をたて、Docker ホストとして利用します。
{VM_HOST} - {CoreOS} - {Docker Container}
という感じですね。
VM_HOST のディレクトリ構成
$HOME/Dockerfiles - Dockerfile を格納します
$HOME/projects - プロジェクトを格納します
$HOME/vagrant - CoreOS のVagrantfileなどが格納されています
CoreOS の Vagrantfile
デフォルトから変更したのは以下の部分です。
プロジェクトのディレクトリと Dockerfile のディレクトリを sync させ、ポートも8080ポートを VM の80ポートにフォワーディングしています。
$shared_folders = {
'/home/ta/Dockerfiles' => '/home/core/Dockerfiles',
'/home/ta/projects' => '/home/core/projects',
}
$forwarded_ports = {
'80' => '8080'
}
リポジトリ作成
GitHub または Bitbucket に Dockerfile 用のリポジトリを作成します。
DockerHub ではあるリポジトリに push があると、その中の Dockerfile を全てビルドしているようなので、1Dockerfile 1リポジトリにしたほうがいいと思います。
まずは PhpInfo を表示してみる
各種コンテナのベースとなるコンテナを作成する
Dockerfileの作成
CentOS オフィシャルのイメージから、各種コンテナのベースとなるイメージを作成します。
$HOME/Dockerfiles/centos67-base/Dockerfile
を以下のように作り centos67-base リポジトリに push します。
FROM centos:6.7
MAINTAINER {NAME} <{EMAIL}>
RUN yum -y update
RUN yum -y groupinstall "Base" "Development tools"
RUN yum clean all
RUN groupadd www-data
RUN useradd -d /home/www-data -g www-data -r -s /sbin/nologin www-data
AutomatedBuilds
DockerHub へ行き、イメージをビルドしてもらいます。
- アイコンの右に
Create => Create Automated Build
を選択します。
※このとき GitHub か Bitbucket のアカウントをリンクしていなければリンクするよう聞かれます。 -
centos67-base
を選択 -
Short Description
になにか適当に入力 -
Create
ボタンをクリック -
Build Settings
タブを選択し、Trigger
ボタンをクリック
あとはBuild Details
のStatusがSuccessに変わるまでのんびり待ちましょう。
PHPコンテナを作成する
Dockerfileの作成
さきほど作成したベースコンテナをもとにPHPコンテナを作ります。
$HOME/Dockerfiles/php7-centos67/Dockerfile
と $HOME/Dockerfiles/php7-centos67/etc/php-fpm.conf/www.conf
をそれぞれ以下のように作ります。
FROM miyamotota/centos67-base:latest
MAINTAINER {NAME} <{EMAIL}>
RUN yum install -y epel-release
RUN wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
RUN rpm -Uvh remi-release-6*.rpm
RUN yum --enablerepo=remi-php70 update php\*
RUN yum --enablerepo=remi-php70,epel install -y php php-cli php-common php-mbstring php-fpm php-gd php-gmp php-mbstring php-mcrypt php-opcache php-pdo php-xml php-mysql
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
COPY ./etc/php-fpm.d/www.conf /etc/php-fpm.d/
EXPOSE 9000
CMD ["php-fpm", "--nodaemonize"]
www.conf は以下の箇所を変更しました。
user = www-data
group = www-data
listen = [::]:9000
listen.owner = www-data
listen.group = www-data
DockerHub で Build
先ほどの手順と同様にビルドします。
nginx コンテナの作成
こちらもベースコンテナをもとに Dockerfile を作成します。
$HOME/Dockerfiles/nginx-php/Dockerfile
FROM miyamotota/centos67-base:latest
MAINTAINER {NAME} <{EMAIL}>
RUN rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
RUN yum -y install nginx && yum clean all
COPY ./etc/nginx/nginx.conf /etc/nginx/
COPY ./etc/nginx/conf.d/default.conf /etc/nginx/conf.d/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
設定ファイルは以下の2つを作成します。
$HOME/Dockerfiles/nginx-php/etc/nginx/conf.d/default.conf
$HOME/Dockerfiles/nginx-php/etc/nginx/nginx.conf
DockerHub で Build
これも PHPコンテナと同様に DockerHub でビルドします。
storage コンテナの作成
index.php
を保存するコンテナを作ります。
$HOME/Dockerfiles/storage/Dockerfile
FROM miyamotota/centos67-base:latest
MAINTAINER {NAME} <{EMAIL}>
VOLUME /var/www/html
index.php と テスト用の html ファイルはひとまずこのリポジトリの中に含めてしまいます。
index.php
test.html
コンテナをリンクするための docker-compose.yml の作成
docker-compose.yml を作成します。
今回は $HOME/Dockerfiles/compose/phpinfo.yml
として作成します。
www-storage:
image: miyamotota/storage:latest
volumes:
- ../storage/var/www/html:/var/www/html:ro
phpfpm:
image: miyamotota/php7-centos67:latest
ports:
- "9000:9000"
volumes_from:
- www-storage
nginx:
image: miyamotota/nginx-php:latest
ports:
- "80:80"
volumes_from:
- www-storage
links:
- phpfpm:php_host
CoreOS で docker-compose
もうすぐ PhpInfo が見れます。
cd $HOME/vagrant
して vagrant up
して vagrant ssh
で VM に入ります。
そして、 cd Dockerfiles/compose/
したら docker-compose -f ./phpinfo.yml up -d
を実行。
http://localhost:8080 にアクセスすると PhpInfo がみれると思います。
また、 http://localhost:8080/test.html も問題なくみれるはずです。
さらにローカルで index.php や test.html を変更すると Docker 上のファイルも変更されるので、再度読み込むと変更が反映されています。
なお、コンテナの停止は docker-compose -f ./phpinfo.yml stop
で行えます。
Laravel5 の welcome.blade.php を表示する
Laravel5 プロジェクトの作成
$HOME/projects
配下に l5
という名前の Laravel5 プロジェクトを作成しておきます。
Dockerfile の作成
ここでは nginx-php
コンテナに手を加えて Laravel 用の設定ファイルを配置した nginx コンテナを作っていきます。
$HOME/Dockerfiles/nginx-laravel5/Dockerfile
FROM miyamotota/nginx-php:latest
MAINTAINER {NAME} <{EMAIL}>
RUN rm /etc/nginx/conf.d/*
COPY ./etc/nginx/conf.d/laravel.conf /etc/nginx/conf.d/
CMD ["nginx", "-g", "daemon off;"]
$HOME/Dockerfiles/nginx-laravel5/etc/nginx/conf.d/laravel.conf はこのようにしました。
こちらも例によって DockerHub でビルドしておきましょう。
docker-compose.yml の作成
Laravel 用の docker-compose.yml を作成します。
www-storage:
image: miyamotota/storage:latest
volumes:
- ../storage/var/www/html:/var/www/html:ro
- ../../projects/l5:/opt/l5
phpfpm:
image: miyamotota/php7-centos67:latest
ports:
- "9000:9000"
volumes_from:
- www-storage
nginx-laravel5:
image: miyamotota/nginx-laravel5:latest
ports:
- "80:80"
volumes_from:
- www-storage
links:
- phpfpm:php_host
今回は $HOME/Dockerfiles/compose/laravel-test.yml
として作成しました。
PhpInfo のときと異なるのは VOLUME ディレクトリが増えたことと、image を nginx-laravel5 に変更したことの2つです。
docker-compose
ビルドが完了したら Docker ホストに入り、docker-compose -f ./laravel-test.yml up -d
を実行します。
http://localhost:8080/l5/ にアクセスして Laravel5
の文字を眺めましょう。
お疲れ様でした!