Docker Compose 설치 및 사용 입문 가이드

DockerBeginner
지금 연습하기

소개

이 초보자 가이드에서는 Docker 와 Docker Compose 를 설치하는 방법과 Compose 를 사용하여 애플리케이션을 정의, 배포 및 관리하는 방법을 안내합니다. Docker Compose 에서 사용 가능한 주요 기능 및 구성 옵션과 Compose 애플리케이션을 확장 및 로드 밸런싱하는 최상의 방법에 대해 알아볼 것입니다.

Docker Compose 란 무엇인가요?

Docker Compose 는 여러 컨테이너로 구성된 Docker 애플리케이션을 정의하고 실행할 수 있는 도구입니다. 애플리케이션의 서비스, 네트워크, 볼륨을 선언적으로 정의하여 여러 Docker 컨테이너를 관리하고 조정하는 과정을 단순화합니다.

Docker Compose 를 사용하면 다음과 같은 작업을 수행할 수 있습니다.

애플리케이션 서비스 정의

웹 서버, 데이터베이스, 메시지 큐와 같은 애플리케이션을 구성하는 다양한 서비스를 하나의 YAML 파일에서 정의할 수 있습니다. 이 파일 (Compose 파일) 은 사용할 Docker 이미지, 노출할 네트워크 포트, 마운트할 환경 변수 또는 볼륨 등 각 서비스의 구성을 설명합니다.

애플리케이션의 수명주기 관리

Docker Compose 는 전체 애플리케이션의 시작, 중지 및 관리를 위한 명령어를 제공합니다. docker-compose up 명령어를 사용하여 Compose 파일에서 정의된 모든 서비스를 생성하고 시작하며, docker-compose down 명령어를 사용하여 서비스를 중지하고 제거할 수 있습니다.

개발 및 테스트 단순화

Docker Compose 는 애플리케이션의 개발 및 테스트 단계에서 특히 유용합니다. 필요한 모든 서비스를 갖춘 완전한 개발 환경을 손쉽게 구축하여 애플리케이션을 일관되고 재현 가능한 방식으로 테스트할 수 있도록 합니다.

graph TD
    A[개발자] --> B[Docker Compose]
    B --> C[웹 서버]
    B --> D[데이터베이스]
    B --> E[메시지 큐]

Docker Compose 를 사용하면 개발 환경에서부터 프로덕션 환경까지 애플리케이션이 동일한 방식으로 실행되도록 보장하여 환경 특정 문제 발생 가능성을 줄일 수 있습니다.

서비스 이미지 포트 환경 변수
웹 서버 nginx:latest 80:80 -
데이터베이스 mysql:5.7 3306:3306 MYSQL_ROOT_PASSWORD=password
메시지 큐 rabbitmq:3-management 5672:5672, 15672:15672 -

요약하자면, Docker Compose 는 여러 컨테이너로 구성된 Docker 애플리케이션의 관리 및 배포를 단순화하는 강력한 도구로, 복잡한 애플리케이션을 일관되고 재현 가능한 방식으로 개발, 테스트 및 실행하는 데 도움이 됩니다.

Docker 및 Docker Compose 설치

Docker Compose 를 사용하기 전에 시스템에 Docker 와 Docker Compose 를 설치해야 합니다. 이 섹션에서는 Ubuntu 22.04 시스템에서의 설치 과정을 안내합니다.

Docker 설치

  1. 패키지 인덱스 업데이트:
sudo apt-get update
  1. APT 가 HTTPS 를 통해 리포지토리를 사용할 수 있도록 필요한 패키지 설치:
sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
  1. 공식 Docker GPG 키 추가:
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  1. Docker 리포지토리 설정:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. Docker Engine 설치:
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  1. 다음 명령어를 실행하여 설치 확인:
sudo docker run hello-world

Docker Compose 설치

Ubuntu 22.04 에서 Docker Engine 설치 과정의 일부로 Docker Compose 가 설치됩니다. 하지만 특정 버전의 Docker Compose 를 설치해야 하는 경우 다음 단계를 따르세요.

  1. 최신 버전의 Docker Compose 다운로드:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. Docker Compose 바이너리에 실행 권한 부여:
sudo chmod +x /usr/local/bin/docker-compose
  1. 다음 명령어를 실행하여 설치 확인:
docker-compose --version

이제 Docker 와 Docker Compose 가 설치되었으므로 Docker Compose 를 사용하여 여러 컨테이너 애플리케이션을 정의하고 배포할 준비가 되었습니다.

Compose 파일에서 서비스 정의

Docker Compose 애플리케이션의 핵심은 YAML 형식으로 작성된 Compose 파일입니다. 이 파일에서 애플리케이션을 구성하는 다양한 서비스와 그 구성을 정의합니다.

