初心者向け Docker Desktop 入門

はい、承知いたしました。初心者向けDocker Desktop入門の詳細な説明を含む記事を約5000語で執筆し、直接ここに表示します。


初心者向け Docker Desktop 入門:開発環境構築の救世主

はじめに:なぜ今、Dockerなのか?

ソフトウェア開発の世界では、常に「開発環境の構築」という課題がつきまといます。

「AさんのPCでは動くのに、BさんのPCでは動かない」
「本番環境にデプロイしたら、開発環境と挙動が違う」
「新しいプロジェクトに参加したら、依存するミドルウェアのバージョンが古くてインストールに苦労した」

このような経験はありませんか? これは、OS、インストールされているライブラリやミドルウェアのバージョン、環境変数など、開発者それぞれのPC環境が異なることによって発生します。さらに、一つのPCで複数のプロジェクトを進める場合、プロジェクトごとに異なるバージョンのソフトウェアが必要になり、環境が衝突してしまうことも珍しくありません。

この「環境差異」の問題を解決し、開発者が本来の「コードを書く」という作業に集中できるようにする技術が、コンテナです。そして、コンテナ技術のデファクトスタンダードとなっているのが Docker です。

Dockerを使えば、アプリケーションとその実行に必要なものをすべてひとまとめにして、「コンテナ」という独立した箱に入れた状態で配布・実行できます。このコンテナは、どのPC上で動かしても同じように動作することが保証されます。まるで、特定の家具や家電がすべて入った「引っ越しパック」のように、どこに持って行っても開ければすぐに生活を始められる、そんなイメージです。

そして、WindowsやmacOSといったデスクトップ環境で手軽にDockerを使うためのツールが、Docker Desktop です。これを使えば、複雑な設定なしに、GUI操作や簡単なコマンドでコンテナを利用できます。

この記事は、Dockerやコンテナ技術に触れるのが初めてという方を対象に、Docker Desktopのインストールから、基本的な概念、GUIの使い方、主要なコマンド、そして実際に簡単なアプリケーションを動かしてみるハンズオンまで、詳しく丁寧に解説します。この記事を読み終える頃には、Dockerの基本的な仕組みを理解し、ご自身の開発環境で活用できるようになっていることを目指します。

さあ、開発をもっと効率的に、もっと快適にするDockerの世界へ飛び込んでみましょう!

1. Dockerの基本概念を理解しよう

Docker Desktopを使い始める前に、まずはDockerを構成するいくつかの重要な概念を理解しておくことが重要です。

1.1. コンテナ (Container)

  • コンテナとは何か?

    • コンテナは、アプリケーションとその実行に必要なすべてのもの(コード、ランタイム、システムツール、システムライブラリ、設定など)をパッケージングし、互いに隔離された独立した環境で実行するための技術です。
    • OS上に直接アプリケーションをインストールするのではなく、コンテナという仮想的な箱の中にアプリケーションとその依存関係を閉じ込めて実行します。
    • この「箱」は非常に軽量で、起動も高速です。
  • 仮想マシン (VM) との違い

    • コンテナと似た技術として仮想マシン(VMware, VirtualBox, Hyper-Vなど)があります。VMもOS上に別のOS(ゲストOS)を動かし、その中にアプリケーションをインストールします。
    • VMはゲストOS全体をエミュレートするため、サイズが大きく、起動に時間がかかります。各VMは独立したカーネルを持ちます。
    • 一方、コンテナはホストOSのカーネルを共有します。ゲストOSを持たず、アプリケーションとその依存関係だけをパッケージングします。このため、VMに比べて圧倒的に軽量で、起動が数秒あるいはミリ秒と高速です。
    • 例えるなら、VMは「OSごと引っ越しする」、コンテナは「家具や家電だけを箱詰めして引っ越しする」イメージです。
  • コンテナのメリット

    • ポータビリティ: どの環境(開発PC、ステージング、本番サーバー、クラウドなど)でも同じように動作します。
    • 軽量・高速: 起動や停止が非常に素早く行えます。リソース消費もVMより少ないです。
    • 隔離: コンテナ同士は互いに影響を与えません。依存関係の衝突を防ぎます。
    • 一貫性: 誰がいつどこで実行しても、全く同じ環境が再現されます。
    • 開発効率向上: 環境構築の手間が省け、開発者はコードに集中できます。
    • 運用効率向上: デプロイが容易になり、問題発生時の原因特定も迅速になります。

1.2. イメージ (Image)

  • イメージとは何か?

    • イメージは、コンテナを作成するための「設計図」あるいは「テンプレート」です。
    • コンテナを実行するために必要なファイルシステム、ライブラリ、設定、起動コマンドなどが層状に積み重ねられた読み取り専用のテンプレートです。
    • 例えるなら、OSをインストールした状態の仮想マシンのスナップショットや、家電製品の「取扱説明書と組み立て手順」のようなものです。
    • イメージ自体は不変(Immutable)です。イメージから起動されたコンテナは、イメージの上に書き込み可能なレイヤーを追加して動作します。
  • Immutable Infrastructure (不変なインフラ) の考え方

    • Dockerイメージの特性は、Immutable Infrastructureという考え方と親和性が高いです。
    • これは、「一度デプロイしたサーバーの設定を変更するのではなく、設定変更があれば新しい設定で新しいサーバー(コンテナ)を構築し、古いサーバー(コンテナ)と置き換える」という考え方です。
    • これにより、設定変更による意図しない副作用を防ぎ、常にクリーンな状態を保ちやすくなります。

1.3. Dockerfile

  • Dockerfileとは何か?

    • Dockerfileは、Dockerイメージを自動的に構築するための「手順書」または「レシピ」のようなテキストファイルです。
    • 「どのOSイメージをベースにするか」「どのソフトウェアをインストールするか」「どのファイルをコピーするか」「起動時に何を実行するか」といった手順を記述します。
    • このDockerfileを実行することで、誰でも全く同じイメージを再現性高く作成できます。
  • Dockerfileの例
    “`dockerfile
    # どのイメージをベースにするか (例: Ubuntu 22.04)
    FROM ubuntu:22.04

    イメージ作成者情報 (任意)

    LABEL maintainer=”[email protected]

    パッケージの更新と必要なソフトウェアのインストール

    RUN apt-get update && apt-get install -y nginx curl && rm -rf /var/lib/apt/lists/*

    ホストOSからコンテナ内にファイルをコピー

    COPY index.html /var/www/html/

    コンテナがリッスンするポート

    EXPOSE 80

    コンテナ起動時に実行されるコマンド

    CMD [“nginx”, “-g”, “daemon off;”]
    ``
    このDockerfileは、UbuntuをベースにNginxをインストールし、ホストにある
    index.html`をコンテナ内のWebルートにコピーし、ポート80を公開してNginxを起動するイメージを作成する手順を記述しています。

