docker compose down 명령으로 리소스 중지 및 제거하는 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 Docker Compose 파일을 사용하여 정의된 리소스를 중지하고 제거하기 위해 docker compose down 명령을 효과적으로 사용하는 방법을 배우게 됩니다. 먼저 두 개의 서비스와 네트워크를 포함하는 간단한 Compose 파일을 준비하는 것으로 시작합니다.

설정 후, docker compose up을 사용하여 이러한 서비스를 시작하는 연습을 할 것입니다. 랩의 핵심은 docker compose down을 사용하여 기본 리소스를 중지하고 제거하는 데 초점을 맞추고, 그 다음 -v 옵션을 사용하여 볼륨을 제거하고 --rmi all을 사용하여 이미지를 제거하여 다양한 수준의 리소스 정리를 시연하는 것입니다.

서비스 및 네트워크를 포함하는 간단한 Compose 파일 준비

이 단계에서는 두 개의 서비스와 네트워크를 정의하기 위해 간단한 Compose 파일을 준비합니다. 시작하기 전에, 환경에 미리 설치되어 있지 않으므로 Docker Compose 를 설치해야 합니다.

먼저, Docker Compose 바이너리를 다운로드합니다. 미리 설치된 Docker 버전과 호환되는 버전 1.29.2 를 다운로드합니다.

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

이 명령은 공식 GitHub 릴리스 페이지에서 Docker Compose 바이너리를 다운로드하여 /usr/local/bin/docker-compose에 저장합니다. $(uname -s)$(uname -m) 부분은 운영 체제와 아키텍처를 자동으로 감지하여 올바른 바이너리를 다운로드합니다.

다음으로, 다운로드한 바이너리에 실행 권한을 적용하여 명령으로 실행할 수 있도록 해야 합니다.

sudo chmod +x /usr/local/bin/docker-compose

이제 Docker Compose 버전을 확인하여 설치를 확인해 보겠습니다.

docker-compose --version

Docker Compose 가 올바르게 설치되었음을 확인하는 버전 정보가 콘솔에 출력되어야 합니다.

Docker Compose 가 설치되었으므로, 프로젝트 디렉토리를 만들고 해당 디렉토리로 이동해 보겠습니다. ~/project 디렉토리에 my-compose-app이라는 디렉토리를 생성합니다.

mkdir ~/project/my-compose-app
cd ~/project/my-compose-app

이 디렉토리 내에서 docker-compose.yml이라는 파일을 생성합니다. 이 파일은 서비스와 네트워크를 정의합니다. nano 편집기를 사용하여 이 파일을 생성하고 편집합니다.

nano docker-compose.yml

이제 다음 내용을 docker-compose.yml 파일에 붙여넣습니다. 이 파일은 webredis의 두 서비스와 app-network라는 네트워크를 정의합니다.

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - app-network
  redis:
    image: redis:latest
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

docker-compose.yml 파일을 자세히 살펴보겠습니다.

  • version: '3.8'은 Docker Compose 파일 형식 버전을 지정합니다.
  • services:는 애플리케이션을 구성하는 다양한 서비스를 정의합니다.
    • web:web이라는 서비스를 정의합니다.
      • image: nginx:latest는 이 서비스가 최신 nginx 이미지를 사용하도록 지정합니다. 이 이미지는 나중에 가져올 것입니다.
      • ports: - "80:80"은 호스트 머신의 포트 80 을 web 컨테이너의 포트 80 에 매핑합니다.
      • networks: - app-networkweb 서비스를 app-network에 연결합니다.
    • redis:redis라는 서비스를 정의합니다.
      • image: redis:latest는 이 서비스가 최신 redis 이미지를 사용하도록 지정합니다. 이 이미지는 나중에 가져올 것입니다.
      • networks: - app-networkredis 서비스를 app-network에 연결합니다.
  • networks:는 서비스에서 사용하는 네트워크를 정의합니다.
    • app-network:app-network라는 네트워크를 정의합니다.
      • driver: bridge는 이 네트워크가 기본 브리지 드라이버를 사용하도록 지정합니다.

Ctrl + X, Y, 그리고 Enter를 눌러 파일을 저장합니다.

서비스를 시작하기 전에 필요한 Docker 이미지를 가져와야 합니다. nginx:latestredis:latest 이미지를 가져옵니다.

docker pull nginx:latest
docker pull redis:latest

이 명령은 지정된 이미지를 Docker Hub 에서 로컬 머신으로 다운로드합니다.

docker compose up 명령으로 서비스 시작

이 단계에서는 docker compose up 명령을 사용하여 docker-compose.yml 파일에 정의된 서비스를 시작합니다. 이 명령은 서비스에 대한 컨테이너를 빌드, (재) 생성, 시작 및 연결합니다.

docker-compose.yml 파일을 생성한 ~/project/my-compose-app 디렉토리에 있는지 확인하십시오.

cd ~/project/my-compose-app

이제 서비스를 시작하려면 다음 명령을 실행합니다. 컨테이너를 분리된 모드 (detached mode) 로 실행하기 위해 -d 플래그를 사용합니다. 즉, 컨테이너는 백그라운드에서 실행되며 터미널을 차단하지 않습니다.

docker-compose up -d

이 명령을 처음 실행하면 Docker Compose 는 다음을 수행합니다.

  1. docker-compose.yml 파일에 정의된 대로 app-network를 생성합니다.
  2. nginx:latest 이미지를 사용하여 web 서비스에 대한 컨테이너를 생성합니다.
  3. redis:latest 이미지를 사용하여 redis 서비스에 대한 컨테이너를 생성합니다.
  4. 두 컨테이너를 app-network에 연결합니다.
  5. 두 컨테이너를 시작합니다.

네트워크와 컨테이너가 생성되고 시작되고 있음을 나타내는 출력을 볼 수 있습니다.

컨테이너가 실행 중인지 확인하려면 docker ps 명령을 사용할 수 있습니다.

docker ps

이 명령은 실행 중인 모든 컨테이너를 나열합니다. web 서비스 ( nginx 이미지 기반) 와 redis 서비스 ( redis 이미지 기반) 에 대한 두 개의 컨테이너가 나열되어야 합니다. 컨테이너 이름은 일반적으로 디렉토리 이름 (이 경우 my-compose-app) 과 서비스 이름 (예: my-compose-app_web_1, my-compose-app_redis_1) 으로 시작합니다.

docker network ls 명령을 사용하여 Docker Compose 에서 생성한 네트워크를 확인할 수도 있습니다.

docker network ls

docker-compose.yml 파일의 app-network 정의를 기반으로 생성된 my-compose-app_app-network라는 네트워크가 나열되어야 합니다.

마지막으로, web 서비스의 포트 80 을 호스트의 포트 80 에 매핑했으므로 웹 브라우저를 열고 LabEx VM 의 IP 주소로 이동하여 기본 Nginx 시작 페이지에 액세스할 수 있습니다. 또는 터미널에서 curl을 사용할 수 있습니다.

curl localhost

출력에서 기본 Nginx 시작 페이지의 HTML 콘텐츠를 볼 수 있습니다. 이는 web 서비스가 실행 중이며 액세스할 수 있음을 확인합니다.

docker compose down 명령으로 기본 리소스 중지 및 제거

이 단계에서는 docker compose down 명령을 사용하여 docker compose up으로 생성된 컨테이너와 네트워크를 중지하고 제거합니다. 기본적으로 docker compose down은 컨테이너와 up으로 생성된 기본 네트워크를 제거합니다.

~/project/my-compose-app 디렉토리에 있는지 확인하십시오.

cd ~/project/my-compose-app

이제 다음 명령을 실행하여 서비스를 중지하고 제거합니다.

docker-compose down

이 명령을 실행하면 Docker Compose 는 다음을 수행합니다.

  1. 실행 중인 컨테이너 (webredis) 를 중지합니다.
  2. 중지된 컨테이너를 제거합니다.
  3. docker compose up으로 생성된 네트워크 (my-compose-app_app-network) 를 제거합니다.

컨테이너와 네트워크가 중지되고 제거되고 있음을 나타내는 출력을 볼 수 있습니다.

컨테이너가 제거되었는지 확인하려면 docker ps -a 명령을 사용할 수 있습니다. -a 플래그는 중지된 컨테이너를 포함한 모든 컨테이너를 표시합니다.

docker ps -a

출력에서 더 이상 my-compose-app_web_1my-compose-app_redis_1 컨테이너를 볼 수 없어야 합니다.

docker network ls 명령을 사용하여 네트워크가 제거되었는지 확인할 수도 있습니다.

docker network ls

my-compose-app_app-network는 더 이상 출력에 나열되지 않아야 합니다.

docker compose down은 기본적으로 볼륨 또는 이미지를 제거하지 않습니다. 다음 단계에서 이를 제거하는 방법을 살펴보겠습니다.

docker compose down -v 명령으로 볼륨 중지 및 제거

이전 단계에서 docker compose down은 컨테이너와 네트워크를 제거하지만 볼륨은 제거하지 않는다는 것을 확인했습니다. 이 단계에서는 docker compose down과 함께 -v 플래그를 사용하여 다른 리소스와 함께 볼륨을 제거하는 방법을 배우겠습니다.

먼저, 제거할 리소스가 있도록 서비스를 다시 시작해 보겠습니다. ~/project/my-compose-app 디렉토리에 있는지 확인하십시오.

cd ~/project/my-compose-app

docker compose up -d 명령을 실행하여 서비스를 분리된 모드로 시작합니다.

docker-compose up -d

이렇게 하면 컨테이너와 네트워크가 다시 생성됩니다.

이제 볼륨이 생성되었는지 확인해 보겠습니다. docker-compose.yml에서 볼륨을 명시적으로 정의하지 않았습니다. 그러나 redis와 같은 일부 이미지는 기본적으로 데이터를 유지하기 위해 익명 볼륨을 생성할 수 있습니다. docker volume ls 명령을 사용하여 볼륨을 확인할 수 있습니다.

docker volume ls

my-compose-app_redisdata와 같은 이름으로 나열된 볼륨을 볼 수 있습니다 (정확한 이름은 Docker Compose 버전 및 구성에 따라 약간 다를 수 있지만 프로젝트 이름과 서비스 이름으로 시작될 가능성이 높습니다). 이것은 redis 컨테이너에서 생성된 익명 볼륨입니다.

이제 docker compose down -v를 사용하여 서비스, 네트워크 및 볼륨을 중지하고 제거해 보겠습니다.

docker-compose down -v

-v 플래그는 Docker Compose 에 docker-compose.yml 파일의 volumes 섹션에 선언된 모든 볼륨과 컨테이너에 연결된 모든 익명 볼륨을 제거하도록 지시합니다.

컨테이너, 네트워크 및 볼륨이 중지되고 제거되고 있음을 나타내는 출력을 볼 수 있습니다.

컨테이너가 제거되었는지 확인하려면 docker ps -a를 사용합니다.

docker ps -a

webredis 컨테이너는 나열되지 않아야 합니다.

네트워크가 제거되었는지 확인하려면 docker network ls를 사용합니다.

docker network ls

my-compose-app_app-network는 나열되지 않아야 합니다.

마지막으로, 볼륨이 제거되었는지 확인하려면 docker volume ls를 사용합니다.

docker volume ls

이전에 나열되었던 볼륨 (예: my-compose-app_redisdata) 은 더 이상 출력에 없어야 합니다.

docker compose down --rmi all 명령으로 이미지 중지 및 제거

이전 단계에서 docker compose down을 사용하여 컨테이너, 네트워크 및 볼륨을 중지하고 제거하는 방법을 배웠습니다. 기본적으로 docker compose down은 컨테이너를 생성하는 데 사용된 Docker 이미지를 제거하지 않습니다. 이 단계에서는 docker compose down과 함께 --rmi all 플래그를 사용하여 이미지를 제거하는 방법을 배우겠습니다.

먼저, 서비스를 다시 시작해 보겠습니다. ~/project/my-compose-app 디렉토리에 있는지 확인하십시오.

cd ~/project/my-compose-app

docker compose up -d 명령을 실행하여 서비스를 분리된 모드로 시작합니다.

docker-compose up -d

이렇게 하면 컨테이너와 네트워크가 다시 생성됩니다.

이제 docker images 명령을 사용하여 시스템의 Docker 이미지를 확인해 보겠습니다.

docker images

시스템에 있을 수 있는 다른 이미지와 함께 nginxredis 이미지가 나열되어야 합니다.

이제 docker compose down --rmi all을 사용하여 서비스, 네트워크, 볼륨 및 이미지도 중지하고 제거해 보겠습니다.

docker-compose down --rmi all -v

볼륨도 제거되도록 -v 플래그를 다시 포함시켰습니다. --rmi all 플래그는 Docker Compose 에 docker-compose.yml 파일의 모든 서비스에서 사용되는 모든 이미지를 제거하도록 지시합니다. 태그가 지정되지 않은 경우에도 마찬가지입니다.

컨테이너, 네트워크, 볼륨 및 이미지가 중지되고 제거되고 있음을 나타내는 출력을 볼 수 있습니다.

컨테이너가 제거되었는지 확인하려면 docker ps -a를 사용합니다.

docker ps -a

webredis 컨테이너는 나열되지 않아야 합니다.

네트워크가 제거되었는지 확인하려면 docker network ls를 사용합니다.

docker network ls

my-compose-app_app-network는 나열되지 않아야 합니다.

볼륨이 제거되었는지 확인하려면 docker volume ls를 사용합니다.

docker volume ls

이 프로젝트와 관련된 볼륨은 나열되지 않아야 합니다.

마지막으로, 이미지가 제거되었는지 확인하려면 docker images를 사용합니다.

docker images

서비스에서 사용된 nginxredis 이미지는 다른 컨테이너에서 사용되거나 다른 태그가 있는 경우가 아니면 출력에 더 이상 나열되지 않아야 합니다. docker compose down --rmi all은 다른 컨테이너에서 사용되지 않는 이미지를 제거합니다.

요약

이 Lab 에서는 docker compose down 명령을 사용하여 Docker Compose 파일에 정의된 리소스를 중지하고 제거하는 방법을 배웠습니다. 먼저 Docker Compose 를 설치하고 docker-compose.yml 파일을 생성하는 과정을 포함하여 두 개의 서비스와 네트워크가 있는 간단한 Compose 파일을 준비하는 것으로 시작했습니다.

docker compose up을 사용하여 서비스를 시작한 후, docker compose down을 사용하는 다양한 방법을 살펴보았습니다. 먼저 기본 명령을 사용하여 기본 리소스 (컨테이너 및 네트워크) 를 중지하고 제거했습니다. 그 후, -v 플래그를 사용하여 볼륨을 제거하고 --rmi all 플래그를 사용하여 이미지를 제거하는 방법을 배웠으며, Docker Compose 애플리케이션의 수명 주기를 관리하는 데 있어 docker compose down 명령의 유연성을 보여주었습니다.