SlideShare a Scribd company logo
Docker friendly
PHP / Laravel
Laravel.shibuya #11 Online
なぜDockerを使うのか
• 軽量・高速
• 環境を選ばずどこでも動く
• ミュータブル / いつでも増やせる捨てられる
Laravel.shibuya #11 Online
現実は…
• 神Dockerfile(開発用のパッケージやツールが全部入り)
• 秘伝のタレ化したDockerfile(メンテナ退職・誰も触れない)
• 肥大化したコンテナイメージ
• 開発用と本番用とでDockerfileを二重管理
• 本番環境のみ発生する不具合
• 開発環境で試せない機能
• 特定のホスト上でしか動作しないコンテナ
• 更新されていない「環境構築手順書」
Laravel.shibuya #11 Online
PHPのDocker環境は難しい
Laravel.shibuya #11 Online
Dockerfile Next.js vs Laravel Sail
Laravel.shibuya #11 Online
https://github.com/laravel/sail/blob/v1.13.5/runtimes/8.1/Dockerfile#L15-L33
https://github.com/vercel/next.js/blob/v12.1.0/examples/with-docker/Dockerfile#L1-L4
Install Node.js
Install PHP
PHPアプリのコンテナに求められる機能
• PHP extensions / PECL extensions
• それらをビルドするためのパッケージ
• php-fpm / httpd or nginx
• composer
• データベース、メール、…等の外部接続要件
• xdebug / pcov / その他、開発ツール
Laravel.shibuya #11 Online
マルチステージビルドでの本番イメージ作成
Laravel.shibuya #11 Online
https://gist.github.com/KentarouTakeda/2d86c2d13da51610ffe6ea9f0bacee36
FROM php:8.1-fpm-alpine as base
RUN apk add --no-cache 
autoconf g++ gcc libzip libzip-dev make postgresql postgresql-dev zlib zlib-dev 
&& docker-php-ext-install 
bcmath opcache pdo pdo_pgsql zip 
&& apk del 
autoconf g++ gcc libzip-dev make zlib-dev 
&& curl -qs -o /usr/local/bin/composer https://getcomposer.org/download/latest-2.x/composer.phar 
&& chmod +x /usr/local/bin/composer
FROM base as development
RUN apk add --no-cache 
autoconf g++ gcc make 
&& pecl install 
pcov xdebug 
&& docker-php-ext-enable 
pcov xdebug 
&& apk del 
autoconf g++ gcc make
FROM base as deploy
COPY ["composer.json", "composer.lock", "./"]
RUN composer install --no-dev
COPY . .
①phpイメージよりbaseイメージを作成
②baseイメージよりdeployイメージを作成
baseイメージよりdevelopmentイメージを作成
(どこからも参照されない)
マルチステージビルドとDocker Compose
Laravel.shibuya #11 Online
FROM php:8.1-fpm-alpine as base
RUN apk add --no-cache 
autoconf g++ gcc libzip libzip-dev make postgresql postgresql-dev zlib zlib-dev 
&& docker-php-ext-install 
bcmath opcache pdo pdo_pgsql zip 
&& apk del 
autoconf g++ gcc libzip-dev make zlib-dev 
&& curl -qs -o /usr/local/bin/composer https://getcomposer.org/download/latest-2.x/composer.phar 
&& chmod +x /usr/local/bin/composer
FROM base as development
RUN apk add --no-cache 
autoconf g++ gcc make 
&& pecl install 
pcov xdebug 
&& docker-php-ext-enable 
pcov xdebug 
&& apk del 
autoconf g++ gcc make
FROM base as deploy
COPY ["composer.json", "composer.lock", "./"]
RUN composer install --no-dev
COPY . .
https://gist.github.com/KentarouTakeda/8442a591419b8f8f7302395335796a39
version: "3"
services:
php:
build:
context: .
target: development
volumes:
- .:/var/www/html
- vendor:/var/www/html/vendor
volumes:
vendor:
アプリケーションの汎用性
Laravel.shibuya #11 Online
環境に依存するリソース
• データベース
• メール
• キャッシュ
• ストレージ
• キュー
• タスクスケジュール
• ログ
これら全てが「環境構築」の対象となる
Laravel.shibuya #11 Online
Laravel 構成管理
ベストプラクティス
.env を使わない
config/ はデフォルトを維持
Laravel.shibuya #11 Online
よくある環境構築手順書
1. リポジトリをcloneします
2. docker compose up と入力します
3. docker compose exec php sh と入力しコンテナに入ります
4. composer install と入力します
5. .env.example を .env というファイル名でコピーします
6. .env を次の通り編集します ←だいたいここで詰まる
• foo bar baz ...
• hoge fuga piyo ...
7. localhost:8000 にアクセスします
Laravel.shibuya #11 Online
.envはメンテされない
• 追加した新機能の設定 .env.example に追記し忘れるケース
• 追加した本人の.envには設定が存在するため追記忘れに気づかない
• ドキュメント(構築手順書)の更新を忘れるケース
• .envが存在する = 開発者の間での環境差異を許容している
• 環境の再現性を求めてDockerを使い始めたのでは?
• ドキュメント化出来るのであればコード化できるはず
• 怠惰(Laziness)はプログラマーの美徳
Laravel.shibuya #11 Online
.env を使わない
• ホストから環境変数を注入
• Dockerベストプラクティス
• 本番環境と同じ設計
• APP_KEYのcommitが可能
• 32バイトの文字列なら何でも良い
• ローカル環境でしか使われない
• 暗号化・復号を環境間で再現可能
• アプリと同じリポジトリで管理
• .envが無くてもアプリが動く
Laravel.shibuya #11 Online
https://gist.github.com/KentarouTakeda/5fbdbcaaff3ba3945758da6659c59aff
version: "3"
services:
php:
environment:
- APP_DEBUG=${APP_DEBUG:-true}
- APP_KEY=${APP_KEY:-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
- APP_ENV=local
- APP_URL=http://localhost:8000
# ....
build:
context: .
target: development
volumes:
- .:/var/www/html
- vendor:/var/www/html/vendor
volumes:
vendor:
config/ はデフォルトを維持
• 上記は汎用性を一撃で失う例
• 環境変数から制御すればいい。
• docker-compose.ymlでの制御がおすすめ。
• laravel/laravel のconfig/は大抵の要件に対応できる(例外あり)
• 「環境変数 → どうしても無理ならconfig → それも無理なら実装で対応」という順序
• config/修正の要否はアプリの疎結合を図る一つの指標
Laravel.shibuya #11 Online
diff --git a/config/filesystems.php b/config/filesystems.php
index cf5abce7..b76aae49 100644
--- a/config/filesystems.php
+++ b/config/filesystems.php
@@ -13,7 +13,7 @@
|
*/
- 'default' => env('FILESYSTEM_DISK', 'local'),
+ 'default' => env('s3'),
/*
|--------------------------------------------------------------------------
ログ要件
• 開発環境
• storage/logs/laravel.log に出力
• 本番環境
• コンテナ外の永続化された領域に保存しなければならない
• コンテナが並列化されていたとしてもログは集約すべき
• ログ管理やアラートの要件を満たしやすい形式とすべき
• ログ要件(インフラ側の責務)はアプリケーションは関知すべきでない
Laravel.shibuya #11 Online
Dockerのログ機能
• ログは標準出力へ出力
Laravel.shibuya #11 Online
http://docs.docker.jp/v19.03/config/container/logging/index.html https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/using_awslogs.html
パブリッククラウドでのログサービス
• ログの形式はjson
Laravel.shibuya #11 Online
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData-discoverable-fields.html#CWL_AnalyzeLogData-discoverable-JSON-logs
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html#metric-filter-examples
環境変数によるログ制御
• 本番コンテナの環境変数
• アプリケーション側は Log::info() /
Log::xxxx() のみ
• class AppFormatter extends JsonFormatter
を作成しても良い Ref. Monolog
Laravel.shibuya #11 Online
https://github.com/laravel/laravel/blob/v9.0.0/config/logging.php#L89-L97
version: "3"
services:
php:
environment:
- LOG_CHANNEL=stderr
- LOG_STDERR_FORMATTER=MonologFormatterJsonFormatter
# ...
CloudWatch Logsとの親和性
CloudWatch LogsでWARNINGレベル以上のみフィルタする条件式
{ $.level >= 300 }
Laravel.shibuya #11 Online
https://github.com/Seldaek/monolog/blob/main/doc/01-usage.md
キュー / タスクスケジュール
• php-fpmと同じイメージ / 別のコンテナ
• 専用イメージを作成しても良い(メンテコストと相談)
• 起動コマンドとしてキューワーカやタスクスケジューラを指定
• CMD ./artisan schedule:work / CMD ./artisan queue:work
• 基本的に全てのタスクに onOneServer() を付与 Ref.@mpyw
• タスク消化が追いつかなくなったらコンテナを増やして解決
• メモリリーク等でワーカーが異常終了しても自動的に復活
• 再起動所要時間が許容できない場合 CMD で無限ループ
Laravel.shibuya #11 Online
ストレージ
• Fileファサードは使わない
• 開発環境では問題なく 動いてしまう
• FILESYSTEM_DISK=local は Storage を代替 出来てしまう
• Storageファサードのみの動作であれば環境を問わず動く
• Storage::url() / Storage::temporaryUrl()
• S3とそれ以外とで動作が異なる
• ドライバに応じた個別の実装がアプリ側に必要になる
• ルーティングはインフラ(ロードバランサーやCDN)で解決
config(‘filesystems.disks.public’) と同じルーティングをCDNに設定する構成がおすすめ
• 認可はアプリケーション側の実装で解決
• 単一の環境から複数のストレージを扱わない
• 複数必要な場合コンテナを分割し各コンテナの AWS_BUCKET 環境変数で制御
• config/filesystems.phpのデフォルトを維持
• S3へのアクセス権限はKEY/SECRETではなくタスクロールで制御する
• ローカル環境からはS3は扱わない。MinIOも使わない。
Laravel.shibuya #11 Online

More Related Content

What's hot

ADRという考えを取り入れてみて
ADRという考えを取り入れてみてADRという考えを取り入れてみて
ADRという考えを取り入れてみて
infinite_loop
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
Kohei Nakamura
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
増田 亨
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Akihiro Suda
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
Takafumi ONAKA
 
ゲームの仕様書を書こうまとめ
ゲームの仕様書を書こうまとめゲームの仕様書を書こうまとめ
ゲームの仕様書を書こうまとめ
Sugimoto Chizuru
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
 
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
onozaty
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイントVPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
Takuya Takaseki
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
mosa siru
 
Tackling Complexity
Tackling ComplexityTackling Complexity
Tackling Complexity
Yoshitaka Kawashima
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
Yoshiki Nakagawa
 

What's hot (20)

ADRという考えを取り入れてみて
ADRという考えを取り入れてみてADRという考えを取り入れてみて
ADRという考えを取り入れてみて
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
 
ゲームの仕様書を書こうまとめ
ゲームの仕様書を書こうまとめゲームの仕様書を書こうまとめ
ゲームの仕様書を書こうまとめ
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイントVPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
Tackling Complexity
Tackling ComplexityTackling Complexity
Tackling Complexity
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 

Similar to Docker friendly PHP / Laravel

Laravelから学びレガシーと闘いはじめた
Laravelから学びレガシーと闘いはじめたLaravelから学びレガシーと闘いはじめた
Laravelから学びレガシーと闘いはじめた
Yuta Ohashi
 
Vagrant & Dockerによるイマドキの開発環境構築
Vagrant & Dockerによるイマドキの開発環境構築Vagrant & Dockerによるイマドキの開発環境構築
Vagrant & Dockerによるイマドキの開発環境構築
Nakazawa Yuichi
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングterurou
 
活動報告9 laravel5入門-
活動報告9  laravel5入門-活動報告9  laravel5入門-
活動報告9 laravel5入門-
vx-pc-club
 
Kvwatcher
KvwatcherKvwatcher
Kvwatcher
ke-m kamekoopa
 
Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作
terurou
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Masahiro Nagano
 
Docker PaaSとしての OpenShift, Deis, Flynn比較
Docker PaaSとしての OpenShift, Deis, Flynn比較Docker PaaSとしての OpenShift, Deis, Flynn比較
Docker PaaSとしての OpenShift, Deis, Flynn比較
Kazuto Kusama
 
捕鯨!詳解docker
捕鯨!詳解docker捕鯨!詳解docker
捕鯨!詳解docker
雄哉 吉田
 
Dockerで開発環境をデリバる
Dockerで開発環境をデリバるDockerで開発環境をデリバる
Dockerで開発環境をデリバる
Daigou Harada
 
自作アプリをデプロイしてみた with Docker
自作アプリをデプロイしてみた with Docker自作アプリをデプロイしてみた with Docker
自作アプリをデプロイしてみた with Docker
iPride Co., Ltd.
 
Java in the World of Container by David Buck
Java in the World of Container by David BuckJava in the World of Container by David Buck
Java in the World of Container by David Buck
オラクルエンジニア通信
 
いまからでも遅くない Docker事始め&愉快な仲間達
いまからでも遅くない Docker事始め&愉快な仲間達いまからでも遅くない Docker事始め&愉快な仲間達
いまからでも遅くない Docker事始め&愉快な仲間達
softlayerjp
 
AngularJSを通してDockerと触れ合った
AngularJSを通してDockerと触れ合ったAngularJSを通してDockerと触れ合った
AngularJSを通してDockerと触れ合った
pastelInc
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもん
Masahito Zembutsu
 
LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!
KLab株式会社
 
Dockerでデプロイ
DockerでデプロイDockerでデプロイ
Dockerでデプロイ
oshiro_seiya
 
ラズパイ2で動く Docker PaaS
ラズパイ2で動く Docker PaaSラズパイ2で動く Docker PaaS
ラズパイ2で動く Docker PaaS
npsg
 
minneで学ぶクラウド脳
minneで学ぶクラウド脳minneで学ぶクラウド脳
minneで学ぶクラウド脳
Uchio Kondo
 
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけねGitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
Naoto TAKAHASHI
 

Similar to Docker friendly PHP / Laravel (20)

Laravelから学びレガシーと闘いはじめた
Laravelから学びレガシーと闘いはじめたLaravelから学びレガシーと闘いはじめた
Laravelから学びレガシーと闘いはじめた
 
Vagrant & Dockerによるイマドキの開発環境構築
Vagrant & Dockerによるイマドキの開発環境構築Vagrant & Dockerによるイマドキの開発環境構築
Vagrant & Dockerによるイマドキの開発環境構築
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミング
 
活動報告9 laravel5入門-
活動報告9  laravel5入門-活動報告9  laravel5入門-
活動報告9 laravel5入門-
 
Kvwatcher
KvwatcherKvwatcher
Kvwatcher
 
Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
 
Docker PaaSとしての OpenShift, Deis, Flynn比較
Docker PaaSとしての OpenShift, Deis, Flynn比較Docker PaaSとしての OpenShift, Deis, Flynn比較
Docker PaaSとしての OpenShift, Deis, Flynn比較
 
捕鯨!詳解docker
捕鯨!詳解docker捕鯨!詳解docker
捕鯨!詳解docker
 
Dockerで開発環境をデリバる
Dockerで開発環境をデリバるDockerで開発環境をデリバる
Dockerで開発環境をデリバる
 
自作アプリをデプロイしてみた with Docker
自作アプリをデプロイしてみた with Docker自作アプリをデプロイしてみた with Docker
自作アプリをデプロイしてみた with Docker
 
Java in the World of Container by David Buck
Java in the World of Container by David BuckJava in the World of Container by David Buck
Java in the World of Container by David Buck
 
いまからでも遅くない Docker事始め&愉快な仲間達
いまからでも遅くない Docker事始め&愉快な仲間達いまからでも遅くない Docker事始め&愉快な仲間達
いまからでも遅くない Docker事始め&愉快な仲間達
 
AngularJSを通してDockerと触れ合った
AngularJSを通してDockerと触れ合ったAngularJSを通してDockerと触れ合った
AngularJSを通してDockerと触れ合った
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもん
 
LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!
 
Dockerでデプロイ
DockerでデプロイDockerでデプロイ
Dockerでデプロイ
 
ラズパイ2で動く Docker PaaS
ラズパイ2で動く Docker PaaSラズパイ2で動く Docker PaaS
ラズパイ2で動く Docker PaaS
 
minneで学ぶクラウド脳
minneで学ぶクラウド脳minneで学ぶクラウド脳
minneで学ぶクラウド脳
 
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけねGitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
 

More from Kentarou Takeda

コード品質を保つために心がけたいこと
コード品質を保つために心がけたいことコード品質を保つために心がけたいこと
コード品質を保つために心がけたいこと
Kentarou Takeda
 
Composer bin plugin / ツールの依存管理から解放される
Composer bin plugin / ツールの依存管理から解放されるComposer bin plugin / ツールの依存管理から解放される
Composer bin plugin / ツールの依存管理から解放される
Kentarou Takeda
 
マスタデータの管理と運用について
マスタデータの管理と運用についてマスタデータの管理と運用について
マスタデータの管理と運用について
Kentarou Takeda
 
スモールサービスにおけるCloudFrontの真骨頂
スモールサービスにおけるCloudFrontの真骨頂スモールサービスにおけるCloudFrontの真骨頂
スモールサービスにおけるCloudFrontの真骨頂
Kentarou Takeda
 
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
Kentarou Takeda
 
HttpClientModule
HttpClientModuleHttpClientModule
HttpClientModule
Kentarou Takeda
 

More from Kentarou Takeda (6)

コード品質を保つために心がけたいこと
コード品質を保つために心がけたいことコード品質を保つために心がけたいこと
コード品質を保つために心がけたいこと
 
Composer bin plugin / ツールの依存管理から解放される
Composer bin plugin / ツールの依存管理から解放されるComposer bin plugin / ツールの依存管理から解放される
Composer bin plugin / ツールの依存管理から解放される
 
マスタデータの管理と運用について
マスタデータの管理と運用についてマスタデータの管理と運用について
マスタデータの管理と運用について
 
スモールサービスにおけるCloudFrontの真骨頂
スモールサービスにおけるCloudFrontの真骨頂スモールサービスにおけるCloudFrontの真骨頂
スモールサービスにおけるCloudFrontの真骨頂
 
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
 
HttpClientModule
HttpClientModuleHttpClientModule
HttpClientModule
 

Recently uploaded

Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
tazaki1
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
osamut
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
Osaka University
 
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
Yuki Miyazaki
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
嶋 是一 (Yoshikazu SHIMA)
 
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
sugiuralab
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
azuma satoshi
 

Recently uploaded (9)

Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
 
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
 
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
 

Docker friendly PHP / Laravel

  • 1. Docker friendly PHP / Laravel Laravel.shibuya #11 Online
  • 2. なぜDockerを使うのか • 軽量・高速 • 環境を選ばずどこでも動く • ミュータブル / いつでも増やせる捨てられる Laravel.shibuya #11 Online
  • 3. 現実は… • 神Dockerfile(開発用のパッケージやツールが全部入り) • 秘伝のタレ化したDockerfile(メンテナ退職・誰も触れない) • 肥大化したコンテナイメージ • 開発用と本番用とでDockerfileを二重管理 • 本番環境のみ発生する不具合 • 開発環境で試せない機能 • 特定のホスト上でしか動作しないコンテナ • 更新されていない「環境構築手順書」 Laravel.shibuya #11 Online
  • 5. Dockerfile Next.js vs Laravel Sail Laravel.shibuya #11 Online https://github.com/laravel/sail/blob/v1.13.5/runtimes/8.1/Dockerfile#L15-L33 https://github.com/vercel/next.js/blob/v12.1.0/examples/with-docker/Dockerfile#L1-L4 Install Node.js Install PHP
  • 6. PHPアプリのコンテナに求められる機能 • PHP extensions / PECL extensions • それらをビルドするためのパッケージ • php-fpm / httpd or nginx • composer • データベース、メール、…等の外部接続要件 • xdebug / pcov / その他、開発ツール Laravel.shibuya #11 Online
  • 7. マルチステージビルドでの本番イメージ作成 Laravel.shibuya #11 Online https://gist.github.com/KentarouTakeda/2d86c2d13da51610ffe6ea9f0bacee36 FROM php:8.1-fpm-alpine as base RUN apk add --no-cache autoconf g++ gcc libzip libzip-dev make postgresql postgresql-dev zlib zlib-dev && docker-php-ext-install bcmath opcache pdo pdo_pgsql zip && apk del autoconf g++ gcc libzip-dev make zlib-dev && curl -qs -o /usr/local/bin/composer https://getcomposer.org/download/latest-2.x/composer.phar && chmod +x /usr/local/bin/composer FROM base as development RUN apk add --no-cache autoconf g++ gcc make && pecl install pcov xdebug && docker-php-ext-enable pcov xdebug && apk del autoconf g++ gcc make FROM base as deploy COPY ["composer.json", "composer.lock", "./"] RUN composer install --no-dev COPY . . ①phpイメージよりbaseイメージを作成 ②baseイメージよりdeployイメージを作成 baseイメージよりdevelopmentイメージを作成 (どこからも参照されない)
  • 8. マルチステージビルドとDocker Compose Laravel.shibuya #11 Online FROM php:8.1-fpm-alpine as base RUN apk add --no-cache autoconf g++ gcc libzip libzip-dev make postgresql postgresql-dev zlib zlib-dev && docker-php-ext-install bcmath opcache pdo pdo_pgsql zip && apk del autoconf g++ gcc libzip-dev make zlib-dev && curl -qs -o /usr/local/bin/composer https://getcomposer.org/download/latest-2.x/composer.phar && chmod +x /usr/local/bin/composer FROM base as development RUN apk add --no-cache autoconf g++ gcc make && pecl install pcov xdebug && docker-php-ext-enable pcov xdebug && apk del autoconf g++ gcc make FROM base as deploy COPY ["composer.json", "composer.lock", "./"] RUN composer install --no-dev COPY . . https://gist.github.com/KentarouTakeda/8442a591419b8f8f7302395335796a39 version: "3" services: php: build: context: . target: development volumes: - .:/var/www/html - vendor:/var/www/html/vendor volumes: vendor:
  • 10. 環境に依存するリソース • データベース • メール • キャッシュ • ストレージ • キュー • タスクスケジュール • ログ これら全てが「環境構築」の対象となる Laravel.shibuya #11 Online
  • 11. Laravel 構成管理 ベストプラクティス .env を使わない config/ はデフォルトを維持 Laravel.shibuya #11 Online
  • 12. よくある環境構築手順書 1. リポジトリをcloneします 2. docker compose up と入力します 3. docker compose exec php sh と入力しコンテナに入ります 4. composer install と入力します 5. .env.example を .env というファイル名でコピーします 6. .env を次の通り編集します ←だいたいここで詰まる • foo bar baz ... • hoge fuga piyo ... 7. localhost:8000 にアクセスします Laravel.shibuya #11 Online
  • 13. .envはメンテされない • 追加した新機能の設定 .env.example に追記し忘れるケース • 追加した本人の.envには設定が存在するため追記忘れに気づかない • ドキュメント(構築手順書)の更新を忘れるケース • .envが存在する = 開発者の間での環境差異を許容している • 環境の再現性を求めてDockerを使い始めたのでは? • ドキュメント化出来るのであればコード化できるはず • 怠惰(Laziness)はプログラマーの美徳 Laravel.shibuya #11 Online
  • 14. .env を使わない • ホストから環境変数を注入 • Dockerベストプラクティス • 本番環境と同じ設計 • APP_KEYのcommitが可能 • 32バイトの文字列なら何でも良い • ローカル環境でしか使われない • 暗号化・復号を環境間で再現可能 • アプリと同じリポジトリで管理 • .envが無くてもアプリが動く Laravel.shibuya #11 Online https://gist.github.com/KentarouTakeda/5fbdbcaaff3ba3945758da6659c59aff version: "3" services: php: environment: - APP_DEBUG=${APP_DEBUG:-true} - APP_KEY=${APP_KEY:-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX} - APP_ENV=local - APP_URL=http://localhost:8000 # .... build: context: . target: development volumes: - .:/var/www/html - vendor:/var/www/html/vendor volumes: vendor:
  • 15. config/ はデフォルトを維持 • 上記は汎用性を一撃で失う例 • 環境変数から制御すればいい。 • docker-compose.ymlでの制御がおすすめ。 • laravel/laravel のconfig/は大抵の要件に対応できる(例外あり) • 「環境変数 → どうしても無理ならconfig → それも無理なら実装で対応」という順序 • config/修正の要否はアプリの疎結合を図る一つの指標 Laravel.shibuya #11 Online diff --git a/config/filesystems.php b/config/filesystems.php index cf5abce7..b76aae49 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -13,7 +13,7 @@ | */ - 'default' => env('FILESYSTEM_DISK', 'local'), + 'default' => env('s3'), /* |--------------------------------------------------------------------------
  • 16. ログ要件 • 開発環境 • storage/logs/laravel.log に出力 • 本番環境 • コンテナ外の永続化された領域に保存しなければならない • コンテナが並列化されていたとしてもログは集約すべき • ログ管理やアラートの要件を満たしやすい形式とすべき • ログ要件(インフラ側の責務)はアプリケーションは関知すべきでない Laravel.shibuya #11 Online
  • 17. Dockerのログ機能 • ログは標準出力へ出力 Laravel.shibuya #11 Online http://docs.docker.jp/v19.03/config/container/logging/index.html https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/using_awslogs.html
  • 18. パブリッククラウドでのログサービス • ログの形式はjson Laravel.shibuya #11 Online https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData-discoverable-fields.html#CWL_AnalyzeLogData-discoverable-JSON-logs https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html#metric-filter-examples
  • 19. 環境変数によるログ制御 • 本番コンテナの環境変数 • アプリケーション側は Log::info() / Log::xxxx() のみ • class AppFormatter extends JsonFormatter を作成しても良い Ref. Monolog Laravel.shibuya #11 Online https://github.com/laravel/laravel/blob/v9.0.0/config/logging.php#L89-L97 version: "3" services: php: environment: - LOG_CHANNEL=stderr - LOG_STDERR_FORMATTER=MonologFormatterJsonFormatter # ...
  • 20. CloudWatch Logsとの親和性 CloudWatch LogsでWARNINGレベル以上のみフィルタする条件式 { $.level >= 300 } Laravel.shibuya #11 Online https://github.com/Seldaek/monolog/blob/main/doc/01-usage.md
  • 21. キュー / タスクスケジュール • php-fpmと同じイメージ / 別のコンテナ • 専用イメージを作成しても良い(メンテコストと相談) • 起動コマンドとしてキューワーカやタスクスケジューラを指定 • CMD ./artisan schedule:work / CMD ./artisan queue:work • 基本的に全てのタスクに onOneServer() を付与 Ref.@mpyw • タスク消化が追いつかなくなったらコンテナを増やして解決 • メモリリーク等でワーカーが異常終了しても自動的に復活 • 再起動所要時間が許容できない場合 CMD で無限ループ Laravel.shibuya #11 Online
  • 22. ストレージ • Fileファサードは使わない • 開発環境では問題なく 動いてしまう • FILESYSTEM_DISK=local は Storage を代替 出来てしまう • Storageファサードのみの動作であれば環境を問わず動く • Storage::url() / Storage::temporaryUrl() • S3とそれ以外とで動作が異なる • ドライバに応じた個別の実装がアプリ側に必要になる • ルーティングはインフラ(ロードバランサーやCDN)で解決 config(‘filesystems.disks.public’) と同じルーティングをCDNに設定する構成がおすすめ • 認可はアプリケーション側の実装で解決 • 単一の環境から複数のストレージを扱わない • 複数必要な場合コンテナを分割し各コンテナの AWS_BUCKET 環境変数で制御 • config/filesystems.phpのデフォルトを維持 • S3へのアクセス権限はKEY/SECRETではなくタスクロールで制御する • ローカル環境からはS3は扱わない。MinIOも使わない。 Laravel.shibuya #11 Online