Dockerコンテナの使い方完全ガイド|インストールから基本操作・実践活用まで初心者でもわかる手順

未分類

「Dockerという言葉を聞くけれど、何ができるのかよくわからない」「コンテナ技術を学びたいが、どこから始めればよいかわからない」——エンジニアを目指す人や、開発環境を整えたいと思っている人がこうした悩みを持つのは自然なことです。Dockerは現代のソフトウェア開発において欠かせないツールになりました。アプリケーションを「コンテナ」という軽量な仮想環境にパッケージ化し、どの環境でも同じように動作させることができます。この記事では、Dockerコンテナの基本的な概念から始め、インストール方法、基本コマンド、実際の開発での活用方法まで、ステップバイステップで丁寧に解説します。

1. Dockerコンテナとは何か——仮想マシンとの違いと仕組み

Dockerコンテナを理解するには、まず「コンテナ技術」の概念を押さえることが大切です。コンテナとは、アプリケーションとその実行に必要なすべてのもの(ライブラリ・設定ファイル・依存関係など)をひとまとめにしたパッケージです。

仮想マシン(VM)との違い
仮想マシンは、物理サーバー上にゲストOSを完全にインストールして動作させるため、起動が遅く、リソース消費も大きいです。一方、Dockerコンテナはホストマシンのカーネルを共有するため、オーバーヘッドが少なく、秒単位で起動します。

  • 仮想マシン:OS全体を仮想化。大きい・重い・起動が遅い
  • コンテナ:アプリと依存関係のみを分離。軽い・速い・効率的

Dockerの主要コンポーネント

  • Dockerイメージ:コンテナの設計図。読み取り専用のテンプレート
  • Dockerコンテナ:イメージから作られた実行中のインスタンス
  • Docker Hub:公式のイメージレジストリ。様々な公式・コミュニティイメージが公開されている
  • Dockerfile:イメージを作るための設定ファイル

2. Dockerのインストール方法——Windows・Mac・Linuxそれぞれの手順

Dockerを使い始めるための最初のステップは、Docker Desktopのインストールです。公式サイト(docker.com)からOSに合ったインストーラーをダウンロードします。

Windows(Windows 10/11 Pro・Enterprise・Education)

  1. Docker公式サイトからDocker Desktop for Windowsをダウンロード
  2. インストーラーを実行し、画面の指示に従ってインストール
  3. インストール後にPCを再起動
  4. Docker Desktopを起動し、タスクバーにDockerアイコンが表示されることを確認
  5. コマンドプロンプトまたはPowerShellで「docker –version」を実行して確認

macOS

  1. Docker公式サイトからDocker Desktop for Macをダウンロード(M1/M2チップの場合はApple Silicon版を選択)
  2. ダウンロードした.dmgファイルを開き、Docker.appをApplicationsフォルダにドラッグ
  3. Docker.appを起動し、メニューバーにDockerクジラアイコンが表示されることを確認
  4. ターミナルで「docker –version」を実行して確認

Linux(Ubuntu)の場合のコマンド

sudo apt-get update
sudo apt-get install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER

インストールが完了したら「docker run hello-world」を実行してみましょう。「Hello from Docker!」というメッセージが表示されれば成功です。

3. 基本コマンド入門——まずこれだけ覚えれば使える10コマンド

Dockerを使う上で必須の基本コマンドを紹介します。

イメージ関連のコマンド

  • docker pull [イメージ名]:Docker Hubからイメージをダウンロード
  • docker images:ローカルにあるイメージの一覧を表示
  • docker rmi [イメージID]:イメージを削除

コンテナ関連のコマンド

  • docker run [イメージ名]:イメージからコンテナを作成・起動
  • docker run -it [イメージ名] bash:インタラクティブモードでコンテナを起動し、bashシェルに接続
  • docker run -d -p 8080:80 [イメージ名]:バックグラウンドで起動し、ホストの8080番をコンテナの80番ポートにマッピング
  • docker ps:実行中のコンテナ一覧を表示
  • docker ps -a:停止中も含めすべてのコンテナを表示
  • docker stop [コンテナID]:コンテナを停止
  • docker rm [コンテナID]:コンテナを削除

よく使うオプション

  • -d:デタッチドモード(バックグラウンド実行)
  • -p ホスト:コンテナ:ポートのマッピング
  • -v ホストのパス:コンテナのパス:ボリュームマウント(ファイル共有)
  • --name [名前]:コンテナに名前をつける
  • -e KEY=VALUE:環境変数の設定

4. Dockerfileの書き方——自分だけのイメージを作成する

Dockerfileは、カスタムイメージを作成するための設計書です。どんなベースイメージを使い、どんなファイルをコピーし、どんなコマンドを実行するかを記述します。

基本的なDockerfileの構造(Node.jsアプリの例)

# ベースイメージを指定
FROM node:18-alpine

