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 \
  &amp;&amp; apt-get install -y zlib1g-dev curl libzip-dev \
  &amp;&amp; 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