Docker Compose Down 명령어를 효과적으로 사용하는 방법

DockerBeginner
지금 연습하기

소개

Docker Compose Down 명령어는 Docker 컨테이너 관리의 필수 도구입니다. 이 실습에서는 docker-compose down을 효과적으로 사용하여 Docker 컨테이너, 네트워크, 볼륨 및 이미지를 올바르게 종료하고 정리하는 방법을 안내합니다. 이 명령어를 숙달하면 깔끔한 Docker 환경을 유지하고 개발 워크플로우를 최적화할 수 있습니다.

Docker Compose 설치 및 샘플 프로젝트 생성

이 단계에서는 Docker Compose가 올바르게 설치되었는지 확인하고, 실습에 사용할 샘플 Docker Compose 프로젝트를 생성합니다.

Docker Compose 설치 확인

먼저 설정 과정에서 Docker Compose가 성공적으로 설치되었는지 확인합니다:

docker-compose version

다음과 유사한 출력이 표시되어야 합니다(빌드 세부 정보는 다를 수 있음):

docker-compose version 1.29.2, build unknown

간단한 Docker Compose 파일 생성

이제 이 실습 전반에서 사용할 간단한 Docker Compose 파일을 생성하겠습니다. 현재 디렉토리에 Nginx 기반의 기본 웹 서비스가 포함된 docker-compose.yml 파일을 만듭니다.

nano 편집기를 사용하여 파일을 생성합니다:

cd ~/project/docker-compose-demo
nano docker-compose.yml

다음 내용을 편집기에 복사하여 붙여넣습니다:

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

  db:
    image: redis:latest
    volumes:
      - db_data:/data

volumes:
  web_data:
  db_data:

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

이 Docker Compose 파일은 다음을 정의합니다:

  • Nginx 이미지를 사용하는 웹 서비스
  • Redis를 사용하는 데이터베이스 서비스
  • 영구 데이터 저장을 위한 두 개의 명명된 볼륨

Docker Compose 서비스 시작

Docker Compose 파일에 정의된 서비스를 시작합니다:

docker-compose up -d

-d 플래그는 컨테이너를 백그라운드(detached mode)에서 실행합니다. 다음과 유사한 출력이 표시됩니다:

Creating network "docker-compose-demo_default" with the default driver
Creating volume "docker-compose-demo_web_data" with default driver
Creating volume "docker-compose-demo_db_data" with default driver
Creating docker-compose-demo_web_1 ... done
Creating docker-compose-demo_db_1  ... done

실행 중인 컨테이너 확인

컨테이너가 실행 중인지 확인합니다:

docker-compose ps

두 서비스가 모두 실행 중임을 나타내는 출력이 표시되어야 합니다:

        Name                       Command               State          Ports
-----------------------------------------------------------------------------------
docker-compose-demo_db_1    docker-entrypoint.sh redis ...   Up      6379/tcp
docker-compose-demo_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:8080->80/tcp

curl을 사용하여 Nginx 웹 서버에 접근할 수 있는지 확인할 수도 있습니다:

curl http://localhost:8080

기본 Nginx 환영 페이지 HTML 출력이 표시되어야 합니다.

이제 서비스가 실행 중이므로, 다음 단계에서 docker-compose down 명령어에 대해 알아보겠습니다.

Docker Compose Down 이해 및 사용

이 단계에서는 실행 중인 Docker Compose 서비스를 바탕으로 docker-compose down 명령어와 그 효과적인 사용법을 배웁니다.

Docker Compose Down이란 무엇인가?

docker-compose down 명령어는 docker-compose up으로 생성된 컨테이너, 네트워크, 볼륨 및 이미지를 중지하고 제거하는 데 사용됩니다. 이 명령어는 리소스가 더 이상 필요하지 않거나 환경을 초기화해야 할 때 정리하는 데 필수적입니다.

Docker Compose Down의 기본 사용법

가장 간단한 명령어 형태는 다음과 같습니다:

docker-compose down

이 명령어를 실행하고 어떤 일이 일어나는지 관찰해 봅시다:

cd ~/project/docker-compose-demo
docker-compose down

다음과 유사한 출력이 표시됩니다:

Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1  ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1  ... done
Removing network docker-compose-demo_default

이 명령어는 다음을 수행합니다:

  • Docker Compose 파일에 정의된 모든 실행 중인 컨테이너를 중지합니다.
  • 모든 컨테이너를 제거합니다.
  • Docker Compose가 생성한 네트워크를 제거합니다.

