본문 바로가기
클라우드

🚛 Docker에서 Containerd로 이사 가기: 명령어 완벽 적응 가이드 & 비교표

by gasbugs 2025. 12. 11.

안녕하세요! 쿠버네티스 생태계가 진화하면서 Kubernetes v1.24부터는 Dockershim이 완전히 제거되었습니다. 이로 인해 많은 엔지니어 분들이 익숙했던 Docker 런타임에서 Containerd 런타임으로 강제(?) 이사를 가게 되었는데요. 😅

"어? 그럼 이제 docker ps 못 쓰는 건가요?"

네, 맞습니다. Containerd 환경에서는 Docker 데몬이 없기 때문에 기존 명령어는 작동하지 않습니다.

하지만 걱정 마세요! Docker와 거의 동일한 경험을 제공하는 도구들이 있습니다. 오늘은 Docker CLI에 익숙한 여러분을 위해 Containerd 환경에서의 생존 가이드와 명령어 비교를 아주 상세하게 정리해 드립니다.


🛠️ Containerd를 다루는 3가지 도구 (누굴 써야 할까?)

Containerd로 넘어오면 명령어가 하나로 통일되지 않고 상황에 따라 3가지 도구를 마주하게 됩니다. 먼저 이들의 정체를 파악해야 합니다.

  1. nerdctl (contaiNERD ctl): 👍 강력 추천
    • Docker CLI와 문법이 거의 100% 호환되는 도구입니다.
    • docker build, docker-compose 기능까지 지원합니다.
    • Docker UX를 그대로 느끼고 싶다면 무조건 이걸 설치해서 쓰세요.
  2. crictl (CRI ctl): 🕵️ K8s 디버깅용
    • 쿠버네티스 노드에서 컨테이너 런타임 인터페이스(CRI)를 디버깅하기 위한 도구입니다.
    • Pod 개념을 이해하고 있으며, 쿠버네티스 노드 상태를 점검할 때 주로 사용합니다.
    • 이미지 빌드(build) 기능은 없습니다.
  3. ctr: 🔧 로우 레벨 (비추천)
    • Containerd 자체에 내장된 기본 CLI입니다.
    • 사용자 친화적이지 않고 디버깅용으로만 쓰입니다. (거의 쓸 일 없습니다.)

📊 Docker vs nerdctl vs crictl 명령어 비교 테이블

가장 많이 쓰는 기능 위주로 비교해 보았습니다. nerdctl이 Docker와 얼마나 똑같은지 확인해 보세요!

기능 Docker (기존) nerdctl (추천) crictl (K8s 디버깅) 비고
버전 확인 docker version nerdctl version crictl version  
이미지 목록 docker images nerdctl images crictl images  
이미지 받기 docker pull <img_name> nerdctl pull <img_name> crictl pull <img_name>  
이미지 삭제 docker rmi <img_id> nerdctl rmi <img_id> crictl rmi <img_id>  
컨테이너 목록 docker ps nerdctl ps crictl ps crictl은 파드 정보도 보여줌
모든 컨테이너 docker ps -a nerdctl ps -a crictl ps -a  
컨테이너 실행 docker run -d ... nerdctl run -d ... ❌ 지원 안 함 crictl은 파드 생성 후 실행해야 함
로그 확인 docker logs <id> nerdctl logs <id> crictl logs <id>  
컨테이너 접속 docker exec -it <id> sh nerdctl exec -it <id> sh crictl exec -it <id> sh  
이미지 빌드 docker build . nerdctl build . ❌ 지원 안 함 가장 큰 차이점
컨테이너 삭제 docker rm <id> nerdctl rm <id> crictl rm <id>  
정보 확인 docker inspect <id> nerdctl inspect <id> crictl inspect <id>  
이벤트 모니터링 docker events nerdctl events crictl events  

🧐 핵심 포인트 심층 분석

단순 명령어 차이 외에도 꼭 알아야 할 중요한 개념들이 있습니다.

1. 네임스페이스 (Namespace)의 함정 🕳️

Docker는 기본적으로 네임스페이스를 사용자에게 숨기지만, Containerd는 네임스페이스를 명확히 구분합니다.

  • Docker: 사용자가 네임스페이스를 신경 쓸 필요 없음.
  • Kubernetes (k8s.io): 쿠버네티스가 생성한 컨테이너들은 k8s.io라는 네임스페이스에 저장됩니다.
  • 문제점: ctr이나 nerdctl을 그냥 쓰면 쿠버네티스 컨테이너가 안 보일 수 있습니다!

해결책:

# 쿠버네티스 컨테이너를 보고 싶다면?
nerdctl --namespace k8s.io ps
# 또는
ctr -n k8s.io container list

(참고: crictl은 기본적으로 k8s 설정을 따라가므로 네임스페이스 지정이 필요 없습니다.)

 

2. 이미지 빌드 (Build) 🏗️

쿠버네티스 노드(Node) 상에서 이미지를 빌드해야 할 때가 있습니다.

  • crictl: 빌드 기능이 없습니다.
  • nerdctl: BuildKit을 내장하고 있어 docker build와 동일하게 Dockerfile을 빌드할 수 있습니다.
# nerdctl로 이미지 빌드하기
nerdctl build -t my-app:v1 .

3. Pod 개념 지원 (crictl) 📦

crictl은 Docker에는 없는 Pod 관련 명령어를 지원합니다. 쿠버네티스 트러블슈팅 시 유용합니다.

# 실행 중인 파드 목록 확인
crictl pods

# 특정 파드의 정보 확인
crictl inspectp <pod-id>

💡 결론 및 추천 전략

Containerd로 런타임이 바뀌었다고 해서 너무 겁먹지 마세요. 전략은 간단합니다.

  1. 평소 개발/운영 시: nerdctl을 설치해서 사용하세요. alias docker=nerdctl을 걸어두면 위화감 없이 사용할 수 있습니다.
  2. 쿠버네티스 노드 트러블슈팅 시: 노드에 nerdctl을 설치하기 어렵다면 기본 설치된 crictl을 사용하여 로그를 보거나 컨테이너 상태를 확인하세요.
  3. ctr은 잊으세요: 정말 깊숙한 레벨의 디버깅이 아니라면 사용할 일이 없습니다.

이제 자신 있게 Containerd 환경에서도 명령어를 날려보세요! 🚀