1.4. Docker Hub (レジストリ)

  • レジストリ (Registry) とは何か?

    • レジストリは、Dockerイメージを保管・共有するための場所です。
    • 公開されているイメージを検索・ダウンロードしたり、自分で作成したイメージをアップロードしたりできます。
  • Docker Hub とは?

    • Docker Hubは、Docker社が公式に提供している最大規模のパブリックレジストリです。
    • Ubuntu, Alpine, Nginx, Node.js, Python, MySQLなど、様々な公式イメージや、世界中のユーザーが作成・公開したイメージが登録されています。
    • ユーザーはここから必要なイメージを「プル (pull) 」してきて、すぐにコンテナを起動できます。また、自分で作成したイメージを「プッシュ (push) 」して共有することも可能です。

1.5. Docker Engine

  • Docker Engineとは何か?
    • Docker Engineは、イメージの構築、コンテナの実行と管理、イメージの配布といったDockerのコア機能を提供するクライアント・サーバー型アプリケーションです。
    • サーバー側のデーモンプロセス(Docker daemonまたはdockerd)が、イメージ、コンテナ、ボリューム、ネットワークといったDockerオブジェクトを管理します。
    • クライアント側のCLI (Command Line Interface) ツールである docker コマンドを使って、デーモンと通信し、様々な操作を行います。
    • Docker Desktopは、このDocker EngineをWindowsやmacOS上で簡単に実行・管理できるようにするパッケージです。

これらの概念(コンテナ、イメージ、Dockerfile、レジストリ、Docker Engine)が、Dockerの基本的な仕組みを理解する上で非常に重要です。それぞれの役割と関係性を把握することで、Docker Desktopをより効果的に活用できます。

2. Docker Desktopのインストール

Docker Desktopは、WindowsおよびmacOS上でDockerを動作させるための公式ツールです。Linux版も存在しますが、WindowsやmacOSでDockerを手軽に使うための、GUIを含んだパッケージとして提供されています。

2.1. システム要件の確認

Docker Desktopをインストールするには、お使いのPCが以下のシステム要件を満たしている必要があります。バージョンによって要件が変更される可能性があるため、最新の情報は公式ドキュメントを確認してください。

  • Windows:

    • Windows 11 64-bit: Home or Pro version 21H2 or higher, or Enterprise or Education version 21H2 or higher.
    • Windows 10 64-bit: Home or Pro version 2004 or higher, or Enterprise or Education version 1909 or higher.
    • WSL2 (Windows Subsystem for Linux 2) のインストール: Docker Desktop for Windowsは、WSL2をバックエンドとして使用することが推奨されています。WSL2がインストールされ、有効になっている必要があります。
    • ハードウェア仮想化が有効になっている必要があります(BIOS設定で確認)。
    • 少なくとも4GBのRAM。
    • インターネット接続(ダウンロードとイメージ取得のため)。
  • macOS:

    • macOS Ventura 13, macOS Monterey 12, または macOS Big Sur 11.
    • IntelまたはApple silicon (M1, M2, M3チップなど) プロセッサ。
    • 少なくとも4GBのRAM。
    • インターネット接続(ダウンロードとイメージ取得のため)。

特にWindowsユーザーは、WSL2のインストールと有効化が必須または強く推奨される点に注意が必要です。もしWSL2がインストールされていない場合は、Microsoftの公式ドキュメントを参考に事前にインストールしておきましょう。

2.2. Docker Desktopのダウンロード

