소개
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 컨테이너와 리소스를 관리하는 방법을 배웠습니다. 학습한 내용은 다음과 같습니다:
- Docker Compose 설치 및 간단한 Docker Compose 환경 생성
docker-compose down의 기본 개념과 컨테이너 및 네트워크가 기본적으로 제거되는 방식 학습--volumes,--rmi,--remove-orphans와 같은 고급 옵션을 사용하여 제거할 리소스를 정밀하게 제어하는 방법- 실제 시나리오에서 Docker Compose를 사용하기 위한 모범 사례 구현:
- 환경별 구성 파일 사용
- 정리 스크립트 생성
- 선택적 리소스 제거
- 리소스 사용량 모니터링
docker-compose down 명령어를 숙달함으로써 깔끔한 Docker 환경을 유지하고, 리소스 누수를 방지하며, 개발 워크플로우를 최적화할 수 있는 지식을 갖추게 되었습니다.
핵심 요약:
- 기본
docker-compose down명령어는 컨테이너와 네트워크를 제거하지만 볼륨은 유지합니다. - 데이터를 초기화하려면
--volumes를 사용하여 볼륨을 제거하세요. - 디스크 공간을 확보해야 할 때는
--rmi를 사용하여 이미지를 제거하세요. - Compose 파일에 더 이상 정의되지 않은 컨테이너를 정리하려면
--remove-orphans를 사용하세요. - 필요에 따라 이러한 옵션을 조합하여 완벽하게 정리하세요.
이제 이러한 기술을 바탕으로 프로젝트에서 Docker Compose 환경을 효율적으로 관리할 수 있습니다.



