'docker-compose: command not found' エラーの解決

DockerBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、Docker ユーザーがよく遭遇する「docker-compose: command not found」エラーを解決するための実践的なガイドを提供します。Docker Compose は、マルチコンテナ Docker アプリケーションを管理するための不可欠なツールであり、このエラーに遭遇するとワークフローが妨げられる可能性があります。この実験を完了することで、この問題をトラブルシューティングして修正するためのスキルを習得し、コンテナ化されたアプリケーションの効果的な開発とデプロイを継続できるようになります。

docker compose command not found

この実験(Lab)は学習にインターネット接続を必要とするため、Pro ユーザーのみが VM を開始できます。アカウントを Pro にアップグレードしてください。

Docker Compose の理解とインストール確認

Docker Compose とは?

Docker Compose は、マルチコンテナアプリケーションを定義し、共有するのに役立つツールです。Compose を使用すると、アプリケーションのサービスを構成するための YAML ファイルを作成し、単一のコマンドで全てのサービスを開始できます。連携して動作する複数のコンテナを管理するプロセスを簡素化します。

Docker Compose がインストールされているか確認する

まず、Docker Compose が既にシステムにインストールされているかどうかを確認しましょう。ターミナルを開き、以下を実行します。

docker-compose --version

次のような出力が表示されます。

docker-compose: command not found
command not found

ただし、docker-compose: command not found のようなエラーメッセージが表示された場合、Docker Compose がインストールされていないか、システムの PATH に正しく設定されていないことを意味します。

Docker のインストール確認

Docker Compose をインストールする前に、Docker 自体が正しくインストールされていることを確認しましょう。以下を実行します。

docker --version

次のような出力が表示されるはずです。

Docker version 20.10.21, build 20.10.21-0ubuntu1~22.04.3

この出力が表示されない場合、Docker が正しくインストールされていない可能性があります。ただし、この実験(Lab)では、Docker Compose の問題の解決に焦点を当てます。

Docker Compose のインストール

Docker Compose がインストールされていないか、アクセスできないことを確認したので、インストールしましょう。Docker Compose をインストールする方法はいくつかありますが、Ubuntu システムで最も簡単な方法に焦点を当てます。

方法 1: apt パッケージマネージャーを使用する

Docker Compose をインストールする最も簡単な方法は、apt パッケージマネージャーを使用することです。それでは、やってみましょう。

  1. まず、リポジトリを設定し、依存関係をインストールします。
## Docker の公式 GPG キーを追加します。
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

## Apt ソースにリポジトリを追加します。
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

更新プロセスを示す出力が表示されるはずです。

  1. 次に、Docker Compose をインストールします。
sudo apt install -y docker-compose-plugin

インストール進行状況を示す出力が表示されます。

  1. インストールが完了したら、バージョンを確認して動作を確認します。
docker compose version

注:新しい Docker インストールでは、コマンドは docker compose (スペースあり) であり、docker-compose (ハイフンあり) ではありません。

次のような出力が表示されるはずです。

Docker Compose version v2.33.1

方法 2: curl を使用して特定のバージョンをインストールする

apt メソッドを使用して既に Docker Compose をインストールしている場合は、この方法はスキップできます。

apt メソッドが機能しない場合や、特定のバージョンが必要な場合は、Docker Compose を直接インストールできます。

  1. Docker CLI プラグイン用のディレクトリがまだ存在しない場合は、作成します。
mkdir -p ~/.docker/cli-plugins/
  1. Docker Compose バイナリをダウンロードします。
curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose

ファイルのダウンロード中にプログレスバーが表示されます。

  1. バイナリを実行可能にします。
chmod +x ~/.docker/cli-plugins/docker-compose
  1. インストールを確認します。
docker compose version

Docker Compose のバージョンを示す出力が表示されるはずです。

簡単な Docker Compose プロジェクトの作成

Docker Compose を正常にインストールしたので、すべてが正しく動作していることを確認するために、簡単な Docker Compose プロジェクトを作成しましょう。

プロジェクトディレクトリの作成

まず、Docker Compose プロジェクト用のディレクトリを作成しましょう。

mkdir -p ~/project/docker-compose-test
cd ~/project/docker-compose-test

