Docker はアプリをパッケージ化し、どこでも同じように実行できるようにします。イメージ、コンテナ、Compose、およびコンテナがオーバーヘッドに値する場合について理解する.

Docker は、ラップトップ、CI、クラウドで同じように実行できるようにアプリケーションをパッケージ化するためのプラットフォームです。尋ねるなら ドッカーとは何ですか, おそらく、コンテナー、イメージ、およびチームが tarball と祈りを配布する代わりにそれらを採用する理由についての簡潔な説明が必要です。.

 

Docker が解決する問題

初日のコードが間違っているためにソフトウェアが失敗することはほとんどありません。環境が異なるために失敗します: ライブラリのバージョンが異なる、システム パッケージが欠落している、ノードまたは Python のパッチ レベルが間違っている、またはシークレットが間違った構成ファイルに組み込まれている.

コンテナはバンドルすることで「自分のマシンで動作する」というギャップを修正します:

  • アプリケーションのバイナリまたはスクリプト
  • 実行時の依存関係
  • ファイルシステムのスナップショット
  • デフォルトの起動コマンド

ホスト オペレーティング システムは引き続きカーネルを提供しますが、各コンテナは独自の分離されたユーザースペースがあると認識します。.

コンテナと仮想マシンの比較

仮想マシンはハードウェアをエミュレートし、完全なゲスト OS を実行します。コンテナはホスト カーネルを共有し、プロセスを名前空間と cgroup で分離します。これにより、コンテナーの起動が軽くなり、同じハードウェアへの梱包が容易になります。.

  仮想マシン 容器
起動時間 分 数秒以内
フットプリント VMごとの完全なOS アプリ + ライブラリのみ
分離 強力なハードウェア境界 プロセスレベル (良好ではあるが、絶対的なものではない))
使用事例 マルチテナントのレガシー アプリ マイクロサービス、CI ジョブ、開発環境

Docker はワークフローを普及させました。 Kubernetes およびその他のオーケストレーターは、多数のコンテナーを大規模に実行します。.

この違いを理解すると、「Docker エクスペリエンス」と「Kubernetes エクスペリエンス」を求める求人投稿を読むときに役立ちます。 Docker スキルはイメージの構築に直接反映されます。オーケストレーション スキルは、フリート全体のスケジュール設定、ヘルス チェック、ローリング アップデートに重点を置いています。.

イメージ、コンテナ、レジストリ

すべての Docker 会話に 3 つの単語が表示されます:

  • 画像 — 読み取り専用テンプレート (Dockerfile またはビルド ツールを介してスタックされたレイヤー)).
  • 容器 — 実行中のイメージのインスタンス.
  • レジストリ — イメージ用のストレージ (Docker Hub、ECR、GHCR など).).

一般的な流れ:

  1. 書く Dockerfile イメージの構築方法の説明.
  2. 走る docker build ローカルイメージタグを作成するには.
  3. 走る docker run そのタグからコンテナを開始するには.
  4. イメージをレジストリにプッシュして、本番環境が同じビットを取得できるようにします。.

不変性は重要です。本番環境に SSH 接続して、適切なアップグレードを行わないでください。新しいイメージ バージョンを構築し、ロールアウトし、必要に応じてロールバックします。.

 

ノード API 用の最小限の Dockerfile

FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
ENV NODE_ENV=production
EXPOSE 3000
CMD ["node", "server.js"]

マルチステージ ビルドはさらに進化し、ビルダー イメージでコンパイルし、アーティファクトのみをスリム ランタイム イメージにコピーします。これにより、攻撃対象領域と画像サイズが削減されます.

レイヤ キャッシュにより再構築が高速化されます。ソース コードのコピーを頻繁に変更する前に、めったに変更しない命令 (依存関係のインストール) を配置します。ロックファイルが同じであれば、アプリを 1 行変更してもすべての npm パッケージを再インストールする必要はありません.

ネットワークとストレージの基本

デフォルトでは、コンテナーはプライベート ネットワークを取得します。ポートをマッピングするには -p 8080:3000 ローカルテスト用。オーケストレーターでは、サービスはハードコーディングされた IP ではなく DNS 名を通じて相互に検出します。.

