スキップしてメイン コンテンツに移動

【Day 01】Dockerとは何か? 〜C#エンジニアのためのコンテナ超入門〜

Day 01 アイキャッチ
▲ Day 01: 仮想マシンからDockerコンテナへのパラダイムシフト
🐳
皆さん、こんにちは! Docker/コンテナ実践講座の専任講師です。
ITエンジニアとして30年以上のキャリアを築き、物理サーバーのラッキング、Hyper-VやVMwareによる仮想化、IISやSQL Serverの手動セットアップを完璧にこなしてきたベテランの皆さん、心より歓迎いたします!
本日は記念すべき第1回として、「Dockerコンテナとは何なのか?」そして「なぜGitリポジトリと一緒に使うと開発環境革命が起きるのか」を、C#/.NET開発の現場視点から徹底解剖します!

① 導入・本日の達成目標

「Dockerという言葉は聞くけれど、要するに軽いVMware(仮想マシン)でしょ?」
長年サーバーやインフラを扱ってきたベテランエンジニアほど、最初にそう誤解してしまいがちです。しかし、Dockerの内部構造と設計思想は、従来の仮想マシンとは根本から180度異なります。

本日の講義を終える頃には、以下の3つの目標を完全にクリアできるようになります。

  • 仮想マシン(VM)とコンテナ(Docker)のアーキテクチャ上の決定的差異を完全論理理解する。
  • なぜGitリポジトリにDockerfileを同居させるのか?(環境のコード化:IaC)の絶大なメリットを掴む。
  • Dockerを理解するための「3大要素(Dockerfile / Image / Container)」のライフサイクルをC#の概念と紐付けてマスターする。

② VM / 物理サーバー技術者のためのパラダイムシフト

長年私たちが親しんできた仮想マシン(Hyper-V / VMware / VirtualBox)は、「ハードウェアそのものを仮想化」する技術です。 ホストOSの上にハイパーバイザーを載せ、その上でWindows ServerやLinuxの「ゲストOS」を丸ごと1台分ブートさせます。

仮想マシンVMの構造
▲ 【図解①】従来の仮想マシン(Hyper-V / VMware)の重厚なスタック構造

この方式は完全なOSレベルの独立性を持つ反面、以下のような重厚長大さ(オーバーヘッド)を抱えていました。

  • 起動が遅い: ゲストOSの起動シーケンスが走るため、立ち上がりに1分〜数分かかる。
  • サイズが巨大: OS丸ごとの仮想ディスク(VHDX/VMDK)は平気で20GB〜50GBに達し、Gitでの管理や配布が不可能。
  • リソース浪費: アプリが動いていなくても、ゲストOSだけで数GBのメモリを固定占有する。

そこで誕生したのが、現代の標準技術であるDocker(コンテナ型仮想化)です。

Dockerコンテナの構造
▲ 【図解②】Dockerコンテナの革新的なプロセス分離(OSカーネル共有)

Dockerには「ゲストOS」が存在しません。 ホストOSのLinuxカーネル(WindowsではWSL2)をすべてのコンテナで共有し、Linuxカーネルの標準機能である「Namespace(名前空間分離)」と「cgroups(リソース制限)」を使って、プロセス単位で安全に隔離壁を作ります。

📊 仮想マシン(VM)とDockerコンテナの完全対比表

比較項目 従来の仮想マシン (Hyper-V / VMware) Docker コンテナ
仮想化の対象 ハードウェア(OS丸ごと仮想化) OSカーネル共有(プロセス分離)
起動時間 数分(OSのブートが必要) わずか 1〜2 秒(即時起動)
イメージサイズ 数GB 〜 数十GB 数十MB 〜 数百MB
Git管理の可否 ❌ 不可能(巨大バイナリ) ⭕ 完全対応(Dockerfileをテキスト管理)
開発環境の再現性 手順書による手動構築(ミス多発) 100% 同一再現(誰のPCでも動く)

③ なぜGitリポジトリにDockerfileを同居させるのか?(IaCの第一歩)

Dockerが現場で爆発的に普及した最大の理由は、「インフラのコード化(Infrastructure as Code: IaC)」がGitと完璧に噛み合ったからです。