# 作業ディレクトリを設定
WORKDIR /app

# 依存関係ファイルをコピー
COPY package*.json ./

# 依存関係をインストール
RUN npm install

# アプリケーションコードをコピー
COPY . .

# ポートを公開
EXPOSE 3000

# コンテナ起動時のコマンド
CMD ["node", "server.js"]

主要なDockerfile命令

  • FROM:ベースとなるイメージを指定(必須)
  • WORKDIR:作業ディレクトリを設定
  • COPY:ホストからコンテナへファイルをコピー
  • RUN:イメージ構築時にコマンドを実行
  • ENV:環境変数を設定
  • EXPOSE:コンテナが使用するポートを宣言
  • CMD:コンテナ起動時のデフォルトコマンドを指定

Dockerfileを作成したら「docker build -t my-app:latest .」でイメージをビルドします。「-t」オプションでイメージ名とタグを指定できます。

5. Docker Composeの使い方——複数コンテナを一括管理する

実際の開発では、Webアプリケーション・データベース・キャッシュサーバーなど、複数のコンテナを連携させることが一般的です。Docker Composeを使うと、これらを一つのファイル(docker-compose.yml)で定義・管理できます。

docker-compose.ymlの基本構造

version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
    depends_on:
      - db
  db:
    image: postgres:15
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
volumes:
  postgres_data:

Docker Composeの主要コマンド

  • docker compose up:すべてのサービスを起動
  • docker compose up -d:バックグラウンドで起動
  • docker compose down:すべてのサービスを停止・削除
  • docker compose logs -f [サービス名]:ログをリアルタイムで確認
  • docker compose exec [サービス名] bash:実行中のコンテナにアクセス

6. ボリュームとネットワーク——データの永続化とコンテナ間通信

Dockerコンテナはステートレスな性質を持ちます。コンテナを削除するとデータも消えてしまいます。データを永続化するにはボリュームを使います。

ボリュームの種類

  • 名前付きボリューム:Dockerが管理するボリューム。データの永続化に最適
    docker volume create my-volume
    docker run -v my-volume:/data nginx
  • バインドマウント:ホストのディレクトリをコンテナにマウント。開発時のコード共有に便利
    docker run -v /ホストのパス:/コンテナのパス nginx

ネットワーク
Dockerネットワークを使うとコンテナ間で通信できます。Docker Composeで同じcomposeファイル内のサービスは自動的に同じネットワークに参加し、サービス名でアクセスできます(例:データベースサービス名が「db」なら、接続先として「db:5432」と指定)。

  • docker network create my-network:ネットワーク作成
  • docker network ls:ネットワーク一覧表示
  • docker run --network my-network [イメージ名]:ネットワークを指定してコンテナ起動

7. よくあるエラーとトラブルシューティング——困ったときの対処法

Dockerを使っていると、よく遭遇するエラーがあります。代表的なものと対処法を紹介します。

「Cannot connect to the Docker daemon」
DockerデーモンまたはDocker Desktopが起動していない場合に表示されます。Docker Desktopを起動するか、Linux環境では「sudo systemctl start docker」で解決します。

「Port is already allocated」
指定したポートが既に使われている場合のエラーです。「-p 8081:80」のように別のホストポートを指定するか、既存プロセスを終了させましょう。

「No space left on device」
Dockerのディスク使用量が増えすぎた場合です。「docker system prune -a」で未使用のイメージ・コンテナ・ネットワーク・ボリュームを一括削除できます(使用中のものは削除されません)。

「Permission denied」
Linux環境でdockerコマンドをsudoなしで実行しようとした場合。「sudo usermod -aG docker $USER」でユーザーをdockerグループに追加し、ログアウト・ログインで解決します。

コンテナが起動しない・すぐに終了する
「docker logs [コンテナID]」でログを確認しましょう。CMD命令の誤り・依存サービスが起動していない・環境変数の設定ミスが主な原因です。

8. 開発現場での実践的な使い方——チーム開発を効率化する活用例

Dockerが真価を発揮するのはチーム開発の場面です。「私の環境では動くのに」という問題を解消し、誰でも同じ環境を即座に再現できます。

ローカル開発環境の統一
チームメンバー全員が同じdocker-compose.ymlを使うことで、PythonやNode.jsのバージョン差異、データベースの設定違いによるトラブルが解消されます。新メンバーのオンボーディングも「git clone」して「docker compose up」するだけで完了します。

CI/CDパイプラインでの活用
GitHub ActionsやGitLab CIでDockerコンテナを使うことで、テスト環境の再現性が高まります。本番環境と同じイメージでテストを行い、そのイメージをそのままデプロイすることで、環境差異による不具合を防げます。

マイクロサービスアーキテクチャ
各サービスを独立したコンテナとして動かすことで、サービスごとに異なる言語・フレームワークを使えます。スケールも容易で、問題のあるコンテナだけを再起動できます。

