Docker Compose 플러그인 오류 해결 방법: 패키지를 찾을 수 없음

DockerBeginner
지금 연습하기

소개

이 랩에서는 Docker Compose 를 사용할 때 흔히 발생하는 "unable to locate package docker-compose-plugin" 오류를 해결하는 방법을 배우게 됩니다. Docker Compose 는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하는 데 필수적인 도구이지만, 사용자는 종종 설치 문제를 겪습니다. 이 랩에서는 문제의 원인을 이해하고 Ubuntu 22.04 시스템에서 Docker Compose 가 제대로 작동하도록 단계별 솔루션을 구현하는 방법을 안내합니다.

Docker Compose 와 오류 이해

오류를 해결하기 전에 Docker Compose 가 무엇인지, 그리고 이 오류가 발생하는 이유를 이해해 보겠습니다.

Docker Compose 란 무엇인가요?

Docker Compose 는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구입니다. Compose 를 사용하면 YAML 파일을 사용하여 애플리케이션의 서비스, 네트워크 및 볼륨을 구성합니다. 그런 다음 단일 명령으로 구성에서 모든 서비스를 생성하고 시작합니다.

Docker Compose 는 특히 다음과 같은 경우에 유용합니다.

  • 개발 환경
  • 자동화된 테스트
  • 단일 호스트 배포

"Unable to Locate Package" 오류

다음 명령을 사용하여 Docker Compose 를 설치하려고 할 때:

sudo apt-get install docker-compose-plugin

다음과 같은 오류가 발생할 수 있습니다.

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package docker-compose-plugin

이 오류는 패키지 이름이 변경되었거나 시스템에 패키지 저장소가 제대로 구성되지 않았기 때문에 발생합니다.

현재 Docker 설치 확인

먼저 Docker 가 올바르게 설치되었는지 확인해 보겠습니다. 다음을 실행합니다.

docker --version

다음과 유사한 출력이 표시되어야 합니다.

Docker version 20.10.21, build baeda1f

이는 Docker 가 설치되었음을 확인합니다. 이제 Docker Compose 의 어떤 버전이 이미 설치되어 있는지 확인해 보겠습니다.

docker compose version

"command not found" 오류가 발생하면 Docker Compose 가 아직 설치되지 않았음을 확인합니다.

docker: 'compose' is not a docker command.

이제 문제를 이해했으므로 다음 단계에서 이를 해결해 보겠습니다.

Docker Compose 설치

Docker 가 설치되었지만 Docker Compose 가 없는 것을 확인했으므로 Docker Compose 를 올바르게 설치해 보겠습니다. Ubuntu 22.04 에서 Docker Compose 를 설치하는 두 가지 주요 방법이 있습니다.

  1. Docker CLI 용 Docker Compose 플러그인 사용
  2. 독립 실행형 Docker Compose 바이너리 사용

Docker Engine 버전 20.10.21 에 권장되는 첫 번째 방법을 사용해 보겠습니다.

패키지 목록 업데이트

먼저 패키지 목록이 최신 상태인지 확인합니다.

sudo apt-get update

패키지 목록이 업데이트되는 것을 보여주는 출력이 표시되어야 합니다.

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
...
Reading package lists... Done

Docker Compose 플러그인 설치

Ubuntu 22.04 에서는 공식 Docker 저장소에서 Docker Compose 플러그인을 설치해야 합니다. 먼저 필요한 사전 요구 사항이 있는지 확인해 보겠습니다.

sudo apt-get install -y ca-certificates curl gnupg

이제 Docker 의 공식 GPG 키를 추가합니다.

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

Apt 소스에 저장소를 추가합니다.

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Docker 패키지로 패키지 데이터베이스를 업데이트합니다.

sudo apt-get update

이제 Docker Compose 플러그인을 설치합니다.

sudo apt-get install -y docker-compose-plugin

설치가 성공적으로 진행되는 것을 볼 수 있습니다.

Reading package lists... Done
Building dependency tree... Done
...
Setting up docker-compose-plugin (2.6.0~ubuntu-1~22.04.1) ...
Processing triggers for man-db (2.10.2-1) ...

Docker Compose 가 이제 설치되었는지 확인해 보겠습니다.

docker compose version

다음과 유사한 출력이 표시되어야 합니다.

Docker Compose version v2.6.0

이제 Docker CLI 용 Docker Compose 플러그인을 성공적으로 설치했습니다.

Docker Compose 테스트

이제 Docker Compose 를 성공적으로 설치했으므로 제대로 작동하는지 테스트하기 위해 간단한 프로젝트를 만들어 보겠습니다.

