Docker

開発ツール | IT用語集

この用語をシェア

概要

Dockerは、コンテナ技術を使用したアプリケーション実行環境の仮想化ツールです。アプリケーションとその依存関係を軽量で可搬性の高いコンテナにパッケージ化し、どこでも同じ環境で実行できるようにします。

仕組み・技術的な詳細

基本概念

  • コンテナ: アプリケーションと依存関係を含む軽量な実行環境
  • イメージ: コンテナの雛形となるテンプレート。読み取り専用の階層(レイヤー)を重ねて構成される
  • Dockerfile: イメージを構築するための設定ファイル
  • レジストリ: イメージを保存・共有する場所(Docker Hub等)
  • ボリューム: コンテナの外部にデータを永続化する仕組み

コンテナが軽量である理由

従来の仮想マシン(VM)はハードウェアを丸ごとエミュレートし、ゲストOS自体を1台ずつ起動するためリソース消費が大きくなります。一方Dockerのコンテナは、Linuxカーネルの「namespace(名前空間)」と「cgroups(リソース制御機能)」という機能を利用して、ホストOSのカーネルを共有しながらプロセス単位でアプリケーションを隔離します。ゲストOSを別途起動する必要がないため、起動時間が数秒程度と高速で、1台のホスト上に多数のコンテナを効率よく同居させることができます。イメージ自体もレイヤー構造になっており、共通する部分(ベースイメージ等)を複数のコンテナで共有できるため、ディスク使用量も抑えられます。

具体例

基本的なDockerコマンド

# イメージの操作
docker images           # イメージ一覧
docker pull nginx       # イメージをダウンロード
docker build -t myapp . # Dockerfileからイメージを構築

# コンテナの操作
docker run -p 8080:80 nginx    # コンテナを実行
docker ps                      # 実行中のコンテナ一覧
docker stop コンテナID          # コンテナを停止
docker rm コンテナID            # コンテナを削除

# 便利なコマンド
docker exec -it コンテナID bash  # コンテナ内でbashを実行
docker logs コンテナID          # コンテナのログを表示

Dockerfileの例

# Node.js アプリケーション
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

Docker Composeの例

# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      - NODE_ENV=production
      
  db:
    image: postgres:13
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

メリット・デメリット

メリット

  • 環境の一貫性: 開発、テスト、本番環境で同じ実行環境
  • 軽量性: 仮想マシンより軽量で高速
  • 可搬性: どこでも同じように動作
  • スケーラビリティ: 必要に応じて簡単にスケールアウト
  • 効率的なリソース利用: ホストOSのリソースを効率的に使用

デメリット

  • 学習コスト: イメージ・レイヤー・ネットワーク・ボリュームなど独自概念の理解が必要
  • ホストOSへの依存: Linuxカーネルの機能を利用するため、Windows/Macでは軽量仮想マシン経由での実行となり、ネイティブLinuxほどの性能は出にくい
  • セキュリティ管理の複雑化: イメージの脆弱性管理や、コンテナ間のネットワーク設定など運用面の考慮が増える
  • 永続化データの管理: コンテナ自体は使い捨てが前提のため、データベース等の永続データはボリューム設計を誤ると消失するリスクがある

類似用語・競合製品との違い

アプリケーションを隔離実行する仕組みとして比較されることが多い「仮想マシン(VM)」「Podman」との違いを以下にまとめます。

項目Docker(コンテナ)仮想マシン(VM)Podman
隔離の単位プロセス(OSカーネルを共有)ハードウェア全体(ゲストOSごと)プロセス(Dockerとほぼ同様)
起動速度数秒程度と高速数十秒〜数分数秒程度と高速
アーキテクチャ常駐デーモン(dockerd)が管理ハイパーバイザーが管理デーモンレス(root権限不要で実行可)
主な用途アプリケーションのパッケージ化・移植OS環境ごとの完全な隔離が必要な場合Dockerと高い互換性を持つセキュア志向の代替

DockerとPodmanはコマンド体系に高い互換性があり、多くの場合`docker`コマンドを`podman`に置き換えるだけで動作します。一方、仮想マシンはOS自体を丸ごと分離するため、Dockerよりも強い隔離性を持ちますが、リソース消費量や起動時間の面でコンテナに劣ります。

実務での活用シーン・導入時の注意点

Dockerは、開発環境の統一(「自分のPCでは動くのに本番で動かない」問題の解消)、マイクロサービスアーキテクチャにおける各サービスの独立したデプロイ、CI/CDパイプラインでのビルド・テスト環境の再現、クラウド環境(AWS ECS/EKS、Google Cloud Run等)へのアプリケーションデプロイなど、幅広い場面で活用されています。特にGitHub ActionsやJenkinsなどのCI/CDツールと組み合わせることで、コードの変更からテスト、デプロイまでの一連のプロセスを自動化しやすくなります。

導入時の注意点として、イメージサイズを小さく保つこと(不要なパッケージを含めない、マルチステージビルドを活用する等)がビルド時間とセキュリティの両面で重要です。また、公式イメージや信頼できるレジストリからのみイメージを取得し、定期的な脆弱性スキャンを行うこと、本番環境ではコンテナの再起動やスケーリングを手動で管理するのではなくKubernetesなどのオーケストレーションツールと組み合わせて運用することが推奨されます。データベースなど状態を持つサービスをコンテナ化する場合は、ボリュームの設計とバックアップ体制を事前に検討しておく必要があります。

関連用語

  • Kubernetes - 複数のコンテナを運用管理するオーケストレーションツール
  • CI/CD - Dockerを活用した継続的インテグレーション・デリバリーの仕組み
  • Git - Dockerfileやコードのバージョン管理に使われる分散型バージョン管理システム
  • GitHub Actions - Dockerイメージのビルド・テストを自動化するCI/CDサービス
  • CLI - Dockerコマンドを操作するコマンドラインインターフェース

参考リンク

この用語についてもっと詳しく

Dockerに関するご質問や、システム導入のご相談など、お気軽にお問い合わせください。

よくある質問(FAQ)

Q. Dockerとは何ですか

Dockerはコンテナ技術を使用したアプリケーション実行環境の仮想化ツールで、アプリケーションとその依存関係を軽量で可搬性の高いコンテナにパッケージ化します。「開発環境では動くが本番では動かない」という問題を解消する目的で広く採用されています。

Q. Dockerと仮想マシン(VM)はどう違いますか

VMはハードウェアごとゲストOSをエミュレートするのに対し、DockerコンテナはホストOSのカーネルを共有してプロセス単位で隔離します。そのためDockerの方が起動が速く、リソース消費も少なく済みます。

Q. DockerとKubernetesの関係は何ですか

Dockerは個々のコンテナを作成・実行する技術であり、Kubernetesは多数のコンテナを複数サーバー上で自動的にデプロイ・スケーリング・障害復旧させるオーケストレーションツールです。小規模な用途ではDocker単体やDocker Composeで十分ですが、本番の大規模運用ではKubernetesと組み合わせるのが一般的です。

Q. Dockerは無料で使えますか

Docker Engine自体はオープンソースで無料利用できます。ただしDesktop版のDocker Desktopは、大企業(従業員251名以上など一定規模を超える組織)での商用利用には有料サブスクリプションが必要です。個人利用や小規模事業者は無料の範囲で利用できます。

Q. Docker導入時に気をつけることは何ですか

イメージサイズを小さく保つこと、信頼できるレジストリからのみイメージを取得すること、永続化が必要なデータはボリュームで管理することが重要です。本番運用では脆弱性スキャンやKubernetesなどによる運用自動化も検討する必要があります。