하지만 기본적으로 볼륨은 제거하지 않습니다. 이는 중요한 점입니다. 볼륨은 데이터를 보존하기 위해 컨테이너의 수명 주기 이후에도 유지됩니다.

리소스 제거 확인

컨테이너와 네트워크가 제거되었는지 확인합니다:

docker-compose ps

빈 목록이 표시되어야 하며, 이는 이 Docker Compose 프로젝트에서 실행 중인 컨테이너가 없음을 의미합니다.

볼륨이 여전히 존재하는지 확인합니다:

docker volume ls | grep docker-compose-demo

볼륨이 여전히 존재함을 확인할 수 있습니다:

local     docker-compose-demo_db_data
local     docker-compose-demo_web_data

이 기본 동작은 컨테이너 재시작 시에도 데이터를 보존하기 때문에 중요합니다. 만약 볼륨까지 제거하고 싶다면 다음 단계에서 다룰 추가 옵션을 사용해야 합니다.

서비스 다시 시작

다음 단계를 위해 서비스를 다시 시작합니다:

docker-compose up -d

다음과 같이 표시됩니다:

Creating network "docker-compose-demo_default" with the default driver
Creating docker-compose-demo_web_1 ... done
Creating docker-compose-demo_db_1  ... done

Docker Compose는 볼륨이 이미 존재하므로 다시 생성할 필요가 없었습니다.

이제 docker-compose down의 기본 사용법을 이해했습니다. 다음 단계에서는 어떤 리소스를 제거할지 정밀하게 제어하는 고급 옵션을 살펴보겠습니다.

고급 옵션을 사용한 Docker Compose Down

기본 docker-compose down 명령어는 유용하지만, Docker Compose는 제거할 리소스를 더 세밀하게 제어할 수 있는 추가 옵션을 제공합니다. 이 단계에서는 이러한 옵션을 살펴봅니다.

볼륨 제거

이전 단계에서 확인했듯이 docker-compose down은 기본적으로 볼륨을 제거하지 않습니다. 이는 실수로 인한 데이터 손실을 방지하기 위한 안전 기능입니다. 하지만 전체 정리를 수행하거나 애플리케이션 데이터를 초기화해야 할 때처럼 볼륨을 제거하고 싶을 때가 있습니다.

컨테이너 및 네트워크와 함께 볼륨을 제거하려면 --volumes 플래그를 사용합니다:

docker-compose down --volumes

실행해 봅시다:

cd ~/project/docker-compose-demo
docker-compose down --volumes

다음과 유사한 출력이 표시됩니다:

Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1  ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1  ... done
Removing network docker-compose-demo_default
Removing volume docker-compose-demo_web_data
Removing volume docker-compose-demo_db_data

이번에는 볼륨도 함께 제거된 것을 확인할 수 있습니다.

볼륨이 제거되었는지 확인합니다:

docker volume ls | grep docker-compose-demo

출력이 없어야 하며, 이는 볼륨이 성공적으로 제거되었음을 의미합니다.

이미지 제거

Docker Compose 환경을 종료할 때 이미지를 제거하는 것도 유용한 옵션입니다. 이는 --rmi 플래그를 사용하여 수행할 수 있으며, 다음과 같은 값을 허용합니다:

  • --rmi all: 모든 서비스에서 사용하는 모든 이미지 제거
  • --rmi local: 사용자 정의 태그가 없는 이미지만 제거

서비스를 다시 시작한 후 --rmi 플래그를 사용해 봅시다:

docker-compose up -d

서비스가 시작될 때까지 기다린 후 --rmi 플래그와 함께 종료합니다:

docker-compose down --rmi local

다음과 유사한 출력이 표시됩니다:

Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1  ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1  ... done
Removing network docker-compose-demo_default
Removing image redis:latest
Removing image nginx:latest

이번에는 이미지도 함께 제거되었습니다.

고아(Orphan) 컨테이너 제거

때때로 Docker Compose에 의해 생성되었지만 현재 docker-compose.yml 파일에는 정의되지 않은 컨테이너가 있을 수 있습니다. 이를 "고아 컨테이너(orphan containers)"라고 합니다.

이를 시연하기 위해 db 서비스를 제거하도록 Docker Compose 파일을 수정해 보겠습니다:

nano docker-compose.yml

파일을 편집하여 db 서비스와 해당 볼륨을 제거합니다:

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

volumes:
  web_data:

편집기를 저장하고 종료합니다(Ctrl+O, Enter, Ctrl+X).

이제 업데이트된 파일로 서비스를 다시 시작합니다:

docker-compose up -d

만약 이전에 제대로 중지되지 않은 db 서비스 컨테이너가 실행 중이었다면, 이제 고아로 간주됩니다. --remove-orphans 플래그를 사용하여 이러한 고아 컨테이너를 제거할 수 있습니다:

docker-compose down --remove-orphans

이렇게 하면 이전 버전의 Docker Compose 파일에 의해 생성되었지만 더 이상 정의되지 않은 모든 컨테이너가 제거됩니다.

옵션 조합

완벽한 정리를 위해 이러한 옵션을 조합할 수도 있습니다:

docker-compose down --volumes --rmi all --remove-orphans

이 명령어는 다음을 수행합니다:

  • 모든 컨테이너 중지 및 제거
  • 모든 명명된 볼륨 제거
  • 모든 서비스에서 사용하는 모든 이미지 제거
  • 모든 고아 컨테이너 제거

이 방법은 환경을 완전히 초기화하거나 Docker Compose 구성을 크게 변경하기 전에 매우 유용합니다.

추가 옵션 탐색

docker-compose down 명령어에 사용할 수 있는 모든 옵션은 도움말 플래그를 통해 확인할 수 있습니다:

docker-compose down --help

잠시 시간을 내어 사용 가능한 옵션과 설명을 검토해 보세요.

이제 다양한 옵션을 사용하여 Docker Compose 환경을 종료할 때 어떤 리소스를 제거할지 제어하는 방법을 잘 이해하게 되었습니다.

모범 사례 및 실제 시나리오

이 단계에서는 docker-compose down 명령어와 옵션을 이해했으므로, 이 명령어를 효과적으로 사용하기 위한 모범 사례와 실제 시나리오를 살펴봅니다.

더 복잡한 Docker Compose 환경 생성

실제 사용 사례를 더 잘 보여주기 위해 더 복잡한 Docker Compose 환경을 생성하겠습니다. 프론트엔드, 백엔드, 데이터베이스가 포함된 간단한 웹 애플리케이션을 설정합니다.

cd ~/project/docker-compose-demo
nano docker-compose.yml

내용을 다음으로 교체합니다:

version: "3"

services:
  frontend:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - frontend_data:/usr/share/nginx/html
    networks:
      - app_network

  backend:
    image: node:14-alpine
    command: sh -c "echo 'Backend service running' && sleep infinity"
    volumes:
      - backend_data:/app
    networks:
      - app_network
      - db_network

  database:
    image: postgres:13-alpine
    environment:
      POSTGRES_PASSWORD: example
      POSTGRES_USER: user
      POSTGRES_DB: appdb
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - db_network

networks:
  app_network:
  db_network:

volumes:
  frontend_data:
  backend_data:
  db_data:

편집기를 저장하고 종료합니다.

이 복잡한 환경을 시작합니다:

docker-compose up -d

세 가지 서비스 모두에 대한 네트워크, 볼륨 및 컨테이너가 생성되는 것을 확인할 수 있습니다.

모범 사례: 환경 사용

실제 시나리오에서는 개발, 테스트, 운영과 같은 다양한 환경이 있을 수 있습니다. Docker Compose를 사용하면 환경별로 다른 구성 파일을 사용할 수 있습니다.

개발 환경을 위한 파일을 생성합니다:

nano docker-compose.dev.yml

다음 내용을 추가합니다:

version: "3"

services:
  frontend:
    ports:
      - "8081:80"
    environment:
      NODE_ENV: development

  backend:
    environment:
      NODE_ENV: development
      DEBUG: "true"

  database:
    ports:
      - "5432:5432"

편집기를 저장하고 종료합니다.

이 파일을 기본 파일과 함께 사용하려면 -f 플래그를 사용합니다:

docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

이렇게 하면 구성이 병합되어 개발 환경 전용 설정이 적용됩니다.

이 환경을 종료하려면 다음을 사용합니다:

docker-compose -f docker-compose.yml -f docker-compose.dev.yml down

모범 사례: 정리 스크립트 사용

CI/CD 파이프라인이나 개발 워크플로우에서는 모든 Docker 리소스를 제거하는 정리 스크립트를 사용하는 것이 유용합니다. 간단한 정리 스크립트를 만들어 봅시다:

nano cleanup.sh

다음 내용을 추가합니다:

#!/bin/bash

echo "Cleaning up Docker environment..."

## 컨테이너, 네트워크, 볼륨 및 이미지 중지 및 제거
docker-compose down --volumes --rmi all --remove-orphans