GitとDockerの連携
▲ 【図解③】Gitリポジトリと同居するインフラのコード化(IaC)サイクル

従来は「Excelの環境構築手順書」を見ながら、SQL Serverをインストールし、接続文字列を設定し、IISを構成していました。 しかし手順書はすぐに陳腐化し、「私のPCでは動くのに、新人のPCでは動かない」という不毛なトラブルが日常茶飯事でした。

Dockerでは、サーバー構成をすべて Dockerfile や docker-compose.yml というただのテキストファイルに記述します。 これをC#のソースコードと一緒にGitリポジトリにコミットしておくことで、以下の劇的な効果が生まれます。

  • オンボーディングが3分で完了: 新メンバーは git clone して docker compose up を叩くだけで、DBもキャッシュもWeb APIもすべて立ち上がる。
  • インフラの変更もプルリクエストでレビュー: 「DBのバージョンを上げた」「ライブラリを追加した」という変更差分がGitコミット履歴として明確に残る。
  • 過去の環境へいつでもタイムトラベル: 1年前のGitコミットにチェックアウトすれば、当時の実行環境ごと寸分違わずに再現可能。

④ Dockerの3大要素(Dockerfile / Image / Container)

Dockerを操作する上で絶対に覚えておきたいのが、以下の3大要素です。

Dockerの3大要素
▲ 【図解④】Dockerfile・Image・Containerの3大要素とライフサイクル

C#エンジニアの皆さんにとって最も直感的なのは、「オブジェクト指向プログラミングのクラスとインスタンス」に対応させることです。

【C#との直感対比】
・Dockerfile = C#のソースコード(.cs ファイル / クラスの設計図)
・Docker Image = コンパイルされたアセンブリ(.dll / 配布可能な金型)
・Docker Container = メモリ上にインスタンス化された実体(new MyService() で動くプロセス)

⑤ C# / .NET 現場での実践アプローチ

それでは、C#プロジェクトにおける超シンプルな Dockerfile の実例を見てみましょう。

[A] C# Web API の最小 Dockerfile

# 1. 実行用ベースイメージ(Microsoft公式の軽量.NET 8ランタイム)
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 8080

# 2. ビルド用ステージ(SDKイメージでコンパイル)
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MyWebApi.csproj", "./"]
RUN dotnet restore "MyWebApi.csproj"
COPY . .
RUN dotnet publish "MyWebApi.csproj" -c Release -o /app/publish

# 3. 最終成果物を軽量実行環境へ配置
FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyWebApi.dll"]

[B] 基本コマンド(PowerShell)

# 1. Dockerイメージをビルド(-t で名前とタグを付与)
docker build -t mywebapi:v1 .

# 2. コンテナを起動(ホストの8080ポートをコンテナの8080ポートへ接続)
docker run -d -p 8080:8080 --name web_app mywebapi:v1

# 3. 稼働中のコンテナ一覧を確認
docker ps

# 4. ログを確認
docker logs -f web_app

# 5. コンテナを停止して削除
docker stop web_app
docker rm web_app

[C] 4大AIエージェントへの指示プロンプト例

🤖 Antigravity / Claude Code への指示プロンプト:

「このC# Web APIソリューション(.NET 8)に対して、本番運用に最適なマルチステージビルドのDockerfileと、.dockerignoreを自動生成してください。また、ローカルでSQL Serverと一緒に起動するためのdocker-compose.ymlも作成してGitブランチ feature/docker-setup にコミットしてください。」

⚠️ 30年選手がハマりやすい現場の落とし穴

「コンテナの中にデータを保存してしまい、再起動でデータが消滅する事故」
従来のVMではOSのCドライブに保存したファイルはずっと残りましたが、Dockerコンテナは「使い捨て(エフェメラル)」が鉄則です。 DBのデータファイル(.mdf)やアップロード画像は、必ず「ボリューム(Volume)」と呼ばれるホスト領域にマウントして永続化する必要があります(第6部で詳しく解説します!)。