Docker Compose ファイルの作成

次に、基本的な Nginx Web サーバーを実行する簡単な Docker Compose ファイルを作成しましょう。nano テキストエディタを使用して、docker-compose.yml という名前のファイルを作成します。

nano docker-compose.yml

エディタで、次の内容を追加します。

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html

この構成は以下を定義しています。

  • 最新の Nginx イメージを使用する "web" という名前のサービス
  • コンテナのポート 80 からホストのポート 8080 へのポートマッピング
  • ローカルディレクトリを Nginx の Web ルートにマッピングするボリューム

Ctrl+O を押して Enter を押してファイルを保存し、Ctrl+X を押して nano を終了します。

HTML コンテンツの作成

html ディレクトリと簡単な index.html ファイルを作成しましょう。

mkdir -p html
nano html/index.html

エディタで、次の HTML コンテンツを追加します。

<!DOCTYPE html>
<html>
  <head>
    <title>Docker Compose Test</title>
  </head>
  <body>
    <h1>Docker Compose is working!</h1>
    <p>
      If you can see this page, you have successfully resolved the
      docker-compose issue.
    </p>
  </body>
</html>

Ctrl+O を押して Enter を押してファイルを保存し、Ctrl+X を押して nano を終了します。

Docker Compose プロジェクトの実行

次に、Docker Compose プロジェクトを実行しましょう。

docker compose up -d

-d フラグは、コンテナをデタッチモード (バックグラウンド) で実行します。

次のような出力が表示されるはずです。

Creating network "docker-compose-test_default" with the default driver
Creating docker-compose-test_web_1 ... done

これは、Docker Compose がコンテナを正常に作成し、起動したことを示しています。

Web サーバーの検証

Web サーバーが正しく実行されていることを確認しましょう。

curl http://localhost:8080

先ほど作成した HTML コンテンツが表示されるはずです。

<!DOCTYPE html>
<html>
  <head>
    <title>Docker Compose Test</title>
  </head>
  <body>
    <h1>Docker Compose is working!</h1>
    <p>
      If you can see this page, you have successfully resolved the
      docker-compose issue.
    </p>
  </body>
</html>

これにより、Docker Compose が正しく動作していることが確認できます。

docker compose is working

Docker Compose アプリケーションの管理

Docker Compose アプリケーションを正常にセットアップして実行したので、さまざまな Docker Compose コマンドを使用してそれを管理する方法を学びましょう。

実行中のコンテナの確認

Docker Compose コンテナの状態を確認するには、次を実行します。

cd ~/project/docker-compose-test
docker compose ps

次のような出力が表示されるはずです。

NAME                        COMMAND                  SERVICE             STATUS              PORTS
docker-compose-test-web-1   "/docker-entrypoint.…"   web                 running             0.0.0.0:8080->80/tcp

これは、Nginx Web サーバーコンテナが実行されており、ポートマッピングがアクティブであることを示しています。

コンテナログの表示

コンテナからのログを表示するには、次を実行します。

docker compose logs

これにより、Docker Compose アプリケーション内のすべてのコンテナからの結合されたログが表示されます。Nginx の起動メッセージなどを含む出力が表示されるはずです。

特定のサービスのログを表示するには、その名前を指定します。

docker compose logs web

アプリケーションの停止

コンテナを削除せずに Docker Compose アプリケーションを停止するには、次を実行します。

docker compose stop

コンテナが停止していることを示す出力が表示されるはずです。

✔ Container docker-compose-test-web-1  Stopped

コンテナが停止していることを確認するには、その状態を確認します。

docker compose ps

コンテナが実行されなくなったことがわかるはずです。

アプリケーションの再起動

停止したコンテナを再度起動するには、次を実行します。

docker compose start

コンテナが起動していることを示す出力が表示されるはずです。

✔ Container docker-compose-test-web-1  Started

再度実行されていることを確認します。

docker compose ps

アプリケーションの停止と削除

Docker Compose アプリケーションが完了したら、単一のコマンドで、すべてのコンテナ、ネットワーク、およびボリュームを停止して削除できます。

docker compose down

次のような出力が表示されるはずです。

✔ Container docker-compose-test-web-1  Removed
✔ Network docker-compose-test_default  Removed

