본문 바로가기
AI Journey/클라우드

[Docker] 다양한 명령, 옵션 살펴보기: 리소스 정리, 이미지 태그 + CLI 출력 포맷팅

by 보눔비스타 2025. 12. 30.

리소스 정리

컨테이너와 이미지의 의존성(Dependency) 문제와 이를 해결하기 위한 삭제 명령어를 배워보자.

1. 컨테이너와 이미지의 의존성 관계

Docker에서 컨테이너는 이미지를 기반으로 생성된 인스턴스다. 따라서 특정 이미지를 참조하는 컨테이너가 (정지 상태라 할지라도) 존재한다면, 해당 이미지는 삭제할 수 없다.

다음 예시를 통해 도커 이미지를 삭제하려고 할 때 conflict가 생기는 상황에 대해 알아보자. 

docker rmi ubuntu:14.04
Error response from daemon: conflict: unable to remove repository reference "ubuntu:14.04" (must force) - container f567a76b46c1 is using its referenced image 13b66b487594

 

ubuntu:14.04 이미지를 삭제하려 했으나, 이를 사용하는 컨테이너(f567a...)가 존재하여 conflict 오류 발생.

 

2. 올바른 삭제 절차 및 강제 삭제

원칙적으로는 컨테이너 정지(stop) → 컨테이너 삭제(rm) → 이미지 삭제(rmi) 순서를 따라야 한다. 하지만 -f (force) 옵션을 사용하면 실행 중인 컨테이너를 강제로 삭제하거나, 이미지를 강제 삭제할 수 있다. 

(단, 이 경우 참조 중인 컨테이너의 이미지 레이어는 Untagged 상태로 남을 수 있음)

 

3. 효율적인 리소스 일괄 정리 (shell substitution 활용)

다수의 컨테이너를 하나씩 삭제하는 것은 비효율적이다.

리눅스 셸의 치환 기능을 활용하여 현재 존재하는 모든 컨테이너와 이미지를 일괄 삭제할 수 있다.

# 모든 컨테이너 강제 삭제
docker rm -f $(docker ps -aq)

# 모든 이미지 강제 삭제
docker rmi -f $(docker images -aq)
  • docker ps -aq: 모든 컨테이너(-a)의 ID만(-q) 출력.
  • $(): 괄호 안의 명령어 실행 결과를 인자로 전달.

이 방식은 실습 환경을 초기화하거나 테스트 후 리소스를 정리할 때 매우 유용하다.

이미지 ID와 이미지 태그

Docker 이미지는 고유한 IMAGE ID를 가지며, 태그(Tag)는 이 ID를 가리키는 별칭(Alias) 역할을 한다. 동일한 이미지를 용도에 따라 다른 버전 이름으로 관리해야 할 때 docker image tag 명령어를 사용한다.

# 현재 이미지 목록 확인
docker images

# nginx:latest 이미지에 new라는 새로운 태그 부여
docker image tag nginx:latest nginx:new

# 태그 생성 결과 확인
docker images

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    058f4935d1cb   2 days ago     152MB
nginx        new       058f4935d1cb   2 days ago     152MB

 

동작 원리

docker image tag [SOURCE_IMAGE] [TARGET_IMAGE] 명령어를 실행하면, 물리적으로 새로운 이미지가 복사되는 것이 아니라 기존 이미지 ID를 가리키는 새로운 포인터(Reference)가 생성된다.

로그를 살펴보면 nginx:latest와 nginx:new의 IMAGE ID(058f4935d1cb)가 동일함을 알 수 있다.

이는 리눅스 파일 시스템의 '하드 링크(Hard Link)'와 유사한 개념이다.

즉, 디스크 공간을 추가로 소모하지 않고도 버전 관리나 배포 단계(예: dev, staging, prod)를 구분하는 데 유용하다.

 

Docker CLI 출력 포맷팅 (Go Templates)

docker ps의 기본 출력은 화면 너비가 좁을 경우 줄 바꿈이 발생하여 가독성이 떨어진다.

Go 템플릿(Go Templates) 문법을 사용하여 필요한 정보만 깔끔하게 출력하고, 이를 환경 변수로 저장하여 재사용할 수 있다.

# 1. 즉시 포맷 적용하여 확인
docker ps --format="ID\t{{.ID}}\nNAME\t{{.Names}}\nIMAGE\t{{.Image}}\nPORTS\t{{.Ports}}\nCOMMAND\t{{.Command}}\nCREATED\t{{.CreatedAt}}\nSTATUS\t{{.Status}}\n"

# 2. 포맷 문자열을 환경 변수(FORMAT)로 저장
export FORMAT="ID\t{{.ID}}\nNAME\t{{.Names}}\nIMAGE\t{{.Image}}\nPORTS\t{{.Ports}}\nCOMMAND\t{{.Command}}\nCREATED\t{{.CreatedAt}}\nSTATUS\t{{.Status}}\n"

# 3. 환경 변수를 사용하여 깔끔하게 출력
docker ps --format="$FORMAT"

출력 형식을 포멧팅한 결과

 

  • Go Templates: Docker CLI는 Go 언어로 작성되었으며, 출력 형식을 정의할 때 {{.Field}} 형태의 플레이스홀더를 지원한다.
    • \t: 탭(Tab) 문자로, 열을 정렬하는 데 사용된다.
    • \n: 개행(New Line) 문자로, 각 필드를 줄 단위로 구분한다.
  • 환경 변수 (export): 복잡한 포맷 문자열을 매번 타이핑하는 것은 비효율적이다. 리눅스 쉘 변수(export)에 저장해 두면 세션이 유지되는 동안 $FORMAT 변수만 호출하여 동일한 뷰를 볼 수 있다. 영구적으로 사용하려면 .bashrc 파일에 등록하면 된다.

기본 docker ps 출력은 수평으로 긴 테이블 형태라 모바일 터미널이나 분할 화면에서 보기 불편하다.

위와 같이 수직(Vertical) 리스트 형태로 변환하면 각 컨테이너의 상태, 포트 매핑 정보, 생성 시간 등을 한눈에 파악하기 훨씬 용이하다.

이는 데브옵스 엔지니어가 모니터링 대시보드를 구축하지 않고 CLI 환경에서 빠르게 상태를 점검할 때 유용할 수 있다.