서비스 정의

Compose 파일의 각 서비스는 web, db, 또는 redis와 같은 최상위 키로 정의됩니다. 각 서비스 아래에서는 사용할 Docker 이미지, 노출할 네트워크 포트, 환경 변수 등 다양한 구성 옵션을 지정할 수 있습니다.

다음은 세 가지 서비스를 포함하는 간단한 Compose 파일 예제입니다.

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

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - db-data:/var/lib/mysql

  redis:
    image: redis:latest
    ports:
      - 6379:6379

volumes:
  db-data:

이 예제에서 세 가지 서비스가 있습니다.

  1. web: 최신 버전의 Nginx 웹 서버를 실행하고, 호스트의 포트 80 을 컨테이너의 포트 80 으로 매핑하며, 호스트의 ./app 디렉터리를 컨테이너의 /usr/share/nginx/html 디렉터리로 마운트합니다.

  2. db: MySQL 5.7 데이터베이스를 실행하고, MYSQL_ROOT_PASSWORD 환경 변수를 설정하며, 지정된 볼륨 db-data를 마운트하여 데이터베이스 데이터를 저장합니다.

  3. redis: 최신 버전의 Redis 인메모리 데이터 저장소를 실행하고, 호스트의 포트 6379 를 컨테이너의 포트 6379 로 매핑합니다.

볼륨 및 네트워크

서비스를 정의하는 것 외에도 Compose 파일에서는 서비스에서 사용할 수 있는 공유 볼륨 및 네트워크를 정의할 수 있습니다.

위의 예제에서 MySQL 데이터베이스 데이터를 저장하기 위해 지정된 볼륨 db-data를 정의했습니다. 이 볼륨은 여러 서비스 간에 공유될 수 있으며, 컨테이너가 중지되거나 다시 생성되더라도 데이터가 유지됩니다.

또한 서비스 간 연결을 제어하기 위해 사용자 정의 네트워크를 정의할 수 있습니다. 특정 서비스를 분리하거나 더 복잡한 네트워크 토폴로지를 생성하려는 경우 유용합니다.

Compose 파일을 사용하면 애플리케이션의 다양한 구성 요소를 쉽게 정의하고 관리하여 여러 컨테이너 Docker 애플리케이션을 배포, 확장 및 유지 관리하기가 더 쉬워집니다.

Compose 애플리케이션 배포 및 관리

Compose 파일에서 서비스를 정의한 후 Docker Compose 명령어를 사용하여 애플리케이션을 배포하고 관리할 수 있습니다.

애플리케이션 배포

애플리케이션을 배포하려면 Compose 파일이 있는 디렉터리로 이동하여 다음 명령어를 실행합니다.

docker-compose up -d

-d 플래그는 컨테이너를 분리된 모드로 실행하는 것을 의미하며, 이는 백그라운드에서 실행된다는 것을 의미합니다.

Docker Compose 는 Compose 파일을 읽고 필요한 Docker 네트워크와 볼륨을 생성하며 정의된 모든 서비스를 시작합니다.

애플리케이션 라이프사이클 관리

애플리케이션을 배포한 후 다음 Docker Compose 명령어를 사용하여 라이프사이클을 관리할 수 있습니다.

  • docker-compose stop: 모든 실행 중인 서비스를 중지합니다.
  • docker-compose start: 중지된 서비스를 시작합니다.
  • docker-compose restart: 모든 실행 중인 서비스를 다시 시작합니다.
  • docker-compose down: 모든 서비스, 네트워크 및 볼륨을 중지하고 제거합니다.

예를 들어, 애플리케이션을 중지하려면 다음을 실행할 수 있습니다.

docker-compose stop

다시 시작하려면 다음을 실행할 수 있습니다.

docker-compose start

서비스 확장

Docker Compose 는 서비스를 쉽게 확장하거나 축소할 수 있도록 지원합니다. 특정 서비스를 확장하려면 scale 명령어를 사용할 수 있습니다.

docker-compose scale web=3 db=2

이렇게 하면 web 서비스를 3 개 인스턴스로, db 서비스를 2 개 인스턴스로 확장합니다.

애플리케이션을 배포할 때 --scale 플래그를 사용하여 up 명령어를 사용하여 서비스를 확장할 수도 있습니다.

docker-compose up --scale web=3 --scale db=2 -d

로그 보기

애플리케이션 로그를 보려면 logs 명령어를 사용할 수 있습니다.

docker-compose logs

이렇게 하면 모든 서비스의 로그가 표시됩니다. 특정 서비스의 로그를 보려면 서비스 이름을 지정할 수 있습니다.

