本章ではLaravel6.xの環境をDockerコンテナ上に作成していこうと思います。
laravel6のフォルダを作成し、ターミナルで「git init」を実行し、git初期化を行なう。
Laravel6.0をComposer介してインストールをする
composer create-project --prefer-dist laravel/laravel laravel "6.*"
その後laravel6フォルダにdockerフォルダを作成する。するとlaravel6のフォルダの中身の構成は以下になります。
laravel6
├── docker
└── laravel
├── app
├── bootstrap
├── config
├── database
├── public
├── resources
├── routes
├── storage
├── tests
├── README.md
├── artisan
├── composer.json
├── package.json
├── phpunit.xml
├── server.php
└── webpack.mix.js
まずはApacheの設定を行います。コピペで大丈夫ですよー。
./docker/httpd/conf.d/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/www/localhost/web/public"
ServerName localhost
ErrorLog "logs/localhost-error.log"
CustomLog "logs/localhost-access.log" common
<Directory "/data/www/localhost/web/public">
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:443>
DocumentRoot "/data/www/localhost/web/public"
ServerName localhost:443
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
ErrorLog "logs/ssl_localhost-error.log"
CustomLog "logs/ssl_localhost-access.log" common
<Directory "/data/www/localhost/web/public">
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
また以下ではDockerfileを書き込んでいきます。基本はdockerのコンテナイメージの作成内容になります。記載を見てもらうとわかる通り、PHP7.4のインストールがされているかと思います。「remi-php74」がそうです。
./docker/Dockerfile
FROM centos:7
WORKDIR /data/www
# ---------------
# yum install
# ---------------
RUN yum install git -y
RUN yum install httpd -y
RUN yum install epel-release -y
RUN yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm -y
RUN yum install --enablerepo=epel,remi,remi-php74 php php-gd php-mbstring php-pdo php-mysql libapache2-mod-php php-xml php-soap php-curl php-zip php-intl mod_ssl mysql zip unzip curl -y
# ---------------
# composer install
# ---------------
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer
RUN chmod +x /usr/local/bin/composer
# ---------------
# set up apache
# ---------------
RUN ln -s /data/www/docker/httpd/conf.d/httpd-vhosts.conf /etc/httpd/conf.d/httpd-vhosts.conf
ENTRYPOINT ["./docker/docker-entrypoint.sh"]
このファイルがコンテナとホストの関係や約束事を記載したファイルになります。例えば、ホストとコンテナのファイル共有場所をどこにするかなど、ホストとコンテナが一番密接に関わってくるファイルになるかと思います。
./docker/docker-compose.yml
version: '3'
services:
localhost_db:
container_name: localhost_db
image: mysql:5.7
volumes:
- "$PWD/mysql/mysql-data:/var/lib/mysql"
- "$PWD/mysql/mysql-conf:/etc/mysql/conf.d"
environment:
- MYSQL_ROOT_PASSWORD=pass1234
- MYSQL_DATABASE=localhost_db
- MYSQL_USER=homestead
- MYSQL_PASSWORD=secret
ports:
- 8005:3306
localhost_web:
container_name: localhost_web
build: ./
volumes:
- "$PWD/../laravel:/data/www/localhost/web"
- "$PWD/../docker:/data/www/docker"
ports:
- 8003:80
- 8004:443
depends_on:
- localhost_db
コンテナが再起動するたびに実行されるファイルです。コンテナが再起動しても上記ファイルは実行されません。なのでどのファイルに何の記述を記載をするのかはプロジェクトや状況によって変えることが良いでしょう。
./docker/docker-entrypoint
#!/bin/bash
set -e
USER_ID=${LOCAL_UID:-1000}
GROUP_ID=${LOCAL_GID:-1000}
echo "Starting with UID : $USER_ID, GID: $GROUP_ID"
if [ ! -d "/home/user" ]; then
useradd -u $USER_ID -o -m user
groupmod -g $GROUP_ID user
export HOME=/home/user
fi
SRC=$(cd $(dirname $0); pwd)
cd $SRC
echo "$@"
cd /data/www/localhost/web/
# ---------------
# envファイルがなければ、初期化を行う
# ---------------
if [ ! -e ".env" ]; then
cp /data/www/docker/laravel/.env ./.env
composer update
echo "Waiting for mysql"
until mysqladmin ping -h localhost_db --silent; do
echo 'waiting for mysqld to be connectable...'
sleep 3
done
chmod 777 -R /data/www/docker/mysql/mysql-data
php artisan migrate
php artisan db:seed
php artisan storage:link
php artisan cache:clear
fi
php artisan cache:clear
chown -R user:user /data/www/localhost
chmod 777 -R /data/www/localhost/web/storage
/usr/sbin/httpd -k start
exec tail -f /dev/null
exec /usr/sbin/suexec user "$@"
docker/laravel/.env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:BSYupIu0SGObbv7oYe4NkVAMSgaPV+wJMtPnIU9DSgI=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=https://localhost:8003
DB_CONNECTION=mysql
DB_HOST=localhost_db
DB_PORT=3306
DB_DATABASE=localhost_db
DB_USERNAME=homestead
DB_PASSWORD=secret
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=sync
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
さーこれから、コンテナ立ち上げを実行しますが、その前に
./docker/laravel/.env→./laravel/.envへ書き込みをしにいく、ロジックがdocker-entrypoint.shに入っているので./laravel/.envを一旦削除しましょう。
それでは実行しましょう。./dockerにcdで入り、以下を実行
docker-compose up
もし下記のようなエラーが表示された場合はこちら
ERROR: for localhost_web Cannot start service localhost_web: OCI runtime create failed: container_linux.go:349: starting container process caused “exec: \”./docker/docker-entrypoint.sh\”: permission denied”: unknown
すると
このような画面になり、以下にアクセスしてみてください。
https://localhost:8004
このような画面がでてきたら、完成です。お疲れ様でした。次は
前回は