9. セキュリティのベストプラクティス——安全なDocker運用のために

Dockerを本番環境で使う場合、セキュリティには特に注意が必要です。

基本的なセキュリティ対策

  • 公式イメージを使う:Docker Hubの公式イメージは脆弱性スキャンされています。知らないソースのイメージは使用を避けましょう
  • rootユーザーで実行しない:Dockerfileに「USER appuser」を追加して一般ユーザーで実行します
  • 最新のイメージを使う:「latest」タグより特定バージョンを指定し、定期的に更新します
  • 最小限のイメージ:alpine系の軽量イメージを使い、不要なツールを含めないようにします
  • 秘密情報をイメージに含めない:APIキー・パスワードはDockerfileやdocker-compose.ymlに直接書かず、環境変数ファイル(.env)やDocker Secretsを使います
  • 読み取り専用ファイルシステム:「–read-only」フラグで不要な書き込みを防ぎます

10. 次のステップ——Docker習得後に学ぶべき技術

Dockerの基本を習得したら、次は以下の技術を学ぶとさらにスキルが広がります。

Kubernetes(K8s)
大規模なコンテナオーケストレーションツールです。複数のコンテナを自動でデプロイ・スケール・管理します。DockerはK8sの実行環境として広く使われています。クラウドプロバイダー(GKE・EKS・AKS)のマネージドKubernetesサービスから学ぶと始めやすいです。

Docker Swarm
Dockerが内蔵するオーケストレーション機能です。Kubernetesより学習コストが低く、中小規模のプロジェクトに向いています。

コンテナセキュリティ
Trivy・Snyk・Docker Scoutなどのツールでイメージの脆弱性スキャンを行う方法を学ぶと、本番運用のレベルアップにつながります。

マルチステージビルド
Dockerfileでビルドフェーズと実行フェーズを分離し、最終イメージのサイズを大幅に削減できます。Go言語やJavaなどコンパイルが必要な言語では特に効果的です。

よくある質問(FAQ)

Q1. DockerとVagrantの違いは何ですか?
VagrantはVirtualBoxなどのハイパーバイザー上で完全な仮想マシンを管理するツールです。ゲストOS全体を含むため重く、起動に時間がかかります。DockerはホストOSのカーネルを共有するコンテナ技術で、軽量・高速に動作します。開発環境の統一という目的は似ていますが、現在はDockerがよりスタンダードな選択肢となっています。

Q2. Dockerイメージのサイズを小さくするにはどうすればいいですか?
主な方法として、alpineなどの軽量ベースイメージを使う、マルチステージビルドでビルドツールを最終イメージから除外する、不要なパッケージをインストールしない、RUN命令を1行にまとめてレイヤー数を減らす(&&でつなぐ)、.dockerignoreファイルで不要なファイルのコピーを防ぐ、などがあります。

Q3. コンテナを削除してもデータを保持するにはどうすればいいですか?
Dockerボリュームを使います。名前付きボリューム(「docker volume create」で作成)をコンテナにマウントすることで、コンテナを削除してもボリュームのデータは残ります。データベースのデータ保持には必須のテクニックです。

Q4. Docker DesktopとDocker Engineの違いは何ですか?
Docker Desktopは、Docker EngineにGUI管理画面・Docker Compose・Kubernetes環境などを含んだオールインワンパッケージです。WindowsやmacOSでの利用に向いています。Docker EngineはDockerのコア部分のみで、主にLinuxサーバー環境で使われます。商用利用の場合、Docker Desktopは従業員250人以上の企業には有料ライセンスが必要です。

Q5. 本番環境のDockerコンテナを更新するベストな方法は何ですか?
ブルーグリーンデプロイやローリングアップデートが推奨されます。新しいイメージをビルド→新しいコンテナを起動→ヘルスチェック確認→トラフィックを切り替え→旧コンテナを停止、という手順で無停止更新を実現します。Kubernetesを使うと、この一連の作業を自動化できます。CI/CDパイプラインと組み合わせることで、コードをプッシュするだけで本番デプロイまで自動化できます。

まとめ

Dockerコンテナは現代のソフトウェア開発に欠かせない技術です。今回学んだことをまとめます。

  • Dockerコンテナは仮想マシンより軽量・高速で、アプリと依存関係をパッケージ化する
  • 基本コマンド(run・ps・stop・rm・pull・build)を習得することが第一歩
  • Dockerfileで自分のイメージを作り、Docker Composeで複数サービスを連携させる
  • ボリュームでデータを永続化し、ネットワークでコンテナ間通信を実現する
  • セキュリティには常に注意を払い、公式イメージ・最小権限・秘密情報の分離を徹底する
  • 習得後はKubernetesへの道がひらける

まずは「docker run hello-world」から始め、次にWebサーバー(Nginx)のコンテナを動かしてみましょう。手を動かすことが最短の習得法です。

コメント