프로젝트 디렉토리 생성

먼저 테스트 프로젝트를 위한 디렉토리를 만들어 보겠습니다.

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

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 이미지를 사용하여 간단한 웹 서버를 정의합니다. 호스트의 포트 8080 을 컨테이너의 포트 80 에 매핑하고 로컬 디렉토리를 마운트하여 HTML 콘텐츠를 제공합니다.

Ctrl+O를 누른 다음 Enter를 눌러 파일을 저장하고 Ctrl+X로 nano 를 종료합니다.

HTML 콘텐츠 생성

HTML 콘텐츠를 위한 디렉토리와 간단한 HTML 파일을 만들어 보겠습니다.

mkdir -p html
nano html/index.html

HTML 파일에 다음 내용을 추가합니다.

<!DOCTYPE html>
<html>
  <head>
    <title>Docker Compose Test</title>
  </head>
  <body>
    <h1>Hello from Docker Compose!</h1>
    <p>If you can see this, your Docker Compose setup is working correctly.</p>
  </body>
</html>

파일을 저장하고 nano 를 종료합니다.

Docker Compose 애플리케이션 시작

이제 Docker Compose 애플리케이션을 시작해 보겠습니다.

docker compose up -d

다음과 유사한 출력이 표시되어야 합니다.

[+] Running 2/2
 ⠿ Network docker-compose-test_default  Created
 ⠿ Container docker-compose-test-web-1  Started

이는 Docker Compose 가 네트워크를 생성하고 Nginx 컨테이너를 시작했음을 나타냅니다.

애플리케이션이 실행 중인지 확인

컨테이너가 실행 중인지 확인해 보겠습니다.

docker compose ps

다음과 유사한 출력이 표시되어야 합니다.

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

이제 웹 서버에 요청을 보내 콘텐츠를 제공하는지 확인해 보겠습니다.

curl http://localhost:8080

생성한 HTML 콘텐츠가 표시되어야 합니다.

<!DOCTYPE html>
<html>
  <head>
    <title>Docker Compose Test</title>
  </head>
  <body>
    <h1>Hello from Docker Compose!</h1>
    <p>If you can see this, your Docker Compose setup is working correctly.</p>
  </body>
</html>

훌륭합니다! Docker Compose 애플리케이션을 성공적으로 생성하고 실행했습니다.

Docker Compose 애플리케이션 중지

Docker Compose 가 생성한 컨테이너, 네트워크 및 볼륨을 중지하고 제거하려면 다음을 실행합니다.

docker compose down

다음과 유사한 출력이 표시되어야 합니다.

[+] Running 2/2
 ⠿ Container docker-compose-test-web-1  Removed
 ⠿ Network docker-compose-test_default  Removed

이는 Docker Compose 가 생성한 리소스를 정리했음을 확인합니다.

일반적인 Docker Compose 명령어 이해

Docker Compose 가 작동하므로 프로젝트에서 사용할 몇 가지 일반적인 명령어와 구성을 살펴보겠습니다.

필수 Docker Compose 명령어

다음은 가장 일반적으로 사용되는 Docker Compose 명령어입니다.

  1. 서비스 시작:

    docker compose up -d

    -d 플래그는 컨테이너를 백그라운드에서 실행합니다 (detached mode).

  2. 서비스 중지:

    docker compose stop

    이렇게 하면 컨테이너를 제거하지 않고 중지합니다.

  3. 서비스 중지 및 제거:

    docker compose down

    이렇게 하면 컨테이너를 중지하고 up으로 생성된 컨테이너, 네트워크, 볼륨 및 이미지를 제거합니다.

  4. 로그 보기:

    docker compose logs

    로그를 실시간으로 따라가려면 -f 플래그를 추가합니다.

    docker compose logs -f
  5. 컨테이너 나열:

    docker compose ps

    이렇게 하면 Docker Compose 서비스의 상태가 표시됩니다.

  6. 컨테이너 내에서 명령어 실행:

    docker compose exec <service-name> <command>

    예를 들어, 웹 서비스에서 셸을 실행하려면:

    docker compose exec web bash

더 복잡한 Docker Compose 구성 만들기

여러 서비스를 포함하는 더 복잡한 Docker Compose 구성을 만들어 보겠습니다. 이 예제를 위해 새 디렉토리를 만듭니다.

mkdir -p ~/project/complex-compose
cd ~/project/complex-compose

docker-compose.yml 파일을 만듭니다.

nano docker-compose.yml

다음 내용을 추가합니다.

