本記事について
本記事は、以下の記事をM1Mac環境で自分もやってみた記録です。
【超入門】20分でLaravel開発環境を爆速構築するDoc...
前置きが長いので、Docker, Git, GitHubの設定が終わっ...
差別化としては、補足やテストなど、自分が必要ないなと思った部分は記載していないので、ミニマム構成になっています。そして、自分のための備忘録です。
プロジェクトフォルダ準備
mkdir docker-laravel
cd docker-laravel
リモートリポジトリの作成
echo "# docker-laravel8" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin gitリポジトリ
git push -u origin main
appコンテナの作成
docker-compose.ymlの作成
touch docker-compose.yml
version: "3.9"
services:
app:
build: ./infra/php
volumes:
- ./src:/data
.Dockerfileの作成
mkdir -p infra/php
touch infra/php/Dockerfile
#ベースイメージ。php DockerHub公式イメージをベースに。
FROM php:8.1-fpm-buster
# コンテナ内のサーバー環境変数の設定
# https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/builder/#env
ENV COMPOSER_ALLOW_SUPERUSER=1 \
COMPOSER_HOME=/composer
# https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/builder/#copy
COPY --from=composer:2.2 /usr/bin/composer /usr/bin/composer
# apt関係
# https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/builder/#run
# インストール可能なパッケージ一覧更新
RUN apt-get update && \
# Laravelに必要なパッケージインストール
# --no-install-recommends:不要なパッケージのインストール防止
apt-get -y install --no-install-recommends git unzip libzip-dev libicu-dev libonig-dev && \
# パッケージインストールで使用したキャッシュファイル削除
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
# PHPの拡張ライブラリインストール
docker-php-ext-install intl pdo_mysql zip bcmath
# https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/builder/#copy
COPY ./php.ini /usr/local/etc/php/php.ini
# https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/builder/#workdir
WORKDIR /data
php | Docker Hub公式イメージをベースイメージとして利用。
php.iniの作成
- php設定ファイル
- PHPエラーメッセージの設定
- PHPエラーログの設定
- メモリ等の設定(お好みで)
- タイムゾーン設定
- 文字コード設定
touch infra/php/php.ini
srcディレクトリ作成
mkdir src
Docker起動
build
docker compose build
[+] Building 77.0s (11/11) FINISHED
などと出ればOK。
起動
docker compose up -d
- -d
- デタッチモード。バックグラウンドで動作する。
docker compose up -d
[+] Running 2/2
⠿ Network docker-laravel-handson_default Created 0.1s
⠿ Container docker-laravel-handson-app-1 Started 0.6s
以上のように表示されればOK。
コンテナの確認
docker compose ps
NAME COMMAND SERVICE STATUS PORTS
docker-laravel-app-1 "docker-php-entrypoi…" app running 9000/tcp
docker compose psでコンテナ一覧が確認できます。
appコンテナの確認
appコンテナに入る
docker compose exec app bash
以上を実行
root@fd83e642cfe0:/data#
以上のようになればコンテナに入れました。(ユーザー名@コンテナID:ディレクトリ#)
phpバージョン
root@fd83e642cfe0:/data# php -v
PHP 8.1.13 (cli) (built: Dec 21 2022 07:39:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.13, Copyright (c) Zend Technologies
Composerのバージョン
root@fd83e642cfe0:/data# composer -V
Composer version 2.2.18 2022-08-20 11:33:38
php拡張機能一覧
root@fd83e642cfe0:/data# php -m
[PHP Modules]
bcmath
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
intl
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zip
zlib
[Zend Modules]
コンテナから退出
exit
control+dでも退出可能
gitにpush
git push
git status
On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: docker-compose.yml
new file: infra/php/Dockerfile
new file: infra/php/php.ini
git commit -m "create app container"
コンテナ破棄
docker compose down
Webコンテナの作成
docker-compose.yml へ追記する
version: "3.9" #docker composeファイルのバージョン
services:
app: #任意のサービス名
build: ./infra/php #ビルドコンテキスト。docker buildを実行する際の作業ディレクトリ
volumes: #ホスト側のディレクトリ等をコンテナ側にマウント
- ./src:/data #srcディレクトリをappコンテナの/dataへマウント
# 以下、追加
web:
image: nginx:1.20-alpine
ports:
- 8080:80
volumes:
- ./src:/data
- ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf
working_dir: /data
default.confの作成
mkdir infra/nginx
touch infra/nginx/default.conf
Laravel公式にnginxの設定例が用意されているので、こちらを流用します。
https://readouble.com/laravel/8.x/ja/deployment.html
server {
listen 80;
server_name example.com;
root /data/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
Docker起動
docker compose up -d
[+] Running 7/7
⠿ web Pulled 5.9s
⠿ 455c02918c45 Pull complete 1.4s
⠿ 08b6b842dcd7 Pull complete 2.3s
⠿ d49e54c17cd8 Pull complete 2.3s
⠿ 0263029b2ae8 Pull complete 2.4s
⠿ 7a15a92d87b8 Pull complete 2.4s
⠿ 9fed390110de Pull complete 2.5s
[+] Running 3/3
⠿ Network docker-laravel-handson_default Created 0.1s
⠿ Container docker-laravel-handson-web-1 Started 0.6s
⠿ Container docker-laravel-handson-app-1 Started 0.6s
docker compose ps
NAME COMMAND SERVICE STATUS PORTS
docker-laravel-app-1 "docker-php-entrypoi…" app running 9000/tcp
docker-laravel-web-1 "/docker-entrypoint.…" web running 0.0.0.0:8080->80/tcp
appコンテナは9000/tcp
webコンテナは 0.0.0.0:8080->80/tcp
ホスト上の8080番ポートをコンテナの80番ポートへ割り当てている。
nginxのバージョン確認
docker compose exec web nginx -v
nginx version: nginx/1.20.2
webコンテナの動作確認
- webコンテナの動作確認
- HTMLとPHPが表示されるか
mkdir src/public
echo "Hello World" > src/public/index.html
echo "<?php phpinfo();" > src/public/phpinfo.php
htmlの表示
404 Not Found
phpinfoの表示
404 Not Found
確認用ファイルの削除
rm -rf src/*
gitpush
git add .
git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: docker-compose.yml
new file: infra/nginx/default.conf
git commit -m "create web container"
2 files changed, 45 insertions(+), 1 deletion(-)
create mode 100644 infra/nginx/default.conf
Laravelインストール
appコンテナでインストール
docker compose exec app bash
composer create-project --prefer-dist "laravel/laravel=9.*" .
chmod -R 777 storage bootstrap/cache
php artisan -V
Laravel Framework 9.45.1
commit
git add .
git commit -m "first laravel install"
git push
コンテナを破棄
docker compose down
dbコンテナの作成
docker-compose.yml へ追記
version: "3.9" #docker composeファイルのバージョン
services:
app: #任意のサービス名
build: ./infra/php #ビルドコンテキスト。docker buildを実行する際の作業ディレクトリ
volumes: #ホスト側のディレクトリ等をコンテナ側にマウント
- ./src:/data #srcディレクトリをappコンテナの/dataへマウント
web:
# https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/#image
image: nginx:1.20-alpine
# https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/#ports
ports:
- 8080:80
# https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/#volumes
volumes:
- ./src:/data
- ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf
working_dir: /data
# 以下、追記
db:
build: ./infra/mysql
volumes:
- db-store:/var/lib/mysql
volumes:
db-store:
Dockerfileの作成
mkdir infra/mysql
touch infra/mysql/Dockerfile
FROM mysql/mysql-server:8.0
ENV MYSQL_DATABASE=laravel \
MYSQL_USER=phper \
MYSQL_PASSWORD=secret \
MYSQL_ROOT_PASSWORD=secret \
TZ=Asia/Tokyo
COPY ./my.cnf /etc/my.cnf
RUN chmod 644 /etc/my.cnf
my.cnfを作成
touch infra/mysql/my.cnf
[mysqld]
# default
skip-host-cache
skip-name-resolve
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
secure-file-priv = /var/lib/mysql-files
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
# character set / collation
character_set_server = utf8mb4
collation_server = utf8mb4_ja_0900_as_cs_ks
# timezone
default-time-zone = SYSTEM
log_timestamps = SYSTEM
# Error Log
log-error = mysql-error.log
# Slow Query Log
slow_query_log = 1
slow_query_log_file = mysql-slow.log
long_query_time = 1.0
log_queries_not_using_indexes = 0
# General Log
general_log = 1
general_log_file = mysql-general.log
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
Docker起動
docker compose build
docker compose up -d
コンテナの確認
docker compose ps
NAME COMMAND SERVICE STATUS PORTS
docker-laravel-app-1 "docker-php-entrypoi…" app running 9000/tcp
docker-laravel-db-1 "/entrypoint.sh mysq…" db running (starting) 3306/tcp, 33060-33061/tcp
docker-laravel-web-1 "/docker-entrypoint.…" web running 0.0.0.0:8080->80/tcp
mysql確認
docker compose exec db mysql -V
mysql Ver 8.0.31 for Linux on aarch64 (MySQL Community Server - GPL)
mysqlに接続できるよう設定
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=phper
DB_PASSWORD=secret
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=phper
DB_PASSWORD=secret
マイグレーション実行
docker compose exec app bash
root@3b5cde3649d1:/data# php artisan migrate
INFO Preparing database.
Creating migration table ..................................................................... 49ms DONE
INFO Running migrations.
2014_10_12_000000_create_users_table ......................................................... 39ms DONE
2014_10_12_100000_create_password_resets_table ............................................... 43ms DONE
2019_08_19_000000_create_failed_jobs_table ................................................... 28ms DONE
2019_12_14_000001_create_personal_access_tokens_table ........................................ 37ms DONE
db参照
新しいターミナルを起動
docker compose exec db bash
bash-4.4# mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| laravel |
| performance_schema |
+--------------------+
3 rows in set (0.01 sec)
mysql> show tables;
+------------------------+
| Tables_in_laravel |
+------------------------+
| failed_jobs |
| migrations |
| password_resets |
| personal_access_tokens |
| users |
+------------------------+
5 rows in set (0.01 sec)
mysql> desc users;
+-------------------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+-----------------+------+-----+---------+----------------+
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| email | varchar(255) | NO | UNI | NULL | |
| email_verified_at | timestamp | YES | | NULL | |
| password | varchar(255) | NO | | NULL | |
| remember_token | varchar(100) | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+-------------------+-----------------+------+-----+---------+----------------+
8 rows in set (0.01 sec)
mysql> SELECT * FROM users;
Empty set (0.01 sec)
gitpush
git add .
git commit -m "create db container"
git push
コメント