Docker Desktopは、Dockerの公式ウェブサイトからダウンロードできます。

  1. ウェブブラウザで Docker公式サイト(https://www.docker.com/products/docker-desktop/)にアクセスします。
  2. お使いのOS(WindowsまたはmacOS)に対応したダウンロードボタンをクリックします。インストーラーがダウンロードされます。

2.3. インストール手順 (Windows)

  1. ダウンロードしたインストーラーファイル(例: Docker Desktop Installer.exe)を実行します。
  2. 「Configuration」画面が表示されます。
    • Install required Windows components for WSL 2:WSL2を使用する場合、これにチェックが入っていることを確認してください(推奨)。もしWSL2が未インストールまたは古いバージョンの場合、必要なコンポーネントがインストールされます。
    • Add shortcut to desktop:デスクトップにショートカットを作成するかどうか。お好みでチェックを入れます。
  3. 「OK」をクリックすると、インストールが開始されます。必要なファイルのコピーや設定が行われます。
  4. インストールが完了すると、「Installation Succeeded」というメッセージが表示されます。
  5. 「Close and restart」をクリックして、PCを再起動します。

2.4. インストール手順 (macOS)

  1. ダウンロードしたインストーラーファイル(例: Docker.dmg)を開きます。
  2. Docker.app を Applications フォルダにドラッグ&ドロップします。
  3. Applications フォルダから Docker.app を起動します。
  4. 初回起動時に、権限の許可を求められる場合があります。指示に従ってパスワードなどを入力し、必要な権限を付与してください。
  5. 利用規約(Service Agreement)が表示されますので、内容を確認し「Accept」をクリックします。
  6. 「Welcome to Docker Desktop」画面が表示されます。ここで、WSL2 Integration(Windowsの場合)や必要な設定が行われます。
  7. これでDocker Desktopが起動し、メニューバーにDockerのアイコンが表示されるようになります。

2.5. インストール後の確認

インストールが完了しDocker Desktopが起動したら、正しくインストールされたか確認しましょう。

  1. Docker Desktop GUI: システムトレイ(Windows)またはメニューバー(macOS)にあるDockerのアイコンをクリックします。「Dashboard」を選択すると、Docker DesktopのGUIが表示されます。このGUIが表示されれば、Docker Desktop自体は起動しています。
  2. CLI (コマンドライン): ターミナル(Windowsの場合は PowerShell または コマンドプロンプト、macOSの場合は Terminal)を開き、以下のコマンドを実行してみます。

    bash
    docker version

    このコマンドは、インストールされているDockerクライアントとサーバー(Engine)のバージョン情報を表示します。バージョン情報が表示されれば、Dockerコマンドが正しくインストールされ、パスが通っていることが確認できます。

    bash
    docker info

    このコマンドは、Dockerに関する詳細情報(ストレージドライバ、コンテナ数、イメージ数など)を表示します。これも正しく実行できれば問題ありません。

これでDocker Desktopのインストールは完了です! 次は、Docker DesktopのGUIを触ってみましょう。

3. Docker Desktop GUIの使い方

Docker Desktopには、Dockerの基本的な操作を視覚的に行えるGUI (Graphical User Interface) が付属しています。特に初心者の方にとって、GUIは現在実行中のコンテナやローカルにあるイメージを確認したり、起動・停止といった操作を手軽に行うのに役立ちます。

Docker Desktop GUIを開くには、システムトレイ(Windows)またはメニューバー(macOS)にあるDockerアイコンをクリックし、「Dashboard」を選択します。

GUIは主に以下のセクションで構成されています。

3.1. ホーム画面 (Home)

Docker Desktopの概要や、便利なリンク、Docker Hubとの連携情報などが表示されます。初めて起動した際には、簡単なチュートリアルが表示されることもあります。

3.2. Containers

このタブは、ローカルで実行中のコンテナや、過去に作成されたコンテナの一覧を表示します。

  • 一覧表示:
    • コンテナ名、イメージ名、ステータス(Running, Exitedなど)、ポートマッピング、起動からの時間などが表示されます。
    • 実行中のコンテナは緑色のアイコン、停止中のコンテナは灰色のアイコンなどで表示されます。
  • 各コンテナの詳細:
    • リストから特定のコンテナをクリックすると、そのコンテナの詳細が表示されます。
    • Logs: コンテナの標準出力/標準エラー出力をリアルタイムで確認できます。アプリケーションのエラーログや起動メッセージなどを追うのに便利です。
    • Inspect: コンテナの詳細な設定情報(ID, IPアドレス, ボリュームマウント, 環境変数など)をJSON形式で確認できます。
    • Stats: CPU使用率、メモリ使用量、ネットワークI/Oなどのリソース使用状況をリアルタイムのグラフで確認できます。
    • Files: コンテナのファイルシステムを参照できます。コンテナ内部のファイル構成を確認したり、簡単なファイル操作(ダウンロードなど)が可能です。
    • Terminal: コンテナ内で直接シェル(bashなど)を起動し、コマンドを実行できます。コンテナ内部の調査やデバッグに非常に役立ちます。
  • コンテナ操作:
    • 一覧画面や詳細画面で、各コンテナの横にあるボタンやメニューから以下の操作が可能です。
      • Start: 停止中のコンテナを起動します。
      • Stop: 実行中のコンテナを停止します。
      • Restart: コンテナを再起動します。
      • Remove: コンテナを削除します。実行中のコンテナを削除するには、先に停止する必要があります。
      • Open in Browser: コンテナが公開しているポート(Webサーバーなど)をブラウザで開きます。
      • Duplicate: 同じイメージから新しいコンテナを同じ設定で作成します。
      • Export/Import: コンテナをファイルにエクスポート/インポートします(あまり一般的ではありません)。

3.3. Images

このタブは、ローカルマシンにダウンロードまたはビルドされたDockerイメージの一覧を表示します。

  • 一覧表示:
    • イメージ名(リポジトリ名とタグ)、イメージID、サイズ、作成日時などが表示されます。
  • 各イメージの詳細:
    • リストから特定のイメージをクリックすると、そのイメージの詳細が表示されます。
    • イメージのレイヤー構造や、そのイメージから作成されたコンテナの一覧などを確認できます。
  • イメージ操作:
    • Pull: Docker Hubなどのレジストリからイメージをダウンロード(プル)します。
    • Build: Dockerfileを指定して、独自のイメージをビルドします。(通常はCLIで行うことが多いですが、GUIからも可能です)
    • Run: 選択したイメージから新しいコンテナを起動します。起動時のポートマッピングやボリューム設定などのオプションを指定できます。
    • Remove: ローカルからイメージを削除します。そのイメージを使用しているコンテナが存在する場合は削除できません。

3.4. Volumes

このタブは、データの永続化に使用されるボリュームの一覧を表示します。ボリュームについては後ほど詳しく解説しますが、コンテナが削除されてもデータが失われないようにするための仕組みです。

  • ボリューム名、使用中のコンテナ数などを確認できます。
  • ボリュームの作成や削除が可能です。

3.5. Dev Environments (旧 Docker Compose)

複数のコンテナで構成されるアプリケーション(例えば、Webサーバーとデータベース)をまとめて管理するための機能です。Docker Composeファイル(docker-compose.yml)を読み込んで、サービス全体を起動・停止・管理できます。

  • Docker Composeプロジェクトをインポートしたり、起動・停止・削除したりできます。
  • プロジェクト内の各サービスのコンテナ状態を確認できます。

3.6. Settings

Docker Desktop全体の様々な設定を変更できます。

  • General: Docker Desktopの起動設定、WSL Integration (Windows) など。
  • Resources:
    • Advanced: Docker Engineに割り当てるCPUコア数、メモリ容量、ディスクイメージサイズなどを調整できます。開発環境のPCリソースに合わせて適切に設定することが重要です。
    • Proxies: プロキシ設定。
    • Network: Dockerで使用するネットワーク設定。
    • WSL Integration (Windows): どのWSL2ディストリビューションでDockerを実行するかを選択できます。
  • Docker Engine: Docker Engineのdaemon.json設定を直接編集できます。
  • Kubernetes: Docker Desktopは単一ノードのKubernetesクラスターを内蔵しており、ここで有効/無効を切り替えたりリセットしたりできます。
  • Software updates: Docker Desktopのアップデート設定。

3.7. Troubleshoot

問題発生時の診断やリセット機能を提供します。

  • Diagnose & Feedback: Docker Desktopの診断情報を収集し、問題報告に利用できます。
  • Restart Docker Desktop: Docker Engineを再起動します。多くの問題はこれで解決することがあります。
  • Reset Docker Desktop: Docker Desktopを工場出荷時の設定にリセットします。コンテナ、イメージ、ボリュームなどがすべて削除されるので注意が必要です。

GUIは直感的で便利ですが、より高度な操作や自動化、スクリプト化にはやはりCLI(コマンドラインインターフェース)が不可欠です。GUIで操作に慣れたら、対応するCLIコマンドも一緒に学ぶと理解が深まります。

4. Dockerコマンドの基本

Dockerの操作は、主にCLIを使って行います。Docker Desktopをインストールすると、docker コマンドが利用できるようになります。ここでは、Dockerの基本的なコマンド体系と、よく使うコマンドをいくつか紹介します。

コマンドは基本的に以下の形式です。

bash
docker [サブコマンド] [オプション] [引数]

例:docker container ls -a (containerがサブコマンド、lsがそのサブコマンドのコマンド、-aがオプション)

Dockerのサブコマンドには container, image, volume, network, build, run など様々なものがありますが、初心者の方はまず docker run, docker ps, docker stop, docker start, docker rm, docker images, docker rmi, docker pull, docker exec, docker logs あたりから覚えると良いでしょう。

Note: 以前のバージョンでは docker ps のようにサブコマンドなしで直接コマンドを実行できましたが、現在は docker container ps のようにサブコマンドを指定することが推奨されています。ただし、後方互換性のためにサブコマンドなしでも動くコマンドは多くあります。この記事では、よく使われる省略形も交えながら説明します。

4.1. docker run:イメージからコンテナを起動する

これがDockerで最も基本的なコマンドの一つです。指定したイメージから新しいコンテナを作成し、起動します。

bash
docker run [オプション] イメージ名 [コマンド] [引数...]

主なオプション:

  • -d, --detach: コンテナをバックグラウンドで実行します(デタッチモード)。これを付けないと、コンテナが実行している間、ターミナルが専有されます。Webサーバーなど常に起動しておくコンテナに便利です。
  • -p ホストポート:コンテナポート, --publish: ホストマシンのポートとコンテナのポートを関連付け(ポートマッピング)します。これにより、ホストマシンからコンテナ内のサービス(Webサーバーなど)にアクセスできるようになります。例: -p 8080:80 (ホストの8080番ポートをコンテナの80番ポートに関連付ける)
  • -v ホストパス:コンテナパス, --volume: ホストマシンのディレクトリやファイル、またはDocker管理のボリュームをコンテナ内のパスにマウント(共有)します。コンテナが削除されてもデータを永続化したり、開発中にホスト側でコードを編集してコンテナに反映させたりするのに使います。
  • --name コンテナ名: コンテナに人間が読みやすい名前を付けます。指定しない場合、Dockerがランダムな名前を生成します。
  • -e 環境変数名=値, --env: コンテナに環境変数を渡します。データベースのパスワードなどを設定する際によく使われます。
  • --rm: コンテナが停止したときに自動的に削除します。一時的なコンテナの実行に便利です。
  • -it: インタラクティブモードとTTYを割り当てます。コンテナ内でシェルなどを操作する際に必要です。例: docker run -it ubuntu bash (Ubuntuコンテナを起動してbashシェルに入る)

例1: “hello-world” コンテナを起動する

これはDockerが正しくインストールされ、実行できるかを確認するための最もシンプルな例です。

bash
docker run hello-world

実行すると、hello-worldというイメージがDocker Hubから自動的にプルされ、そのイメージからコンテナが起動し、「Hello from Docker!」のようなメッセージが表示されてコンテナは終了します。

例2: 対話的にUbuntuコンテナを起動してシェルに入る

bash
docker run -it ubuntu bash

-itオプションにより、Ubuntuイメージから起動したコンテナ内でインタラクティブなシェルセッションを開始します。プロンプトがコンテナ内のシェル(例: root@<container-id>:/#)に変わります。ここでls, pwdなどのLinuxコマンドを実行できます。exitと入力するとコンテナを終了し、ホストのターミナルに戻ります。

4.2. docker ps:実行中のコンテナ一覧を表示する

bash
docker ps [オプション]

  • 何もオプションを付けないと、現在実行中のコンテナだけを表示します。
  • -a, --all: 実行中か停止中かにかかわらず、全てのコンテナを表示します。
  • -q, --quiet: コンテナIDだけを表示します。

例:
bash
docker ps # 実行中のコンテナを表示
docker ps -a # 全てのコンテナを表示
docker ps -aq # 全てのコンテナIDを表示

GUIのContainersタブで表示される情報と同じものがCLIで確認できます。

4.3. docker stop/docker start/docker restart:コンテナを操作する

コンテナを指定して、停止、起動、再起動を行います。コンテナの指定は、コンテナ名またはコンテナIDで行います。

bash
docker stop コンテナ名またはID
docker start コンテナ名またはID
docker restart コンテナ名またはID

例:
my-nginxという名前のコンテナを停止・起動する。
bash
docker stop my-nginx
docker start my-nginx

4.4. docker rm:コンテナを削除する

不要になったコンテナを削除します。実行中のコンテナは削除できません(-fオプションを使えば強制削除できますが非推奨)。

bash
docker rm [オプション] コンテナ名またはID [コンテナ名またはID...]

  • -f, --force: 実行中のコンテナを強制的に削除します。注意して使用してください。

例:
停止中のmy-nginxコンテナを削除する。
bash
docker rm my-nginx

全ての停止中のコンテナをまとめて削除する(docker ps -aq で停止中のコンテナIDリストを取得)。
bash
docker rm $(docker ps -aq -f status=exited)

4.5. docker images:ローカルにあるイメージ一覧を表示する

ローカルマシンにダウンロードまたはビルドされたDockerイメージの一覧を表示します。

bash
docker images [オプション]

  • -a, --all: 中間イメージを含む全てのイメージを表示します。
  • -q, --quiet: イメージIDだけを表示します。

例:
bash
docker images # ローカルのイメージ一覧を表示
docker images -a # 中間イメージを含む全てのイメージを表示

GUIのImagesタブで表示される情報と同じものがCLIで確認できます。

4.6. docker rmi:イメージを削除する

不要になったDockerイメージをローカルから削除します。そのイメージを使用しているコンテナが存在する場合は削除できません。

bash
docker rmi [オプション] イメージ名またはID [イメージ名またはID...]

例:
ubuntu:latestイメージを削除する。
bash
docker rmi ubuntu:latest

使用されていないイメージをまとめて削除する(docker images -q -f dangling=true で未使用イメージIDリストを取得)。
bash
docker rmi $(docker images -q -f dangling=true)

4.7. docker pull:レジストリからイメージを取得する

Docker Hubなどのレジストリからイメージをダウンロード(プル)します。docker runでローカルにイメージがない場合、自動的にプルされますが、事前にプルしておくこともできます。

bash
docker pull イメージ名[:タグ]

タグを省略した場合、デフォルトで:latestタグがプルされます。

例:
最新のnginxイメージをプルする。
bash
docker pull nginx

ubuntu:22.04というタグの付いたUbuntuイメージをプルする。
bash
docker pull ubuntu:22.04

4.8. docker exec:実行中のコンテナ内でコマンドを実行する

実行中のコンテナ内で、新しいプロセスとしてコマンドを実行します。コンテナ内部のデバッグや調査に非常に便利です。

bash
docker exec [オプション] コンテナ名またはID コマンド [引数...]

  • -it: インタラクティブモードとTTYを割り当てます。コンテナ内でシェルを実行して操作する場合に必要です。

例:
my-nginxというコンテナ内でls /を実行する。
bash
docker exec my-nginx ls /

my-nginxコンテナ内でbashシェルを起動し、対話的に操作する。
bash
docker exec -it my-nginx bash

(コンテナ内にbashがインストールされていない場合はshなどを試します)

4.9. docker logs:コンテナのログを表示する

コンテナの標準出力と標準エラー出力に書き出されたログを表示します。アプリケーションの動作確認やエラー調査に必須のコマンドです。

bash
docker logs [オプション] コンテナ名またはID

  • -f, --follow: ログをリアルタイムで追跡します(tail -f のような動作)。
  • --tail 数: ログの末尾から指定した行数を表示します。

例:
my-nginxコンテナのログを表示する。
bash
docker logs my-nginx

my-nginxコンテナのログをリアルタイムで表示し続ける。
bash
docker logs -f my-nginx

4.10. docker system prune:不要なオブジェクトを一括削除する

停止中のコンテナ、使用されていないネットワーク、dangling(どのイメージにも紐づいていない)イメージ、そしてデフォルトでは使用されていないボリュームをまとめて削除し、ディスクスペースを解放します。定期的に実行することをおすすめします。

bash
docker system prune [オプション]

  • -a, --all: danglingなイメージだけでなく、どのコンテナからも使用されていないイメージも全て削除します。
  • --volumes: 使用されていないボリュームも削除対象に含めます。

例:
bash
docker system prune # 停止中のコンテナ、ネットワーク、danglingイメージを削除
docker system prune -a --volumes # 使用されていないもの全て(コンテナ、イメージ、ネットワーク、ボリューム)を削除

実行時には削除対象の一覧が表示され、続行するか確認されます。

これらの基本的なコマンドを覚えることで、Docker DesktopのCLIを使いこなす第一歩となります。GUIと組み合わせて使うことで、より効率的にDockerを利用できるようになります。

5. ハンズオン:Webサーバーを動かしてみよう (Nginx)

それでは、Docker Desktopを使って、実際にWebサーバー(Nginx)を動かしてみましょう。これはDockerを試す際の定番であり、非常に簡単に行えます。

目標: Docker HubからNginxイメージを取得し、それを基にコンテナを起動して、ホストマシンのブラウザからアクセスできるようにする。

手順:

  1. ターミナルを開く:
    Windowsの場合はPowerShellまたはコマンドプロンプト、macOSの場合はTerminalを開きます。

  2. Nginxイメージをプルする:
    Docker HubからNginxの公式イメージをダウンロードします。ローカルにイメージがない場合、docker run時に自動的にプルされますが、事前にプルしておくと安心です。

    bash
    docker pull nginx

    実行すると、Docker Hubからイメージがダウンロードされる様子が表示されます。latestタグのイメージがデフォルトでプルされます。

    Using default tag: latest
    latest: Pulling from library/nginx
    ...ダウンロードの進捗が表示される...
    Status: Downloaded newer image for nginx:latest
    docker.io/library/nginx:latest

    ローカルにイメージがダウンロードされたことを確認します。
    bash
    docker images nginx

    REPOSITORY TAG IMAGE ID CREATED SIZE
    nginx latest ... ... ...

    nginxというリポジトリ名でlatestタグのイメージが表示されていればOKです。

  3. Nginxコンテナを起動する:
    プルしたnginx:latestイメージを使ってコンテナを起動します。以下のコマンドを実行してください。

    bash
    docker run -d -p 8080:80 --name my-nginx nginx

    このコマンドの意味を解説します。
    * docker run: コンテナを起動するコマンドです。
    * -d: コンテナをバックグラウンド(デタッチモード)で実行します。ターミナルが解放されます。
    * -p 8080:80: ポートマッピングの設定です。「ホストマシンの8080番ポートへのアクセスを、コンテナの80番ポートへ転送する」という意味です。Nginxはデフォルトで80番ポートで待ち受けているため、ホストの8080番ポートを通してアクセスできるようにします。
    * --name my-nginx: このコンテナにmy-nginxという名前を付けます。この名前でコンテナを識別できるようになります。
    * nginx: 起動に使用するイメージ名です。nginx:latestと同じ意味です。

    コマンドを実行すると、コンテナIDが表示されます。
    abcdef1234567890...

  4. コンテナが実行されているか確認する:
    docker psコマンドで、現在実行中のコンテナを確認します。

    bash
    docker ps

    以下のような表示が出れば、my-nginxという名前のコンテナがUp(実行中)になっていることが確認できます。

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    abcdef123456 nginx "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 0.0.0.0:8080->80/tcp my-nginx

    また、Docker DesktopのGUIを開いて、「Containers」タブを見てみましょう。my-nginxという名前のコンテナが「Running」状態で表示されているはずです。ここでログや統計情報なども確認できます。

  5. ブラウザでアクセスしてみる:
    ホストマシンのウェブブラウザを開き、以下のURLにアクセスします。

    http://localhost:8080/
    これは、ホストマシンの8080番ポートへのアクセスが、Dockerによってmy-nginxコンテナの80番ポートに転送されるためです。
    Nginxのデフォルトの歓迎ページ(”Welcome to nginx!” と表示されるページ)が表示されれば成功です!

  6. コンテナのログを確認する:
    コンテナのログを確認してみましょう。アクセスログなどが見れるはずです。

    bash
    docker logs my-nginx

    ブラウザからのアクセスがあったログなどが表示されるはずです。-fオプションを付けてログを追跡することもできます。

    bash
    docker logs -f my-nginx

    (ログ表示を停止するにはCtrl+Cを押します)

  7. コンテナ内でコマンドを実行する:
    実行中のコンテナ内部に接続して、シェルコマンドを実行してみましょう。

    bash
    docker exec -it my-nginx bash

    プロンプトがroot@<container-id>:/#のように変わり、コンテナ内部のシェルに入ることができます。ここで例えば/var/www/htmlディレクトリの中身を見てみましょう。

    bash
    ls /var/www/html

    Nginxのデフォルトページファイルであるindex.htmlなどが見えるはずです。
    コンテナ内のシェルを終了するにはexitと入力します。

  8. コンテナを停止・削除する:
    不要になったコンテナを停止し、削除します。

    bash
    docker stop my-nginx

    docker psを実行して、コンテナが停止していることを確認します(表示されなくなるか、-aオプションでExitedと表示されます)。
    次に、停止したコンテナを削除します。

    bash
    docker rm my-nginx

    docker ps -aを実行して、コンテナが一覧から消えていることを確認します。

    また、Docker Desktop GUIのContainersタブからも、停止や削除の操作が可能です。停止中のコンテナを選択し、ごみ箱アイコンなどをクリックしてみてください。

これで、基本的なDockerコマンドとGUI操作を使って、コンテナの起動、アクセス、操作、停止、削除までの一連の流れを体験できました。

6. Dockerfileを使った独自のイメージ作成

Docker Hubにある既存のイメージを使うだけでなく、Dockerfileを記述することで、自分たちのアプリケーションを含んだ独自のイメージを作成することができます。ここでは、簡単なPython Flaskアプリケーションを例に、Dockerfileの書き方とイメージのビルド方法を学びます。

アプリケーションの構成:

簡単なFlaskアプリケーション (app.py) と、必要なライブラリを記述したファイル (requirements.txt) を用意します。

  1. 作業ディレクトリを作成:
    my-flask-appという名前の新しいフォルダを作成し、その中に移動します。

    bash
    mkdir my-flask-app
    cd my-flask-app

  2. アプリケーションコード (app.py) を作成:
    my-flask-appフォルダ内に、以下の内容でapp.pyファイルを作成します。

    “`python

    app.py

    from flask import Flask
    import os

    app = Flask(name)

    @app.route(‘/’)
    def hello():
    return “Hello, Docker! This is a Flask app.”

    if name == “main“:
    # 環境変数からポートを取得、なければデフォルトの5000番を使用
    port = int(os.environ.get(‘PORT’, 5000))
    app.run(debug=True, host=’0.0.0.0′, port=port)
    ``
    このコードは、
    /にアクセスすると「Hello, Docker! This is a Flask app.」というテキストを返すシンプルなWebアプリケーションです。host=’0.0.0.0’`とすることで、コンテナのどのIPアドレスからのアクセスも受け付けられるようにします(Dockerコンテナでは一般的な設定です)。

  3. 依存ライブラリファイル (requirements.txt) を作成:
    my-flask-appフォルダ内に、以下の内容でrequirements.txtファイルを作成します。

    Flask
    これにより、Flaskライブラリが必要であることを指定します。

  4. Dockerfileを作成:
    my-flask-appフォルダ内に、以下の内容でDockerfileという名前のファイルを作成します(拡張子はありません)。

    “`dockerfile

    Dockerfile

    1. ベースイメージを指定: Pythonの公式軽量イメージを使用

    FROM python:3.9-slim

    2. 作業ディレクトリを設定

    以降のRUN, CMD, COPYなどの命令はこのディレクトリで実行されます

    WORKDIR /app

    3. 依存ライブラリファイルをコンテナにコピー

    ホストのrequirements.txtを作業ディレクトリ(/app)にコピー

    COPY requirements.txt ./

    4. 依存ライブラリをインストール

    requirements.txtに基づいてFlaskをインストール

    RUN pip install –no-cache-dir -r requirements.txt

    5. アプリケーションコードをコンテナにコピー

    ホストのapp.pyを作業ディレクトリ(/app)にコピー

    COPY app.py ./

    6. コンテナが待ち受けるポートを公開

    アプリケーションが5000番ポートで動作するため、これを公開

    EXPOSE 5000

    7. コンテナ起動時に実行するコマンド

    app.pyを実行してFlaskアプリケーションを起動

    CMD [“python”, “app.py”]
    “`
    各行のコメントで説明しているように、このDockerfileは、Pythonイメージをベースに、依存ライブラリをインストールし、アプリケーションコードをコピーして、アプリケーションを実行する手順を定義しています。

    • FROM: どのイメージをベースにするか。ここでは公式のPython 3.9の軽量版イメージを使います。
    • WORKDIR: コンテナ内でコマンドを実行する作業ディレクトリを設定します。
    • COPY: ホストマシンのファイルをコンテナ内の指定したパスにコピーします。
    • RUN: イメージビルド中に実行されるコマンドです。ここではpipを使ってライブラリをインストールします。--no-cache-dir はキャッシュを生成しないオプションで、イメージサイズを小さく保つのに役立ちます。
    • EXPOSE: コンテナがリッスンするポートを宣言します。これはドキュメントとしての意味合いが強く、実際にホストからアクセスするにはdocker run -pでポートマッピングが必要です。
    • CMD: コンテナが起動されたときにデフォルトで実行されるコマンドです。通常、コンテナのメインプロセスを指定します。
  5. Dockerイメージをビルドする:
    Dockerfileが置かれているmy-flask-appディレクトリで、以下のコマンドを実行します。

    bash
    docker build -t my-flask-app .

    * docker build: イメージをビルドするコマンドです。
    * -t my-flask-app: ビルドするイメージにmy-flask-appという名前(タグ)を付けます。タグを省略した場合、デフォルトで:latestが付きます。
    * .: Dockerfileを探す場所を指定します。.はカレントディレクトリを意味します。Dockerfileはカレントディレクトリに置かれているので.を指定します。

    コマンドを実行すると、Dockerfileの各ステップが順番に実行され、イメージがビルドされていく様子が表示されます。各ステップが成功すると、一時的なコンテナが作成され、その中でコマンドが実行され、新しいレイヤーが作成されます。

    [+] Building 6.5s (8/8) FINISHED
    => [internal] load build definition from Dockerfile 0.0s
    => [internal] load .dockerignore 0.0s
    => [internal] parsing dockerfile 0.0s
    => [internal] load metadata for docker.io/library/python:3.9-slim 1.3s
    => [1/3] FROM docker.io/library/python:3.9-slim@sha256:... 0.0s
    => [internal] load build context 0.0s
    => [2/3] WORKDIR /app 0.1s
    => [3/3] COPY requirements.txt ./ 0.0s
    => [4/4] RUN pip install --no-cache-dir -r requirements.txt 5.0s
    => [5/5] COPY app.py ./ 0.0s
    => [6/6] EXPOSE 5000 0.0s
    => [7/7] CMD ["python", "app.py"] 0.0s
    => [8/8] Exporting to image 0.1s
    => [+] Storing image docker.io/library/my-flask-app:latest 0.0s

    ビルドが成功したら、ローカルにイメージが作成されたことを確認します。

    bash
    docker images my-flask-app

    REPOSITORY TAG IMAGE ID CREATED SIZE
    my-flask-app latest ... ... ago ...MB

    my-flask-app:latestイメージが表示されていれば成功です。Docker Desktop GUIのImagesタブでも確認できます。

  6. ビルドしたイメージからコンテナを起動する:
    作成したmy-flask-appイメージを使ってコンテナを起動します。Flaskアプリケーションはデフォルトで5000番ポートで動作するので、ホストのポートとマッピングします。

    bash
    docker run -d -p 5000:5000 --name my-flask-container my-flask-app

    * -d: バックグラウンド実行。
    * -p 5000:5000: ホストの5000番ポートをコンテナの5000番ポートにマッピング。
    * --name my-flask-container: コンテナ名をmy-flask-containerとする。
    * my-flask-app: 使用するイメージ名。

  7. 動作確認:
    コンテナが起動したら、ブラウザで以下のURLにアクセスします。

    http://localhost:5000/
    「Hello, Docker! This is a Flask app.」というテキストが表示されれば成功です!

  8. コンテナを停止・削除する:
    不要になったら、先ほどと同様にコンテナを停止・削除します。

    bash
    docker stop my-flask-container
    docker rm my-flask-container

このハンズオンを通して、Dockerfileの基本的な書き方、イメージのビルド、そしてそのイメージからコンテナを起動する流れを体験しました。独自のアプリケーションをコンテナ化するための基礎となります。

7. データの永続化 (Volumes)

コンテナは軽量で使い捨てが基本です。コンテナを削除すると、そのコンテナ内のファイルシステムに書き込まれたデータも失われます。データベースのデータや、ユーザーがアップロードしたファイルなど、永続的に保存しておきたいデータがある場合は、ボリューム (Volume) を使う必要があります。

ボリュームは、コンテナのライフサイクルから独立してデータを管理する仕組みです。コンテナが削除されても、ボリュームは保持されます。

Dockerのボリュームには主に2種類あります。

7.1. Docker管理のボリューム (Named Volumes)

  • Docker自身がホストOS上のどこかにデータを保存・管理するボリュームです。保存場所を意識する必要がなく、docker volume createで作成し、名前を付けて管理します。
  • コンテナから特定のパスに対してボリュームをマウントすることで使用します。
  • コンテナが削除されてもボリュームは残り、後で同じボリュームを別のコンテナにマウントしてデータにアクセスできます。

使い方:

  1. ボリュームを作成:
    bash
    docker volume create my-data-volume
  2. ボリュームをコンテナにマウントして起動:
    docker runコマンドの-vオプションで、ボリューム名:コンテナ内のパスという形式で指定します。

    bash
    docker run -d -v my-data-volume:/app/data --name my-app-with-volume my-app-image

    この例では、my-data-volumeというボリュームを、コンテナ内の/app/dataディレクトリにマウントしています。コンテナ内の/app/dataに書き込まれたデータは、ホスト上のmy-data-volumeに保存されます。

  3. ボリュームの一覧表示:
    bash
    docker volume ls

  4. ボリュームの削除:
    ボリュームを使用しているコンテナがないことを確認してから削除します。
    bash
    docker volume rm my-data-volume

    使用されていないボリュームはdocker system prune --volumesでもまとめて削除できます。

7.2. バインドマウント (Bind Mounts)

  • ホストOS上の特定のディレクトリまたはファイルを、コンテナ内のパスに直接マウントする仕組みです。
  • データの保存場所はホストOS上の指定した場所であり、Dockerには管理されません。
  • 主に開発中に使用されます。ホストマシンでソースコードを編集し、それがすぐにコンテナ内に反映されるようにしたい場合などに便利です。

使い方:

  • docker runコマンドの-vオプションで、ホストのパス:コンテナ内のパスという形式で指定します。

    bash
    docker run -d -p 8080:80 -v /path/to/host/html:/usr/share/nginx/html --name my-nginx-bind-mount nginx

    この例では、ホストの/path/to/host/htmlディレクトリ(このパスは実際に存在するパスに置き換えてください)を、NginxコンテナのWebルートである/usr/share/nginx/htmlにマウントしています。これにより、ホスト側の/path/to/host/htmlにあるファイルを編集すると、それがコンテナ内のNginxで提供されるコンテンツに即時反映されます。

    Windowsの場合のパスの指定: Windowsでバインドマウントを使う場合、パスの指定方法に注意が必要です。
    * PowerShell: C:\Users\YourName\html のようなパスは /c/Users/YourName/html のようにスラッシュ区切りで、ドライブレターの後に/を付けて指定します。
    * Git Bash や WSL2: Linux形式のパス指定が可能です。/mnt/c/Users/YourName/html/home/yourname/html のように指定します。

7.3. どちらを使うべきか?

  • Named Volumes:
    • データの永続化、コンテナからのデータ共有が主な目的の場合。
    • データの保存場所をDockerに任せたい場合。
    • 本番環境でのデータ永続化に推奨されます。
  • Bind Mounts:
    • 開発中にホストのコードや設定ファイルをコンテナと共有し、リアルタイムで変更を反映させたい場合。
    • ホスト上の特定のディレクトリ構造を利用したい場合。
    • ホスト上の設定ファイルをコンテナに読み込ませたい場合。

Docker Desktop GUIのVolumesタブでは、Named Volumesの一覧を確認したり、削除したりできます。バインドマウントはGUIには表示されませんが、コンテナの詳細(Inspectタブ)を見れば、どのようにマウントされているか確認できます。

8. Docker Compose (複数のコンテナ管理)

実際のアプリケーションは、Webサーバーだけでなく、データベース、キャッシュサーバー、バックエンドAPIなど、複数のサービス(コンテナ)で構成されることがほとんどです。これらの複数のコンテナを手動で一つずつ起動・管理するのは非常に手間がかかります。

そこで登場するのが Docker Compose です。

Docker Composeを使えば、アプリケーションを構成するサービス群をdocker-compose.ymlというYAMLファイルに定義し、一つのコマンドでまとめて起動・停止・管理できます。

Docker DesktopにはDocker Composeがバンドルされているため、別途インストールする必要はありません。

8.1. docker-compose.yml ファイル

Docker Composeの設定は、docker-compose.ymlというファイルに記述します。このファイルには、アプリケーションを構成する各サービス、ネットワーク、ボリュームなどの設定を定義します。

基本的な構造:

“`yaml
version: ‘3.8’ # Composeファイルのバージョンを指定

services:
# サービス1の定義
web:
build: . # または image: イメージ名
ports:
– “80:80”
volumes:
– ./app:/app
depends_on: # 依存関係
– db

# サービス2の定義
db:
image: postgres:14
environment:
POSTGRES_DB: mydb
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
volumes:
– db_data:/var/lib/postgresql/data # 永続化のためのボリューム

volumes:
# 使用するNamed Volumeの定義
db_data:
“`

  • version: Docker Composeファイルのフォーマットバージョンを指定します。最新版を指定するのが一般的です(現時点では’3.8’など)。
  • services: アプリケーションを構成する各サービスを定義します。各サービスはコンテナとして実行されます。
    • build: Dockerfileを指定してイメージをビルドする場合。カレントディレクトリのDockerfileを使うなら.と指定。
    • image: 既存のイメージ(Docker Hubなど)を使う場合。
    • ports: ポートマッピング(ホストポート:コンテナポート)。
    • volumes: ボリュームマウント(ホストパスまたはボリューム名:コンテナパス)。
    • environment: コンテナに渡す環境変数。
    • depends_on: サービスの起動順序を指定(dbが起動してからwebを起動など)。
    • 他にも様々なオプションがあります。
  • volumes: サービスで使用するNamed Volumeを定義します。ここに定義することで、自動的にボリュームが作成されます。

8.2. Webアプリケーション + データベースの例

先ほど作成したFlaskアプリケーションと、それにPostgreSQLデータベースを組み合わせた例を考えます。

  1. Flaskアプリケーションの準備:
    先ほど作成したmy-flask-appディレクトリと、その中のapp.py, requirements.txt, Dockerfileをそのまま使います。

  2. データベースの準備:
    この例では簡単なデータベース操作は含みませんが、コンテナ構成としてPostgreSQLサービスを追加します。

  3. docker-compose.yml ファイルの作成:
    my-flask-appディレクトリの直下に、以下の内容でdocker-compose.ymlファイルを作成します。

    “`yaml

    docker-compose.yml

    version: ‘3.8’

    services:
    # Flask Webアプリケーションサービス
    web:
    build: . # カレントディレクトリのDockerfileを使用
    ports:
    – “5000:5000” # ホストの5000番ポートをコンテナの5000番にマッピング
    volumes:
    – ./app.py:/app/app.py # 開発用にコードをバインドマウントする場合 (任意)
    – ./requirements.txt:/app/requirements.txt # 開発用にこちらもバインドマウント (任意)
    # depends_on: # DBを使うなら、DBサービスに依存することを記述
    # – db

    # PostgreSQLデータベースサービス (webサービスがDBを使う場合に有効化)
    # db:
    # image: postgres:14
    # environment:
    # POSTGRES_DB: myappdb
    # POSTGRES_USER: myuser
    # POSTGRES_PASSWORD: mypassword
    # volumes:
    # – db_data:/var/lib/postgresql/data # データを永続化

    volumes:

    db_data: # dbサービスが使うNamed Volumeを定義

    ``
    今回はシンプルにWebサービスのみを定義し、DBサービスはコメントアウトしています。DBが必要な場合はコメントアウトを外して利用できます。
    volumes`のバインドマウントは、ホスト側でコードを編集した際にすぐにコンテナに反映させたい場合に便利ですが、本番環境では不要なこともあります。

  4. Docker Composeでサービス群を起動する:
    docker-compose.ymlファイルがあるディレクトリ (my-flask-app) で、以下のコマンドを実行します。

    bash
    docker-compose up

    またはバックグラウンドで起動する場合:
    bash
    docker-compose up -d

    • docker-compose up: docker-compose.ymlを読み込み、定義されているサービスを起動します。
    • -d: バックグラウンド(デタッチモード)で実行します。

    初めて実行する場合、webサービスのbuild: .によってDockerイメージがビルドされます。また、定義されているサービス(今回はweb)のコンテナが作成され、起動されます。DBサービスを有効化している場合は、db_dataボリュームが作成され、dbコンテナも起動します。

    実行中のコンテナはdocker psやDocker Desktop GUIのContainersタブで確認できます。GUIのDev Environmentsタブでも、Composeプロジェクトとしてまとめて表示されます。

  5. 動作確認:
    webサービスはホストの5000番ポートにマッピングされているので、ブラウザでhttp://localhost:5000/にアクセスすると、Flaskアプリケーションが表示されるはずです。

  6. Docker Composeでサービス群を停止・削除する:
    サービスをまとめて停止し、コンテナやネットワークなどを削除するには、以下のコマンドを実行します。

    bash
    docker-compose down

    このコマンドは、docker-compose.ymlで定義されているサービスに関連するコンテナ、ネットワーク、ボリューム(匿名ボリュームのみ、名前付きボリュームは削除されない)を停止・削除します。名前付きボリュームも削除したい場合は、-vオプションを追加します。

    bash
    docker-compose down -v

Docker Composeを使うことで、複数のサービスで構成されるアプリケーションの管理が格段に楽になります。開発環境の構築手順をdocker-compose.ymlファイルとしてチーム内で共有すれば、全員が全く同じ環境を簡単に再現できるようになります。

9. Docker Desktopを使いこなすヒントとトラブルシューティング

Docker Desktopをより快適に、そして問題なく使用するためのヒントや、よくあるトラブルシューティングを紹介します。

9.1. リソース管理

Docker Desktopは、ホストマシンのCPU、メモリ、ディスクなどのリソースを使用します。デフォルト設定で問題ないことが多いですが、コンテナを多数起動したり、リソースを多く消費するアプリケーションを動かす場合、パフォーマンスに影響が出ることがあります。

  • Settings > Resources > Advanced: ここでDocker Engineに割り当てるCPUコア数、メモリ容量、スワップ領域、ディスクイメージサイズなどを調整できます。PCの搭載リソースや、同時に実行するコンテナの数・種類に応じて適切に設定を変更することで、ホストマシンの動作が遅くなるのを防いだり、コンテナのパフォーマンスを向上させたりできます。

9.2. ディスクスペースの管理

Dockerはイメージやコンテナ、ボリュームなどをディスクに保存するため、使い続けているとディスクスペースを圧迫することがあります。定期的なクリーンアップが必要です。

  • docker system prune: 先ほど紹介したdocker system pruneコマンドは非常に便利です。
    • docker system prune: 停止中のコンテナ、未使用のネットワーク、danglingイメージ(どのタグとも関連付けられていないイメージ)を削除します。
    • docker system prune -a: 上記に加え、使用されていない全てのイメージを削除します。
    • docker system prune -a --volumes: 上記に加え、使用されていない全てのボリュームも削除します。
  • Docker Desktop GUI > Troubleshoot > Clean / Purge data: GUIからも同様のクリーンアップを実行できます。削除対象を選択して実行できるため、CLIに抵抗がある方でも手軽に行えます。

9.3. ネットワーク関連のトラブルシューティング

  • ポート競合: docker run -p 8080:80のようにホストのポートを公開しようとした際に、ホスト側の8080番ポートが既に他のアプリケーションで使用されているとエラーになります。この場合、別のホストポート(例: 8081:80)に変更するか、他のアプリケーションを停止する必要があります。
  • コンテナにアクセスできない:
    • コンテナが実行中か(docker psまたはGUIで確認)。
    • ポートマッピングが正しく設定されているか(-pオプションやdocker psのPORTS列、またはGUIのContainersタブで確認)。
    • コンテナ内のアプリケーションが指定されたポートでリッスンしているか(docker logsで起動ログを確認したり、docker execでコンテナ内に入ってnetstatなどのコマンドで確認)。
    • ファイアウォールが邪魔していないか。

9.4. コンテナのログを確認する習慣

問題が発生した場合、最も重要な情報源はコンテナのログです。

  • docker logs コンテナ名またはID: アプリケーションが出力するエラーメッセージや警告、起動時の情報などが含まれています。
  • docker logs -f コンテナ名またはID: ログをリアルタイムで監視することで、問題発生時の挙動を追跡できます。
  • Docker Desktop GUIのContainersタブからも簡単にログを確認できます。

9.5. Docker Desktopの再起動やリセット

稀に、Docker Desktop自体がおかしくなって正常に動作しなくなることがあります。その場合、以下の対処を試みてください。

  • Restart Docker Desktop: システムトレイ/メニューバーのDockerアイコンから「Restart」を選択します。多くの場合はこれで解決します。
  • Reset Docker Desktop: Settings > Troubleshoot から「Reset Docker Desktop」を実行できます。ただし、この操作を行うと、ローカルにある全てのコンテナ、イメージ、ボリュームなどが削除されるため、実行前に必ずバックアップや必要なものの確認を行ってください。 これは最終手段として考えましょう。

9.6. 公式ドキュメントの活用

Dockerの機能は多岐にわたり、日々進化しています。この記事で紹介したのはごく基本的な内容です。より深く学びたい場合や、特定の機能(ネットワーク、ボリューム、セキュリティなど)について詳しく知りたい場合は、Dockerの公式ドキュメントを参照することをおすすめします。

  • Docker Documentation: https://docs.docker.com/

10. まとめと次のステップ

この記事では、DockerおよびDocker Desktopの基本的な概念から、インストール、GUIとCLIの基本操作、Dockerfileによるイメージ作成、データの永続化、そしてDocker Composeによる複数コンテナ管理までを解説しました。

Dockerを使うことで、開発環境の構築や共有が驚くほど簡単になり、環境差異による問題を解消できます。また、アプリケーションのデプロイや運用も効率化されます。

まずは、この記事で紹介したハンズオンを繰り返し行い、基本的なコマンドと概念をしっかりと身につけてください。Docker Desktop GUIを活用して、コンテナやイメージの状態を視覚的に把握するのも良いでしょう。

次のステップとして:

  1. ご自身のアプリケーションをコンテナ化してみる: 開発中のWebアプリケーションやツールなどをDockerfile化してみましょう。実際にコンテナとして動かすことで、より実践的な理解が得られます。
  2. データベースなど、他のミドルウェアとの連携を試す: Docker Composeを使って、アプリケーションコンテナとデータベースコンテナを連携させてみましょう。
  3. Docker Hubにアカウントを作成し、独自のイメージをプッシュしてみる: 作成したイメージを公開したり、非公開リポジトリに保存したりできます。
  4. CI/CD (継続的インテグレーション/継続的デリバリー) との連携を学ぶ: DockerはCI/CDパイプラインと非常に相性が良いです。Jenkins, GitHub Actions, GitLab CIなどのツールとDockerを連携させる方法を学びましょう。
  5. コンテナオーケストレーションツールを学ぶ: アプリケーションが大規模になったり、複数のサーバーに分散させたりする場合、コンテナの管理が複雑になります。KubernetesやDocker Swarmといったコンテナオーケストレーションツールが役立ちます。Docker Desktopは単一ノードのKubernetesクラスターを内蔵しているので、手軽にKubernetesを試すことができます。

Dockerは強力なツールであり、学ぶべきことはたくさんありますが、その学習コストに見合うだけの大きなメリットがあります。ぜひDockerを使いこなして、より快適な開発・運用ライフを実現してください!

この記事が、あなたのDocker学習の第一歩として役立てば幸いです。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール