소개
Docker Compose Down 명령어는 Docker 컨테이너 관리에 필수적인 도구입니다. 이 랩에서는 docker-compose down을 효과적으로 사용하여 Docker 컨테이너, 네트워크, 볼륨 및 이미지를 적절하게 종료하고 정리하는 방법을 안내합니다. 이 명령어를 숙달하면 깨끗한 Docker 환경을 유지하고 개발 워크플로우를 최적화할 수 있습니다.
Docker Compose Down 명령어는 Docker 컨테이너 관리에 필수적인 도구입니다. 이 랩에서는 docker-compose down을 효과적으로 사용하여 Docker 컨테이너, 네트워크, 볼륨 및 이미지를 적절하게 종료하고 정리하는 방법을 안내합니다. 이 명령어를 숙달하면 깨끗한 Docker 환경을 유지하고 개발 워크플로우를 최적화할 수 있습니다.
docker-compose down 명령어를 사용하기 전에 Docker Compose 가 제대로 설치되었는지 확인하고, 사용할 샘플 Docker Compose 프로젝트를 생성해야 합니다.
먼저 Docker Compose 가 설정 중에 성공적으로 설치되었는지 확인해 보겠습니다.
docker-compose version
다음과 유사한 출력을 볼 수 있습니다.
Docker Compose version v2.18.1
이제 이 랩에서 사용할 간단한 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 파일은 다음을 정의합니다.
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 서비스가 실행 중이므로 docker-compose down 명령어와 이를 효과적으로 사용하는 방법에 대해 알아보겠습니다.
docker-compose down 명령어는 docker-compose up으로 생성된 컨테이너, 네트워크, 볼륨 및 이미지를 중지하고 제거하는 데 사용됩니다. 이 명령어는 더 이상 필요하지 않거나 환경을 재설정하려는 경우 리소스를 정리하는 데 필수적입니다.
명령어의 가장 간단한 형태는 다음과 같습니다.
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 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 는 제거할 리소스를 더 많이 제어할 수 있는 추가 옵션을 제공합니다. 이 단계에서는 이러한 옵션을 살펴보겠습니다.
이전 단계에서 살펴본 바와 같이, 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
이 명령어는 다음을 수행합니다.
이는 환경을 완전히 재설정하려는 경우 또는 Docker Compose 구성을 크게 변경하려는 경우에 특히 유용합니다.
docker-compose down 명령어에 사용할 수 있는 모든 옵션은 도움말 플래그를 사용하여 확인할 수 있습니다.
docker-compose down --help
잠시 시간을 내어 사용 가능한 옵션과 해당 설명을 검토하십시오.
이제 Docker Compose 환경을 종료할 때 제거할 리소스를 제어하기 위해 다양한 옵션과 함께 docker-compose down을 사용하는 방법에 대한 이해가 높아졌습니다.
이제 docker-compose down 명령어와 해당 옵션을 이해했으므로 이 명령어를 효과적으로 사용하는 몇 가지 모범 사례와 실제 시나리오를 살펴보겠습니다.
실제 사용법을 더 잘 보여주기 위해 더 복잡한 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
경우에 따라 특정 리소스만 제거하려는 경우가 있을 수 있습니다. 예를 들어 볼륨 (데이터 보존) 은 유지하면서 컨테이너, 네트워크 및 이미지를 제거할 수 있습니다.
다양한 시나리오에 접근하는 방법은 다음과 같습니다.
컨테이너 및 네트워크만 제거 (볼륨 및 이미지 보존):
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 down의 기본 사항과 기본적으로 컨테이너 및 네트워크를 제거하는 방법을 배웠습니다.--volumes, --rmi, --remove-orphans와 같은 고급 옵션을 탐색했습니다.docker-compose down 명령어를 마스터함으로써 이제 깨끗한 Docker 환경을 유지하고, 리소스 누수를 방지하며, 개발 워크플로우를 최적화하는 데 필요한 지식을 갖추게 되었습니다.
다음 주요 사항을 기억하십시오.
docker-compose down 명령어는 컨테이너와 네트워크를 제거하지만 볼륨은 유지합니다.--volumes를 사용하여 볼륨을 제거합니다.--rmi를 사용하여 이미지를 제거합니다.--remove-orphans를 사용합니다.이러한 기술을 통해 이제 프로젝트에서 Docker Compose 환경을 효율적으로 관리할 수 있습니다.