docker-compose logs web

이러한 Docker Compose 명령어를 사용하면 여러 컨테이너 애플리케이션을 쉽게 배포, 관리 및 확장할 수 있으므로 복잡한 애플리케이션을 일관되고 재현 가능한 방식으로 개발, 테스트 및 실행하는 데 도움이 됩니다.

고급 Compose 기능 및 구성

기본 Compose 파일 구조와 명령어는 강력하지만, Docker Compose 는 더 복잡하고 강력한 애플리케이션을 구축하는 데 도움이 되는 다양한 고급 기능과 구성 옵션을 제공합니다.

환경 변수 및 시크릿

환경 변수를 사용하여 서비스에 구성 설정을 전달할 수 있습니다. Docker Compose 는 서비스 또는 전역 수준에서 정의할 수 있는 빌드 시간 및 실행 시간 환경 변수를 모두 지원합니다.

또한, 데이터베이스 암호 또는 API 키와 같은 민감한 정보를 안전하게 저장하고 서비스에 제공할 수 있도록 Docker 시크릿을 사용할 수 있습니다.

version: "3"
services:
  web:
    image: myapp/web
    environment:
      - DATABASE_URL=mysql://root:${DB_PASSWORD}@db/myapp
    secrets:
      - db-password

secrets:
  db-password:
    file: ./db-password.txt

종속성 관리 및 건강 체크

Docker Compose 는 서비스 종속성을 정의하여 서비스가 올바른 순서로 시작되고 종속 서비스가 다른 서비스를 시작하기 전에 건강한 상태인지 확인할 수 있도록 합니다.

서비스에 대한 건강 체크를 구성하여 Compose 가 컨테이너의 상태를 모니터링하고, 건강하지 않은 컨테이너를 다시 시작하는 등 적절한 조치를 취할 수 있도록 합니다.

version: "3"
services:
  web:
    image: myapp/web
    depends_on:
      db:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 5

  db:
    image: mysql:5.7
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 30s
      timeout: 10s
      retries: 5

네트워킹 및 서비스 검색

Docker Compose 는 애플리케이션에 대한 기본 네트워크를 자동으로 생성하지만, 사용자 정의 네트워크를 정의하고 서비스의 네트워크 구성을 제어할 수도 있습니다.

또한, Compose 는 내장된 서비스 검색 기능을 제공하여 서비스가 Compose 파일에서 정의된 서비스 이름을 사용하여 서로를 찾고 통신할 수 있도록 합니다.

version: "3"
services:
  web:
    image: myapp/web
    networks:
      - frontend
    environment:
      - DB_HOST=db

  db:
    image: mysql:5.7
    networks:
      - backend

networks:
  frontend:
  backend:

이러한 고급 기능을 활용하여 조직의 요구 사항을 충족하는 더 복잡하고 강력하며 확장 가능한 Docker Compose 애플리케이션을 구축할 수 있습니다.

Compose 를 이용한 확장 및 로드 밸런싱

Docker Compose 를 사용하는 주요 이점 중 하나는 서비스를 쉽게 확장하고 로드 밸런싱을 구현할 수 있다는 것입니다. 이 섹션에서는 이러한 기능을 달성하는 방법을 살펴봅니다.

서비스 확장

앞서 언급했듯이 scale 명령어를 사용하여 서비스를 확장하거나 축소할 수 있습니다. 이는 증가하는 트래픽이나 리소스 요구 사항을 처리해야 할 때 특히 유용합니다.

예를 들어, Compose 파일에 web 서비스가 정의되어 있다고 가정해 보겠습니다.

version: "3"
services:
  web:
    image: myapp/web
    ports:
      - 80:80

web 서비스를 3 개 인스턴스로 확장하려면 다음 명령어를 실행할 수 있습니다.

docker-compose scale web=3

이렇게 하면 web 서비스의 추가 인스턴스 2 개가 생성되어 여러 컨테이너에 걸쳐 로드를 분산할 수 있습니다.

로드 밸런싱

Docker Compose 는 내장된 로드 밸런싱 기능도 제공합니다. 서비스의 여러 인스턴스를 정의하면 Compose 는 사용 가능한 컨테이너에 걸쳐 들어오는 요청을 자동으로 로드 밸런싱합니다.

version: "3"
services:
  web:
    image: myapp/web
    ports:
      - 80:80
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure

이 예제에서는 web 서비스가 3 개의 복제본 (replicas) 을 갖도록 정의했습니다. docker-compose up을 실행하면 Compose 는 web 서비스의 세 개 인스턴스를 생성하고 들어오는 요청을 이들 인스턴스에 분산하여 로드 밸런싱합니다.

