written by ミキロウ

第3回 Docker環境でLaravelを構築

本章では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/src/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/src/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
CMD ["/sbin/init"]
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

このような画面がでてきたら、完成です。お疲れ様でした。次は

前回は

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です