第02回: Dockerfileの基本構成 — 環境をコードで定義するとはどういうことか?
「新しいメンバーが入るたびに環境構築で1日かかる」「自分のマシンでは動くのに本番で動かない」——こうした問題の多くは、環境をドキュメントで管理していることが原因です。
現代のWeb開発者へ。基礎文法からアーキテクチャまで、体系的に学べる技術ガイド。
# User.php
public function init() {
$this->role = 'Architect';
return 'Ready to build';
}
「新しいメンバーが入るたびに環境構築で1日かかる」「自分のマシンでは動くのに本番で動かない」——こうした問題の多くは、環境をドキュメントで管理していることが原因です。
「Dockerを学ぼう」と決めた瞬間、多くの人が「イメージ」「コンテナ」「ボリューム」という3つの言葉に一度はつまずきます。これらの違いが曖昧なまま進むと、設定ファイルを読んでも何が起きているのかがわからなくなります。
障害の多くは、機能のバグよりも「バックアップが取れていなかった」「スロークエリの監視がなかった」「権限が過剰だった」といった設定漏れや運用の穴から発生します。本番に出す前にチェックリストを持っておくことで、こうした抜け漏れを事前に防ぐことができます。
単一のMySQLサーバーにすべての読み書きが集中している構成では、サーバー障害時にサービスが完全停止します。また、アクセスが増えるにつれて読み取りクエリの負荷が書き込みを圧迫し、全体のパフォーマンスが低下する問題も起きます。
本番でパフォーマンス問題が発生したとき、「たぶんこのクエリが重いはず」という勘で対応しても、インデックスを追加したのに改善しない・別のクエリが原因だったという事態になりがちです。
“SELECT FROM users WHERE email = ‘” . $email . “‘” のようにPHPで文字列連結してSQLを組み立てると、’ OR ‘1’=’1 といった入力を受けたとき全データが返る脆弱性になります。これがSQLインジェクション攻撃で、OWASP…
開発環境の便利さそのままに、本番でも root ユーザーをアプリに使わせているケースがあります。この状態では、SQLインジェクション攻撃を受けた場合やアプリのバグでDROPが実行された場合に、データベース全体が被害を受けるリスクがあります。
「論理削除を除いた有効ユーザーを取得するSQL」や「集計結果を求めるSQL」が、コントローラー・バッチ・APIエンドポイントにそれぞれコピーされている状態は管理が困難です。1箇所の条件変更が漏れると、データの不整合を引き起こします。
アクセスログや履歴データを1つのテーブルに蓄積し続けると、削除クエリが重くなり、バックアップに時間がかかり、インデックスが肥大化する問題が起きます。DELETE WHERE accessedat < '2024-01-01' を流すだけで数十分かかる、というケースも珍しくありませ...
「とにかく正規化すれば正しい」と思っていると、複雑なJOINが増えてパフォーマンスが劣化したり、集計クエリが毎回重くなったりする問題に直面します。一方で「非正規化でいいや」と安易に判断すると、データの更新異常や整合性の崩壊を招きます。