애플리케이션의 고가용성을 보장하기 위해 재시작 정책과 같은 추가 로드 밸런싱 옵션을 구성할 수도 있습니다.

graph TD
    A[클라이언트] --> B[로드 밸런서]
    B --> C[웹 서비스 1]
    B --> D[웹 서비스 2]
    B --> E[웹 서비스 3]

Docker Compose 의 확장 및 로드 밸런싱 기능을 활용하여 증가하는 트래픽과 리소스 요구 사항을 처리할 수 있는 고도로 확장 가능하고 강력한 애플리케이션을 구축할 수 있습니다.

문제 해결 및 권장 사항

Docker Compose 를 사용하는 과정에서 어떤 기술이든 문제나 어려움에 직면할 수 있습니다. 이 섹션에서는 Compose 기반 애플리케이션을 효과적으로 관리하는 데 도움이 되는 일반적인 문제 해결 단계와 권장 사항을 다룹니다.

문제 해결

  1. 로그 확인: Compose 애플리케이션에서 문제가 발생하면 먼저 docker-compose logs 명령어를 사용하여 로그를 확인합니다. 이렇게 하면 서비스에 대한 오류 또는 문제를 식별하는 데 도움이 됩니다.

  2. 컨테이너 검사: docker-compose ps 명령어를 사용하여 실행 중인 컨테이너와 상태를 나열할 수 있습니다. 이를 통해 예상대로 실행되지 않는 컨테이너를 식별하는 데 도움이 됩니다.

  3. 서비스 디버깅: 특정 서비스가 예상대로 작동하지 않으면 docker-compose exec 명령어를 사용하여 컨테이너에 접근하고 문제를 디버깅할 수 있습니다. 예를 들어, docker-compose exec web bashweb 서비스 컨테이너 내부의 쉘을 제공합니다.

  4. 구성 확인: 서비스 정의, 네트워크 구성 및 볼륨 설정이 올바른지 Compose 파일을 다시 확인합니다. docker-compose config 명령어를 사용하여 Compose 파일의 구문 및 구조를 검증할 수 있습니다.

권장 사항

  1. 환경 변수 사용: 데이터베이스 자격 증명이나 API 키와 같은 구성 설정을 환경 변수에 저장합니다. 이렇게 하면 민감한 정보를 관리하고 애플리케이션을 다른 환경에 적응시키는 것이 더 쉬워집니다.

  2. 관심사 분리: 애플리케이션을 더 작고 관리하기 쉬운 서비스로 분리하는 것을 고려합니다. 이렇게 하면 애플리케이션의 개별 구성 요소를 확장, 유지 관리 및 테스트하기가 더 쉬워집니다.

  3. 건강 체크 구현: 컨테이너가 올바르게 작동하는지 확인하기 위해 서비스에 대한 건강 체크를 구성합니다. 이렇게 하면 Compose 가 애플리케이션의 상태를 모니터링하고 건강하지 않은 컨테이너를 다시 시작하는 등 적절한 조치를 취하는 데 도움이 됩니다.

  4. Compose 파일 버전 관리: Git 과 같은 버전 관리 시스템에 Compose 파일을 저장합니다. 이렇게 하면 변경 사항을 추적하고 팀원들과 협업하며 다양한 환경에서 일관된 배포를 보장하는 데 도움이 됩니다.

  5. 네트워킹 적절히 활용: 사용자 정의 네트워크를 활용하여 서비스 간의 연결을 분리하고 제어합니다. 이렇게 하면 애플리케이션의 보안 및 성능을 향상시킬 수 있습니다.

  6. LabEx 활용: Docker Compose 환경을 개선하기 위한 추가 기능과 도구를 제공하는 강력한 플랫폼인 LabEx 를 고려합니다. LabEx 는 Compose 기반 애플리케이션의 배포, 모니터링 및 관리를 간소화하는 데 도움이 될 수 있습니다.

이러한 문제 해결 단계와 권장 사항을 따르면 다양한 환경에서 Docker Compose 애플리케이션을 효과적으로 관리하고 유지 관리하여 원활하고 안정적으로 실행할 수 있습니다.

요약

이 튜토리얼을 마치면 애플리케이션 배포 및 관리를 간소화하기 위해 Docker Compose 를 설치하고 사용하는 방법에 대한 확실한 이해를 얻게 될 것입니다. 서비스를 정의하고, Compose 애플리케이션을 배포 및 관리하며, 발생할 수 있는 문제를 해결할 수 있을 것입니다. Docker 에 대한 경험이 있는지 여부 또는 Compose 기술을 향상시키고자 하는지 여부에 관계없이, 이 가이드는 Docker Compose 를 시작하는 데 필요한 지식과 도구를 제공할 것입니다.