アタッチしない限り、コンテナを削除するとコンテナ内のデータが消えます ボリューム またはバインドマウント。ステートレス アプリ コンテナと外部データベース(RDS、Cloud SQL)が依然として一般的なパターン.

ローカル開発の場合、ソース コードをコンテナにバインドマウントすると、本番で使用するのと同じ Linux 環境内でプロセスを実行しながら、ホスト上で編集できるようになります。 macOS および Windows のバインド マウントにおけるファイル パーミッションの異常に注意してください。ネイティブの実行と比較してホット リロードが遅く感じる可能性があります。.

Docker に価値がある場合

コンテナはこんなときに役立ちます:

  • 頻繁にデプロイし、再現可能なビルドが必要な場合.
  • 複数のサービスをローカルで一緒に実行する必要があります (API + ワーカー + Redis)).
  • CI パイプラインは、本番環境で実行されるものを正確にテストする必要があります.

これらは、カスタム ランタイムを持たない単一の静的サイトまたはマネージド関数を出荷する場合のオプションのオーバーヘッドです。流行のためのコンテナ化ではなく、環境の同等性によってコストよりも多くの時間を節約できる場合にコンテナ化します。.

プラットフォーム チームは、承認された CA バンドル、ロギング エージェント、および脆弱性スキャン ゲートを備えたゴールデン ベース イメージを提供することがあります。これらの塩基を消費することは、ランダムにコピーすることよりも優れています latest インターネットからのタグ.

重要なセキュリティ習慣

コンテナはデフォルトではサンドボックスエスケープではありませんが、構成ミスは問題を引き起こします:

  • イメージ内で非 root ユーザーとして実行します。.
  • 基本レイヤーの既知の CVE の画像をスキャンします.
  • ベースイメージのダイジェストを実稼働パイプラインに固定する.
  • 画像に秘密を入れないでください。実行時にボールトから注入する.
  • ホスト上のコンテナーの機能を制限する.

イメージをコンパイルされたバイナリのように扱います。イメージに署名し、バージョンを付け、運用レジストリにプッシュできるユーザーを制限します。.

公共画像に対するサプライチェーン攻撃が発生します。内部ミラーまたはベンダー検証済みのベースを優先し、重要な CVE が OpenSSL、glibc、または言語ランタイムに到達したときに再構築します。.

ローカル スタック用の Docker Compose

Compose ファイルは YAML で複数のサービス (Web、データベース、キュー ワーカー) を記述します。 docker compose up 開発環境全体を起動します。実稼働オーケストレーターではありませんが、オンボーディングを大幅に短縮します.

services:
  api:
    build: .
    ports: ["3000:3000"]
    environment:
      DATABASE_URL: postgres://db:5432/app
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: devonly

Compose にヘルスチェックを追加して、Postgres が接続を受け入れるまで依存サービスを待機させます。そうしないと、起動競合で API がクラッシュループします。.

CI/CD での Docker の操作

継続的統合では、開発者がローカルで使用するものと同じ Dockerfile を構築する必要があります。一般的なパイプラインのステップ:

  1. docker build git SHA タグを使用.
  2. イメージ内またはイメージに対して単体テストを実行します。 docker compose テストスタック.
  3. メインブランチのマージ時にレジストリにプッシュする.
  4. オーケストレーターまたは PaaS でイメージ タグを更新してデプロイします。.

CI 実行間でレジストリ層をキャッシュすると、ビルド時間が大幅に短縮されます。多くのチームはビルドキット キャッシュ エクスポーターまたは専用のリモート キャッシュを使用しています.

 

よくある誤解

“Docker が Kubernetes を置き換える.”
Docker はコンテナを構築して実行します。 Kubernetes はクラスター全体でそれらをスケジュールします。一方を他方なしで使用することもできますが、多くの場合一緒に表示されます。.

“コンテナは常に高速です.”
起動はすぐに始まりますが、イメージ設計が不十分であるため (巨大なレイヤー、root として実行、ヘルスチェックなし)、依然としてデプロイが遅くなります。.

“リポジトリごとに 1 つのコンテナが必須です.”
多くのリポジトリは複数のイメージ (API とワーカー) を同梱します。フォルダー数ではなく、スケーリングのニーズに境界を合わせる.