これは、コンテナが停止して削除され、それらのために作成されたネットワークも削除されたことを示しています。

よくある Docker Compose の問題のトラブルシューティング

このステップはオプションです。Docker Compose の問題のトラブルシューティングを練習したくない場合は、スキップできます。

「docker-compose: command not found」エラーを解決した後でも、Docker Compose で他の一般的な問題が発生する可能性があります。これらの問題とその解決策を見ていきましょう。

問題 1: 既存のコンテナとの競合

次のようなエラーが発生することがあります。

ERROR: for web  Cannot create container for service web: Conflict. The container name "/docker-compose-test-web-1" is already in use by container.

これは、同じ名前のコンテナが既に存在する場合に発生します。これに対処する方法を見てみましょう。

  1. まず、既存のコンテナがないか確認します。
docker ps -a

このコマンドは、停止したコンテナを含むすべてのコンテナを一覧表示します。

  1. 競合する名前のコンテナが表示された場合は、それを削除できます。
docker rm -f docker-compose-test-web-1

docker-compose-test-web-1 を、出力からの実際のコンテナ名に置き換えます。

問題 2: 権限拒否エラー

Docker Compose を使用しているときに、権限エラーが表示されることがあります。これらは、Docker コマンドが通常、root 権限を必要とするために発生することがよくあります。次のようなエラーが表示された場合:

ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

Docker Compose コマンドで sudo を使用するか、ユーザーが Docker グループに属していることを確認する必要がある場合があります。ユーザーを Docker グループに追加するには、次のようにします。

sudo usermod -aG docker $USER

注:これを有効にするには、ログアウトして再度ログインする必要があります。この実験では、必要に応じてコマンドで sudo を使用できます。

問題 3: ポートの競合

次のようなエラーが表示された場合:

ERROR: for web  Cannot start service web: driver failed programming external connectivity on endpoint: Bind for 0.0.0.0:8080 failed: port is already allocated

これは、別のサービスが既にポート 8080 を使用していることを意味します。これを解決するには、次の手順に従います。

  1. ポート 8080 を使用しているものを探します。
sudo lsof -i :8080
  1. そのサービスを停止するか、docker-compose.yml を変更して別のポートを使用します。
nano docker-compose.yml

ポートマッピングを "8080:80" から "8081:80" のように変更し、保存して終了します。

  1. Docker Compose アプリケーションを再度起動します。
docker compose up -d

ポートの競合を修正する練習をしましょう

意図的にポートの競合を作成し、それを解決してみましょう。

  1. 同じポートで新しい Docker Compose プロジェクトを作成します。
mkdir -p ~/project/another-test
cd ~/project/another-test
nano docker-compose.yml
  1. 次の内容を追加します。
version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"

保存して終了します。

  1. 新しいサービスを開始します。
docker compose up -d
  1. 次に、元のプロジェクトに戻り、それを起動してみます。
cd ~/project/docker-compose-test
docker compose up -d

ポートの競合エラーが表示されるはずです。

  1. 元の docker-compose.yml を変更して、代わりにポート 8081 を使用します。
nano docker-compose.yml

"8080:80""8081:80" に変更し、保存して終了します。

  1. もう一度起動してみます。
docker compose up -d

これで、両方のサービスが実行され、1 つはポート 8080 で、もう 1 つはポート 8081 で実行されるはずです。

  1. 両方のプロジェクトを停止して削除して、クリーンアップします。
docker compose down
cd ~/project/another-test
docker compose down

まとめ

「docker-compose: command not found」エラーの解決に関するこの実験を完了したことをおめでとうございます。次のことを正常に実行しました。

  1. Docker および Docker Compose のインストール状態を確認しました。
  2. さまざまな方法を使用して Docker Compose をインストールしました。
  3. 簡単な Docker Compose アプリケーションを作成して実行しました。
  4. アプリケーションを管理するための重要な Docker Compose コマンドを学習しました。
  5. よくある Docker Compose の問題とその解決策を探求しました。

これらのスキルは、今後、マルチコンテナ Docker アプリケーションを操作する際に役立ちます。学習したトラブルシューティング技術は、他の多くの Docker 関連の問題にも適用でき、開発ワークフローをよりスムーズかつ効率的にすることができます。