LaravelをDocker on vagrantの環境で作る話
今日のネタは… Laravelの環境をVagrant(Virtual Box)の上に動かしたDocker上に作る話です。
ってか、Dockerをシンプルに使えば?とか思われると思いますが、Windows… Hyper-Vいるよねぇ〜去年ぐらい調べたらHyper-V有効にしたらVirtualBOX動かないのよね。ってのが問題でした。今もそうかも
はい、困りましたwっと言う事でVagrant(VirtualBOX)環境上にDocker作れば良いじゃん!ついでに、docker動く環境ならdockerのconfig使えば良いんだしね
激烈シンプルに書いたLaravel on Vagrantの環境設定は….
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
# ubuntu 20.0 LTS系
config.vm.box = "ubuntu/focal64"
config.vm.network "forwarded_port", guest: 80, host: 8888
config.vm.synced_folder ".", "/vagrant", type: "virtualbox"
config.vm.provision "shell", path: "./configs/vagrant/provision.sh"
end
実際の構築スクリプトは”./configs/vagrant/provision.sh”
cd /vagrant
apt-get -qq update
apt-get -y -qq upgrade
apt-get -y -qq install npm apache2 php php-fpm unzip mcrypt php-fpm php-common php-mbstring php-xmlrpc php-gd php-xml php-mysql php-cli php-zip php-curl php-imagick php-phpdbg git curl
php -v
curl --silent https://getcomposer.org/composer-stable.phar -o /usr/local/bin/composer
chmod +x /usr/local/bin/composer
su - vagrant -c composer -V
test ! -f .env; cp /vagrant/configs/vagrant/.env /vagrant/.env
su vagrant -c 'composer update'
su vagrant -c 'php artisan key:generate'
su vagrant -c 'npm install'
chown -R vagrant:vagrant /vagrant/storage
chown -R vagrant:vagrant /vagrant/vendor
chown -R vagrant:vagrant /vagrant/node_modules
chown -R vagrant:vagrant /vagrant/bootstrap/cache/
chmod -R 2777 /vagrant/storage
chmod -R 2777 /vagrant/vendor
chmod -R 2777 /vagrant/node_modules
cp -f /vagrant/configs/vagrant/apache2/envvars /etc/apache2/envvars
cp -f /vagrant/configs/vagrant/apache2/apache2.conf /etc/apache2/apache2.conf
cp -f /vagrant/configs/vagrant/apache2/000-default.conf /etc/apache2/sites-available/000-default.conf
a2enmod rewrite
apache2ctl configtest
service apache2 restart
はい、開発環境なので(めんどくさいので)2777ですw (運用環境では使わないでください)
ま、こんな環境を使って、Dockerを動かしてみます。
まずは Vagrant環境からVagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/focal64"
config.vm.hostname = 'docker-project'
config.vm.network "forwarded_port", guest: 80, host: 8888
config.vm.synced_folder ".", "/vagrant"
config.vm.provision "shell", inline: <<-SHELL
timedatectl set-timezone Asia/Tokyo
chmod -R 777 /vagrant/
SHELL
config.vm.provision :docker
config.vm.provision :docker_compose, yml: "/vagrant/docker-compose.yml", run: "always"
end
次にdockerちゃん docker-compose.ymlで良い感じで組み上げます
version: '3'
services:
php:
container_name: php
build: ./docker/php
volumes:
- ./:/var/www
- ./logs/laravel:/var/www/storage/logs
environment:
TZ: Asia/Tokyo
nginx:
container_name: nginx
build: ./docker/nginx
volumes:
- ./:/var/www
ports:
- 80:80
depends_on:
- php
はい、ここで重要なポイントですが。Vagrant環境で、開発環境のルートを/vagrantにマウントします
config.vm.synced_folder ".", "/vagrant"
つぎにDockerさんの環境のなかでmountしています
php:
volumes:
- ./:/var/www
- ./logs/laravel:/var/www/storage/logs
nginx:
volumes:
- ./:/var/www
開発環境の ./を/vagrant (vagrant) を(./と解釈させる) それをdocker上に ./var/wwwにマウントさせますw
nginxの環境のdefault.confにて
server {
listen 80;
index index.php index.html;
root /var/www/public;
location / {
root /var/www/public;
index index.html index.php;
error_log /var/www/logs/nginx/error.log;
access_log /var/www/logs/nginx/access.log;
charset UTF-8;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
nginxの/var/www/publicにて、laravelを参照しています。
phpに関しては… こな感じ Dockerfile
FROM php:fpm
COPY php.ini /usr/local/etc/php/
RUN apt-get update \
&& apt-get install -y zlib1g-dev curl libzip-dev \
&& docker-php-ext-install zip pdo_mysql
RUN curl --silent https://getcomposer.org/composer-stable.phar -o /usr/local/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1
RUN ["chmod", "+x", "/usr/local/bin/composer"]
WORKDIR /var/www
RUN ["chmod", "-R","2775", "/var/www"]
RUN chown -R www-data:www-data /var/www
難しかった件は、laravelと接続したあとにstorage/framework/sessionsのpermissionエラーに関しての部分は悩みました… 1晩w
結局の結論は、Vagrantにありました。
config.vm.provision "shell", inline: <<-SHELL
timedatectl set-timezone Asia/Tokyo
chmod -R 777 /vagrant/
SHELL
ここのchmodがポイントです。これで、権限付与しないとDockerさんがNGです。
さて、まだまだ、windows環境では試していませんが、大体大丈夫でしょう!
つぎは… どうしようかなw