## 사용되지 않는 볼륨 제거
echo "Removing dangling volumes..."
docker volume prune -f

## 사용되지 않는 이미지 제거
echo "Removing dangling images..."
docker image prune -f

echo "Cleanup complete!"

편집기를 저장하고 종료합니다.

스크립트를 실행 가능하게 만듭니다:

chmod +x cleanup.sh

이제 전체 정리가 필요할 때마다 이 스크립트를 실행할 수 있습니다:

./cleanup.sh

모범 사례: 선택적 리소스 제거

때로는 특정 리소스만 제거하고 싶을 수 있습니다. 예를 들어, 볼륨은 유지(데이터 보존)하면서 컨테이너, 네트워크, 이미지만 제거하고 싶을 수 있습니다.

다양한 시나리오에 대한 접근 방식은 다음과 같습니다:

컨테이너와 네트워크만 제거 (볼륨 및 이미지 보존):

docker-compose down

컨테이너, 네트워크, 이미지 제거 (볼륨 보존):

docker-compose down --rmi all

컨테이너, 네트워크, 볼륨 제거 (이미지 보존):

docker-compose down --volumes

로컬 이미지만 제거 (레지스트리에서 가져오지 않은 이미지):

docker-compose down --rmi local

리소스를 선택적으로 제거함으로써 특정 요구 사항에 맞춰 워크플로우를 최적화할 수 있습니다.

모범 사례: 리소스 사용량 모니터링

docker-compose down을 실행하기 전후에 Docker 리소스 사용량을 모니터링하는 것이 좋습니다. 이는 제대로 정리되지 않는 리소스를 식별하는 데 도움이 됩니다.

유용한 명령어는 다음과 같습니다:

모든 컨테이너 나열 (중지된 컨테이너 포함):

docker ps -a

모든 네트워크 나열:

docker network ls

모든 볼륨 나열:

docker volume ls

모든 이미지 나열:

docker image ls

시스템 전체 정보 확인:

docker system df

마지막 명령어를 실행하여 현재 리소스 사용량을 확인해 봅시다:

docker system df

컨테이너, 이미지, 볼륨 수와 총 사용 공간을 포함한 Docker 리소스 사용 요약이 표시됩니다.

복잡한 환경 종료

이제 복잡한 환경을 종료하고 관련된 모든 리소스를 제거합니다:

docker-compose down --volumes --rmi all --remove-orphans

이 명령어는 Docker Compose 프로젝트와 관련된 모든 컨테이너, 네트워크, 볼륨 및 이미지를 중지하고 제거합니다.

이러한 모범 사례를 따르면 Docker 환경을 효과적으로 관리하고 최적의 리소스 사용을 보장할 수 있습니다.

요약

이 실습에서는 docker-compose down 명령어를 효과적으로 사용하여 Docker 컨테이너와 리소스를 관리하는 방법을 배웠습니다. 학습한 내용은 다음과 같습니다:

  1. Docker Compose 설치 및 간단한 Docker Compose 환경 생성
  2. docker-compose down의 기본 개념과 컨테이너 및 네트워크가 기본적으로 제거되는 방식 학습
  3. --volumes, --rmi, --remove-orphans와 같은 고급 옵션을 사용하여 제거할 리소스를 정밀하게 제어하는 방법
  4. 실제 시나리오에서 Docker Compose를 사용하기 위한 모범 사례 구현:
    • 환경별 구성 파일 사용
    • 정리 스크립트 생성
    • 선택적 리소스 제거
    • 리소스 사용량 모니터링

docker-compose down 명령어를 숙달함으로써 깔끔한 Docker 환경을 유지하고, 리소스 누수를 방지하며, 개발 워크플로우를 최적화할 수 있는 지식을 갖추게 되었습니다.

핵심 요약:

  • 기본 docker-compose down 명령어는 컨테이너와 네트워크를 제거하지만 볼륨은 유지합니다.
  • 데이터를 초기화하려면 --volumes를 사용하여 볼륨을 제거하세요.
  • 디스크 공간을 확보해야 할 때는 --rmi를 사용하여 이미지를 제거하세요.
  • Compose 파일에 더 이상 정의되지 않은 컨테이너를 정리하려면 --remove-orphans를 사용하세요.
  • 필요에 따라 이러한 옵션을 조합하여 완벽하게 정리하세요.

이제 이러한 기술을 바탕으로 프로젝트에서 Docker Compose 환경을 효율적으로 관리할 수 있습니다.