📌 本日のまとめ & 明日へのステップ
  • VMはOS丸ごと仮想化(重い)、Dockerはプロセス分離(秒速・超軽量)。
  • DockerfileをGit管理することで、チーム全員が1秒で同一開発環境を再現できる(IaC)。
  • Dockerfile(設計図) ➡ Image(金型) ➡ Container(実体)のライフサイクルを押さえる。
次回【Day 02】予告:
『物理サーバー・Hyper-V・VMware経験者のための「プロセス分離」パラダイムシフト』〜Linuxカーネル共有とNamespaceの正体を徹底解剖〜

コメント

このブログの人気の投稿

【Perfume】Perfume 3rd Tour 「JPN」さいたまスーパーアリーナに行って参りました~

Perfume 3rd Tour 「JPN」1月28日、29日の2daysで参戦して参りました。 ファンクラブ会員の選考抽選会に28日、29日の両日で申し込んでいたんですが、両方とも当選していたという嬉しい誤算。 仕事だぁ、なんだかんだと紆余曲折ありまして28日の参戦は危ぶまれていたのですが、なんとかかんとか28日は40分遅刻しながらも参戦、29日はフル参戦する事が出来ました(∩´∀`)∩

Perfume、2025年末で“コールドスリープ(活動休止)”へ──東京ドーム2daysの記録と、公式・各界・ファンの声

  1) 公式発表・基本情報 活動休止(コールドスリープ)を正式発表 2025年9月21日、公式サイト「 Perfumeより 」で、2026年から一度コールドスリープに入ると発表。再始動の意思(“新しいPerfume”として戻る)も明記。 Perfume Official Site 今後の運用告知(配信・上映など) 同21日付の「 今後のPerfumeに関して 」で、9/23(火・祝)東京ドーム公演の LIVESHIP全世界生配信 および 全国ディレイビューイング 決定を案内。特設サイトも併記。 Perfume Official Site +1 公式グッズ **「Perfume Calendar 2026」**発売決定(B2壁掛け/表紙+2カ月1枚×6枚+ポスター)。テーマは“フルーツ”。 Perfume Official Site 2) 東京ドーム2days(9/22・23)要点 公演タイトル: ZO/Z5 Anniversary “ネビュラロマンス” Episode TOKYO DOME 。日程・開場/開演・会場・物販等の実務情報は特設で公開。 Perfume Official Site 9/23公演を世界配信(LIVESHIP) /ディレイビューイング実施。 Perfume Official Site 海外向け報道(英語)も「 indefinite hiatus 」として広く配信。 The Times of India 国内英字メディアも速報。 朝日新聞 3) 現地レポ( メリ爺 )から見える空気 あなたの現地記録(9/24公開)を、ファクトと現場情景の両面で反映: 両日参戦 。22日は アリーナ 、23日は 1階席から俯瞰 。前日の発表を受け、開演前のザワつき→MC後に“いつもの一体感”へ。開演は22日 18:45 頃。オープニングは**P³ツアー東京ドーム(2020/2)**と同趣向で“回収”の演出。 メリ爺のゲーム万歳 MC所感 :解散ではなく前向きな休止で不安を和らげる内容。 かしゆか の涙、 のっち の気丈さ、 あ〜ちゃん の思い出語り──3人の結束と「 また戻る 」約束が強く刻まれた。 メリ爺のゲーム万歳 体感時間 : “3時間弱”級のボリューム ながら“過去一...

ニンテンドースイッチでオンラインゲームを遊ぶには?

モンスターハンターライズが発売になって、家族でモンハン楽しみたい人が増えたみたいですね。 某ブログの検索キーワードを調べると、モンハンを家族でやるにはどうしたらいいのか?を調べている人が沢山いるのがわかります。 ※これでも一部  家族で協力するにはSwitch2台、ソフトも2つ購入する必要があります。 1台のスイッチでは遊べませんし、ソフト1つでも遊べません。 でも、1台のスイッチで別々アカウントがあれば交代で遊ぶこともできますよ。セーブデータもしっかり分かれます。 Switchのオンラインゲームを家族で遊ぶ方法については以下の記事にまとめてますのでよろしければ参考にしてみてくださいね。 家族でモンスターハンターライズDL版のオンラインプレーを楽しむ方法