version: "3"

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./nginx/html:/usr/share/nginx/html
    depends_on:
      - app
    networks:
      - frontend
      - backend

  app:
    image: node:14-alpine
    working_dir: /app
    volumes:
      - ./app:/app
    command: "node server.js"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      - DB_PORT=5432
    depends_on:
      - db
    networks:
      - backend

  db:
    image: postgres:13-alpine
    environment:
      - POSTGRES_USER=myuser
      - POSTGRES_PASSWORD=mypassword
      - POSTGRES_DB=mydb
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend

networks:
  frontend:
  backend:

volumes:
  db-data:

파일을 저장하고 nano 를 종료합니다.

이 구성은 세 가지 서비스를 정의합니다.

  1. 웹 서버 (nginx)
  2. 백엔드 애플리케이션 (Node.js)
  3. 데이터베이스 (PostgreSQL)

또한 트래픽을 격리하기 위한 네트워크와 영구적인 데이터베이스 스토리지를 위한 볼륨을 정의합니다.

복잡한 구성을 위한 디렉토리 및 파일 만들기

필요한 디렉토리와 파일을 만들어 보겠습니다.

mkdir -p nginx/html app

간단한 HTML 파일을 만듭니다.

nano nginx/html/index.html

다음 내용을 추가합니다.

<!DOCTYPE html>
<html>
  <head>
    <title>Complex Docker Compose Example</title>
  </head>
  <body>
    <h1>Complex Docker Compose Example</h1>
    <p>
      This page is served by Nginx, and the application is powered by Node.js
      with PostgreSQL.
    </p>
  </body>
</html>

파일을 저장하고 nano 를 종료합니다.

간단한 Node.js 서버를 만듭니다.

nano app/server.js

다음 내용을 추가합니다.

const http = require("http");

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader("Content-Type", "text/plain");
  res.end("Hello from Node.js server!\n");
});

const port = 3000;
server.listen(port, () => {
  console.log(`Server running on port ${port}`);
  console.log(
    `Database connection info: ${process.env.DB_HOST}:${process.env.DB_PORT}`
  );
});

파일을 저장하고 nano 를 종료합니다.

이 설정은 더 복잡하며 실제 애플리케이션 아키텍처를 나타내지만, 더 많은 설정이 필요하므로 이 랩에서는 시작하지 않습니다.

Docker Compose 모범 사례

Docker Compose 를 사용할 때 따라야 할 몇 가지 모범 사례는 다음과 같습니다.

  1. 환경 변수 사용: 암호와 같은 민감한 정보를 환경 변수 또는 .env 파일에 저장합니다.

  2. 재시작 정책 정의: 프로덕션 환경의 경우 재시작 정책을 설정합니다.

    services:
      web:
        restart: always
  3. 특정 이미지 태그 사용: 프로덕션에서는 예상치 못한 변경 사항이 발생할 수 있으므로 latest를 사용하지 마십시오.

  4. 구성 정리: 복잡한 설정의 경우 docker-compose.override.yml 패턴을 사용하여 구성을 여러 파일로 분할합니다.

  5. 리소스 제한 설정: 컨테이너 리소스 고갈 방지:

    services:
      web:
        deploy:
          resources:
            limits:
              cpus: "0.5"
              memory: 512M

이러한 모범 사례를 따르면 더 유지 관리 가능하고 강력한 Docker Compose 구성을 만들 수 있습니다.

요약

이 랩에서는 다음을 통해 "unable to locate package docker-compose-plugin" 오류를 성공적으로 해결하는 방법을 배웠습니다.

  1. Docker Compose 가 무엇인지 이해하고 오류를 진단합니다.
  2. 공식 Docker 저장소를 추가하여 Docker Compose 를 올바르게 설치합니다.
  3. 간단한 Docker Compose 애플리케이션을 생성하고 테스트합니다.
  4. 더 복잡한 Docker Compose 구성 및 모범 사례를 탐색합니다.

이제 작동하는 Docker Compose 설치와 다중 컨테이너 Docker 애플리케이션 관리에 사용할 수 있는 지식을 갖게 되었습니다. 이 기반은 향후 더 복잡한 컨테이너화된 솔루션을 구축할 때 유용할 것입니다.

습득한 기술은 다음과 같습니다.

  • Ubuntu 에서 패키지 설치 문제 해결
  • Docker 저장소 작업
  • Docker Compose 구성 생성 및 실행
  • Docker Compose 를 사용하여 컨테이너화된 애플리케이션 관리

이러한 기술은 현대적인 애플리케이션 개발 및 배포 워크플로우에 필수적입니다.