POOOLING FOREST
컨테이너 실행 없이 이미지 내부를 낱낱이 파헤치는 기술: cek 활용기 - 컨테이너를 실행하지 않고도 OCI 이미지 내부를 탐색하고 파일을 검증할 수 있는 도구 'cek'의 활용 사례
Engineering & Tech

컨테이너 실행 없이 이미지 내부를 낱낱이 파헤치는 기술: cek 활용기

컨테이너를 실행하지 않고도 OCI 이미지 내부를 탐색하고 파일을 검증할 수 있는 도구 'cek'의 활용 사례와 주요 기능을 소개합니다.

김영태

테크리드

안녕하세요. 풀링포레스트 테크리드 김영태입니다.

개발자라면 하루에도 수십 번씩 마주하는 검은 화면이 있습니다. 바로 터미널 창이죠. 우리는 습관처럼 docker pull을 입력하고, docker run을 때립니다. 그런데 솔직히 말해, 가끔은 이 과정이 너무 무겁고 부담스럽게 느껴질 때가 있습니다.

얼마 전, 팀 내부에서 급하게 레거시 Nginx 이미지를 분석해야 할 일이 있었습니다. 운영 환경에서 미묘한 설정 오류가 발생했는데, 정확히 어떤 버전의 이미지에서 nginx.conf 설정이 변경되었는지 추적해야 했거든요.

상황은 생각보다 골치 아팠습니다. 해당 이미지는 보안 설정 때문에 로컬에서 셸(Shell) 접근이 막혀 있었고, 설상가상으로 잘못된 설정 탓에 컨테이너가 실행되자마자 죽어버리는(CrashLoopBackOff) 상태였습니다. 실행이 안 되니 docker exec로 들어가서 파일을 확인해볼 수도 없었죠.

"일단 이미지를 로컬로 다운받아서, docker save로 tar로 묶은 다음 압축을 풀어서 볼까?"

순간 머릿속을 스친 생각이었지만, 수백 메가바이트짜리 이미지를 매번 압축 풀고 레이어(Layer) 해시값을 뒤져가며 파일을 찾는 건 시간 낭비이자 고역이었습니다. 등줄기에 땀이 흐르더군요. 단순히 텍스트 파일 내용 한 줄 확인하고 싶은 건데, 왜 이렇게까지 해야 하나 싶었습니다.

그때 발견한 도구가 바로 cek입니다.

이 도구를 처음 접했을 때, "이거다!" 싶었습니다. cek는 컨테이너를 절대 실행하지 않습니다. 대신 OCI(Open Container Initiative) 표준을 따르는 이미지의 바이너리 데이터를 직접 읽어서, 마치 로컬 파일 시스템을 탐색하듯이 이미지 내부를 보여줍니다. 보안상 안전하고, 무엇보다 빠릅니다.

저처럼 '실행되지 않는 컨테이너'의 내부를 보고 싶거나, 무거운 이미지를 굳이 띄우지 않고 내용물만 검증하고 싶은 분들에게 이 도구가 어떻게 구세주가 될 수 있는지, 제가 겪은 사례를 바탕으로 소개해보려 합니다.

가장 먼저 써본 기능은 이미지 검사(Inspect)였습니다. docker inspect와 비슷해 보이지만, 불필요한 정보는 빼고 딱 필요한 레이어 정보와 다이제스트(Digest), 크기만 깔끔하게 보여줍니다.

cek inspect nginx:latest

이 명령어를 치면 이미지 생성 시간, 아키텍처, 그리고 각 레이어별 용량이 나옵니다. 어떤 레이어가 용량을 많이 차지하는지 한눈에 보여서, 이미지 경량화 작업을 할 때도 유용하겠다는 생각이 들었습니다.

하지만 진짜 감동받은 기능은 파일 리스팅(ls)내용 읽기(cat)였습니다.

보통 이미지 안에 특정 파일이 있는지 확인하려면 컨테이너를 띄우고 ls를 쳐야 했죠? cek는 그럴 필요가 없습니다. 아래처럼 명령어를 입력하면 이미지 내부 파일 시스템 구조를 바로 보여줍니다.

# Nginx 설정 파일들이 제대로 들어있는지 확인
cek ls nginx:latest /etc/nginx

# 특정 패턴의 파일만 필터링해서 확인
cek ls --filter '**.conf' nginx:latest

제가 겪었던 문제 상황으로 돌아가 보죠. 컨테이너가 자꾸 죽어서 설정 파일을 볼 수 없던 그 상황에서, 저는 cek cat 명령어로 문제를 해결했습니다. 이 명령어는 이미지를 실행하지 않고도 특정 파일의 내용을 표준 출력(stdout)으로 뱉어줍니다.

# 실행 없이 설정 파일 내용 확인하기
cek cat nginx:latest /etc/nginx/nginx.conf

심지어 파이프(|)를 활용하면 로컬 도구들과의 조합도 환상적입니다. 예를 들어, 운영체제 버전을 확인하고 싶다면 굳이 셸에 들어갈 필요 없이 이렇게 하면 됩니다.

cek cat alpine:latest /etc/os-release | grep VERSION_ID

이 기능 덕분에 저는 문제가 된 Nginx 설정의 차이를 단 몇 초 만에 찾아낼 수 있었습니다. 더 나아가, cek compare라는 기능은 두 이미지 태그 간의 변경 사항을 비교해주더군요.

# 버전 업데이트 시 무엇이 바뀌었는지 파일 단위로 비교
cek compare alpine:3.19 alpine:3.18

이 명령어를 실행하니 공통된 베이스 레이어는 건너뛰고, 실제 변경된 파일만 딱 집어서 보여주었습니다. "아, 3.18에서 3.19로 가면서 이 패키지 설정이 이렇게 바뀌었구나"를 직관적으로 알 수 있었죠.

저희 풀링포레스트 팀은 이제 CI/CD 파이프라인에서 배포 전 이미지를 검증할 때 이 도구를 적극적으로 활용할 계획을 세우고 있습니다. 단순히 빌드가 성공했다고 믿는 게 아니라, 실제로 중요한 설정 파일이 올바른 위치에 들어갔는지 cek로 찌르고 확인하는 과정을 넣으려는 것이죠.

기술은 결국 우리의 시간을 아껴주고, 불확실성을 줄여주는 도구여야 합니다. 컨테이너 내부가 블랙박스처럼 느껴져 막막할 때, 무작정 실행부터 시키지 말고 cek 같은 도구로 스마트하게 들여다보는 습관을 길러보세요.

여러분의 디버깅 시간이 확연히 줄어드는 것을 체감하실 겁니다. 오늘도 안전하고 효율적인 배포 하시길 응원합니다.

지금 읽으신 내용, 귀사에 적용해보고 싶으신가요?

상황과 목표를 알려주시면 가능한 옵션과 현실적인 도입 경로를 제안해드립니다.