前回はDockerの3大要素(Dockerfile・Image・Container)とライフサイクル、そしてC#オブジェクト指向との対比を学びました。
第5回目の本日は、モダン開発体制の核心である「インフラのコード化(Infrastructure as Code = IaC)」の第一歩として、DockerfileをGitリポジトリで管理・コミット・レビューする実践運用を徹底解説します!
① 導入・本日の達成目標
「サーバーの設定変更は、手順書(Excel/Word)を作って印刷し、管理者のハンコをもらって手動で実施する」
長年エンタープライズの現場で堅牢なシステムを支えてきたベテランエンジニアほど、これが「最も確実な運用」だと信じてきたはずです。
しかし、クラウドとコンテナが標準となった現代において、手動設定とドキュメント管理は「属人化」「設定漏れ」「環境ドリフト」の温床となっています。
本講義では、インフラ構成を「コード」としてGitリポジトリに同居させることで得られる劇的な開発効率と信頼性をマスターします。
- 手動サーバー設定 vs IaC(インフラのコード化)の根本的な違いとメリットを理解する。
- C#ソリューション(
.sln)と同じリポジトリにDockerfileを同居させる理想的なディレクトリ構成を学ぶ。 - プルリクエスト(PR)を通じたインフラレビューとチーム開発への3大恩恵(追跡・再現・即時巻き戻し)を習得する。
② 手動設定・Excel手順書からの脱却:なぜインフラをコード化するのか?
物理サーバーや従来の仮想マシン(VM)の時代は、サーバーの構築やミドルウェアのアップデートを行う際、以下のような手順を踏んでいました。
- 誰かが変更手順書(ExcelやWord)を作成する。
- サーバーにリモートデスクトップ(RDP)やSSHでログインする。
- GUIのウィザードをクリックしたり、コマンドを手動で打ち込んで設定を変更する。
- 手順書に実行日時と担当者印を記入して保管する。
一見几帳面に見えるこの運用には、構造的な3大欠陥が存在します。
緊急対応やちょっとしたパラメータ修正が手順書に反映されず、「手順書通りに構築しても動かないサーバー」が完成してしまう。
「あのサーバーの設定はベテランの〇〇さんしか分からない」「どこを弄ったか誰も思い出せない」というリスクが常に付きまとう。
設定変更で不具合が起きた際、「元の状態にどうやって戻すか」の手順が確立されておらず、手戻り復旧に何時間も要する。
DockerとIaC(Infrastructure as Code)は、この問題を「設定手順をすべてテキストファイル(Dockerfile)に書き、Gitコミットで管理する」ことで完全に解決します。
③ C#ソリューション(.sln)とDockerfileの理想的な同居リポジトリ構成
C#/.NETプロジェクトにおいて、インフラ定義をどこに配置するべきでしょうか?
現代のベストプラクティスは、「C#のソリューションファイル(.sln)と同じGitリポジトリのルートにDockerfileを配置する」ことです。
以下に、実務で標準的に用いられる典型的なディレクトリツリーを示します。
MyCompany.OrderSystem/ # Gitリポジトリのルート ├── MyCompany.OrderSystem.sln # C# ソリューションファイル ├── Dockerfile # ★ インフラ設計図(Git管理) ├── .dockerignore # ★ ビルド除外設定(Git管理) ├── .gitignore # Git除外設定 ├── README.md # プロジェクト説明書 └── src/ ├── MyCompany.OrderSystem.WebApi/ # ASP.NET Core 8 Web API │ ├── Controllers/ │ ├── Program.cs │ ├── appsettings.json │ └── MyCompany.OrderSystem.WebApi.csproj └── MyCompany.OrderSystem.Core/ # ドメインロジック / クラスライブラリ └── MyCompany.OrderSystem.Core.csproj
このようにアプリケーションコードとインフラ定義を同じリポジトリに同居させることで、「.NET 8から.NET 9へのSDKバージョンアップ」や「新しいLinuxライブラリ(libgdiplusなど)の追加」を、C#コードの変更と全く同一のGitコミットとして記録できます。
④ プルリクエスト(PR)によるインフラ変更レビューとCI連携
インフラがコード化されたことで得られる最大の革命は、「インフラの変更をプルリクエスト(Pull Request = PR)でチーム全員が査読できるようになったこと」です。
PR運用がもたらす3つの進化
- ① 変更差分(diff)の可視化: 「どの行が追加・削除されたか」が緑と赤のハイライトで一目瞭然。不要なパッケージの混入や設定ミスを事前に検知できます。
- ② レビューコメントによるナレッジ共有: 「なぜこのパッケージが必要なのか?」「マルチステージビルドの順序が最適か?」といった議論がPRのコメントログとして永遠に残ります。
- ③ CI(GitHub Actions等)による自動ビルド検証: PRが作成された瞬間に自動で
docker buildが走り、ビルドエラーのある壊れた設定がmainブランチに混入するのを100%水際で阻止します。
⑤ IaCがもたらすチーム開発の3大恩恵
インフラをGit管理に移行すると、開発チーム全体の開発生産性と心理的安全性が劇的に向上します。
| 3大恩恵 | 従来の現場(手動・手順書) | IaC+Dockerの現場 |
|---|---|---|
| ① 履歴の完全追跡 | 「いつ誰がこのライブラリを入れたか」誰も知らず放置される | git blame でコミット理由・PR・担当者が1秒で判明 |
| ② 環境の100%再現 | 新人の環境構築に2日〜3日かかり、先輩が付きっきり | git clone & docker run で初日から1分で稼働 |
| ③ 即座の巻き戻し | 環境障害時、手動で戻そうとして二次障害・パニック発生 | git revert を叩くだけで前回の正常状態へ瞬時復旧 |
⑥ C# / .NET 現場での実践アプローチ
明日からチームで導入できる実務標準ファイルと、Git運用コマンドセットを確認しましょう。
[A] 実務必須:.dockerignore の標準設定例
Dockerfileと同じ場所に .dockerignore を置くことで、ホストPC上の重い不要ファイル(ビルド成果物やGit管理情報)がコンテナビルドコンテキストに転送されるのを防ぎ、ビルドを爆速化します。
# .dockerignore の実務標準テンプレート
**/.git
**/.vs
**/.vscode
**/bin
**/obj
**/*.user
**/*.suo
**/node_modules
Dockerfile*
README*
*.md
[B] インフラ変更時のGitワークフロー(PowerShell)
# 1. 最新のmainから作業用ブランチを作成 git checkout main git pull origin main git checkout -b feature/update-dotnet-sdk-8.0.400 # 2. Dockerfile をエディタで編集(例: .NET SDKのマイナー更新) # 3. ローカルでビルドが通るか事前検証 docker build -t order-api:test . # 4. 変更をステージングしてコミット(意図を明確に記録) git add Dockerfile .dockerignore git commit -m "build(docker): .NET 8.0 SDKベースイメージをセキュリティパッチ適用版へ更新" # 5. リモートへプッシュしてPRを作成 git push origin feature/update-dotnet-sdk-8.0.400
[C] 4大AIエージェントへの指示プロンプト例
「このC#ソリューションのルートに配置する本番運用向けの .dockerignore ファイルを作成してください。bin, obj, .vs などの不要なキャッシュやローカル設定ファイルがDockerビルドコンテキストに含まれないよう網羅的に指定してください。」
「稼働中のコンテナに入って手動で apt install / 設定変更してしまう罠」
物理サーバーの癖で、コンテナが動いた後に docker exec -it container_name /bin/bash でコンテナ内に入り、手動でパッケージをインストールしたり設定ファイルを直接書き換えてしまう人がいます。
これは「コード化されたインフラの破壊」であり、コンテナを再起動・再生成した瞬間に手動変更はすべて消滅します。
「変更は必ずDockerfileに記述し、Gitコミットを経て再ビルドする」という原則を徹底しましょう!
- IaCの真髄: 手順書ではなく「Dockerfile」というコードでインフラを宣言し、Gitで全履歴を管理する。
- リポジトリ同居:
.slnと同じルートにDockerfileと.dockerignoreを置き、アプリと環境を同時コミットする。 - PRレビュー運用: インフラ変更もコードレビューを通し、差分確認とCI自動検証を行う。
- チーム開発の恩恵: 誰が変更したかの完全追跡、新メンバーの即日稼働、障害時の瞬時巻き戻し(
git revert)を実現。
『Dockerfileの基本構文(FROM / WORKDIR / COPY / RUN / CMD / ENTRYPOINT)』〜C#ビルドに必須の6大命令を完全マスター〜
コメント
コメントを投稿