Docker Compose Down 명령어 효과적으로 사용하기

DockerBeginner
지금 연습하기

소개

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

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

docker-compose down 명령어를 사용하기 전에 Docker Compose 가 제대로 설치되었는지 확인하고, 사용할 샘플 Docker Compose 프로젝트를 생성해야 합니다.

Docker Compose 설치 확인

먼저 Docker Compose 가 설정 중에 성공적으로 설치되었는지 확인해 보겠습니다.

docker-compose version

다음과 유사한 출력을 볼 수 있습니다.

Docker Compose version v2.18.1

간단한 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 모드 (백그라운드) 에서 실행합니다. 다음과 유사한 출력을 볼 수 있습니다.

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

이 명령어가 다음을 수행하는 것을 알 수 있습니다.

  1. Docker Compose 파일에 정의된 모든 실행 중인 컨테이너를 중지합니다.
  2. 모든 컨테이너를 제거합니다.
  3. 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

이번에는 이미지도 제거됩니다.

고아 컨테이너 제거

경우에 따라 Docker Compose 로 생성되었지만 현재 docker-compose.yml 파일에 더 이상 정의되지 않은 컨테이너가 있을 수 있습니다. 이를 "고아 컨테이너"라고 합니다.

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

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

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

  1. 모든 컨테이너를 중지하고 제거합니다.
  2. 모든 명명된 볼륨을 제거합니다.
  3. 모든 서비스에서 사용되는 모든 이미지를 제거합니다.
  4. 모든 고아 컨테이너를 제거합니다.

이는 환경을 완전히 재설정하려는 경우 또는 Docker Compose 구성을 크게 변경하려는 경우에 특히 유용합니다.

추가 옵션 탐색

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

docker-compose down --help

잠시 시간을 내어 사용 가능한 옵션과 해당 설명을 검토하십시오.

이제 Docker Compose 환경을 종료할 때 제거할 리소스를 제어하기 위해 다양한 옵션과 함께 docker-compose down을 사용하는 방법에 대한 이해가 높아졌습니다.

모범 사례 및 실제 시나리오

이제 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(Continuous Integration/Deployment) 파이프라인 또는 개발 워크플로우에서는 모든 Docker 리소스를 제거하는 정리 스크립트가 있는 것이 유용한 경우가 많습니다. 간단한 정리 스크립트를 만들어 보겠습니다.

nano cleanup.sh

다음 내용을 추가합니다.

#!/bin/bash

echo "Cleaning up Docker environment..."

## Stop and remove containers, networks, volumes, and images
docker-compose down --volumes --rmi all --remove-orphans

## Remove dangling volumes
echo "Removing dangling volumes..."
docker volume prune -f

## Remove dangling images
echo "Removing dangling images..."
docker image prune -f

echo "Cleanup complete!"

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

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

chmod +x cleanup.sh

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

./cleanup.sh

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

경우에 따라 특정 리소스만 제거하려는 경우가 있을 수 있습니다. 예를 들어 볼륨 (데이터 보존) 은 유지하면서 컨테이너, 네트워크 및 이미지를 제거할 수 있습니다.

다양한 시나리오에 접근하는 방법은 다음과 같습니다.

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

    docker-compose down
  2. 컨테이너, 네트워크 및 이미지 제거 (볼륨 보존):

    docker-compose down --rmi all
  3. 컨테이너, 네트워크 및 볼륨 제거 (이미지 보존):

    docker-compose down --volumes
  4. 로컬 이미지 (레지스트리에서 가져오지 않음) 만 제거:

    docker-compose down --rmi local

선택적으로 리소스를 제거하면 특정 요구 사항에 따라 워크플로우를 최적화할 수 있습니다.

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

docker-compose down을 실행하기 전과 후에 Docker 리소스 사용량을 모니터링하는 것이 유용한 경우가 많습니다. 이렇게 하면 제대로 정리되지 않은 리소스를 식별하는 데 도움이 될 수 있습니다.

다음은 몇 가지 유용한 명령어입니다.

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

    docker ps -a
  2. 모든 네트워크 나열:

    docker network ls
  3. 모든 볼륨 나열:

    docker volume ls
  4. 모든 이미지 나열:

    docker image ls
  5. 시스템 전체 정보 가져오기:

    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 환경을 효율적으로 관리할 수 있습니다.