인프런 워밍업 스터디 클럽 4기 데브옵스 - 미션5 (Docker와 Containerd)
Docker와 Containerd 명령 실습 [미션5]
쿠버네티스 설치 시 Docker Hub에서 여러 이미지를 다운로드하는 과정에서, "toomanyrequests" 에러가 발생할 수 있음. 이유는 Docker Hub의 요청 제한 정책 때문
익명 사용자: 6시간 동안 최대 100건
로그인 사용자: 6시간 동안 최대 200건
회사에서 여러 사람이 같은 IP로 요청하면 제한에 쉽게 걸릴 수 있음
6시간을 기다리는 것이 아니라 다른 우회 방법을 찾고자 함
방법
- 개인 PC인 경우: 휴대폰 테더링으로 IP를 바꿔 우회 가능
- 회사 내부망 전용 PC/VM의 경우: 이미지를 다른 경로(복사 등)로 전달하는 방법을 고려해야 함
결론
- 네트워크 제약이 있는 환경이라면 이미지 복사 등 대안이 필요
- 제한을 우회하려면 IP 분리 또는 프록시 등의 방법을 고민할 수 있음
내 개인 노트북을 통해서 이미지를 다운 받고 -> 쿠버네티스가 있는 서버에 복사 하는 플로우 예시
[도커 6]->[도커 7]->[컨테이너디 7] 순으로 작업
docker

containerd

Docker 명령어 실습
사전 준비(코드 다운로드)
도커 파일 및 App 소스 다운로드
curl -O https://raw.githubusercontent.com/k8s-1pro/install/main/ground/etc/docker/Dockerfile
curl -O https://raw.githubusercontent.com/k8s-1pro/install/main/ground/etc/docker/hello.js

전체 실습 명령어
docker build -t noah1209/hello:1.0.0 .
docker image list
docker tag noah1209/hello:1.0.0 noah1209/hello:2.0.0
docker login -u noah1209
docker push noah1209/hello:1.0.0
docker rmi noah1209/hello:1.0.0
docker pull noah1209/hello:1.0.0
docker save -o file.tar noah1209/hello:1.0.0
docker load -i file.tar
빌드

이미지 리스트 조회

태그 변경

로그인 및 이미지 업로드


이미지 삭제

이미지 다운로드

이미지 -> 파일로 변환
파일 -> 이미지로 변환
Containerd 명령어 실습
전체 실습 명령어
ctr ns list
ctr -n k8s.io image list
ctr images pull docker.io/noah1209/hello:1.0.0
ctr images tag docker.io/noah1209/hello:1.0.0 docker.io/noah1209/hello:2.0.0
ctr image push docker.io/noah1209/hello:2.0.0 --user ratsche
ctr -n default image export file.tar docker.io/noah1209/hello:1.0.0
ctr -n k8s.io image import file.tar
ctr -n k8s.io image remove docker.io/noah1209/hello:1.0.0
네임스페이스 조회
특정 네임스페이스 내 이미지 조회

다운로드 및 이미지 확인

태그 변경

업로드

이미지 -> 파일로 변환

파일 -> 이미지(namespace : k8s.io)로 변환

삭제 (namespace : k8s.io)

같은 이미지를 도커에서 받았을 때와 쿠버네티스에서 받았을 때 사이즈가 다른 이유
Docker와 Containerd에서 다운로드 받고 이미지 Size를 확인
Docker 다운로드 -> 520MB

Containerd 다운로드 -> 247.8MB

분석
같은 이미지를 받았는데 사이즈가 이렇게 다를 수 있나? 싶었습니다.
Docker로
1pro/api-tester:latest이미지를 받았을 땐 520MBContainerd로 받았을 땐 247.8MB
처음엔 "혹시 Docker는 amd64 버전을 받고, Containerd는 arm64로 받아서 그런가?" 의심했지만,
두 환경 모두 linux/amd64 플랫폼에서 테스트한 결과, 이건 아니었습니다.
Containerd에서 PLATFORMS 항목에 여러 아키텍처가 표시되는 건,
"이 이미지는 여러 플랫폼을 지원한다"는 정보일 뿐,
여러 플랫폼의 레이어를 실제로 다 받아온 건 아니더라고요.
그렇다면 왜 사이즈 차이가 날까요? 간단히 말하면, Docker는 이미지를 조금 더 '포장'해서 보관합니다.
Docker는 이미지 내에 각종 히스토리, 빌드 정보, 메타데이터 등을 추가로 저장하고, 이걸 자기만의 방식으로 압축하고 재구성해요. 반면 Containerd는 꼭 필요한 것만 가져다 쓰는 경량화 버전입니다.
실제로 Docker에서 이미지를 save해서 파일로 만든 후 Containerd로 가져가면, 파일 사이즈는 줄어들고 그 반대는 오히려 파일 사이즈가 커졌습니다.
결론
결국 사이즈 차이는 런타임의 성격 차이에서 비롯된 것 같습니다.
Docker는 만능툴답게 이미지에 이것저것 부가 정보를 더 많이 붙입니다. 그래서 같은 이미지라도 더 크게 보이고,
Containerd는 핵심만 챙기는 실속형 런타임이라 같은 이미지라도 더 작고 가볍게 보입니다.
그렇기 때문에 오프라인 환경에서 이미지 파일을 주고받을 때는, 사용 중인 런타임에 맞춰 이미지 저장 방식도 맞추는 게 좋습니다. 예를 들어, Kubernetes에서 Containerd를 쓰고 있다면 Docker로 받은 이미지보다 Containerd에서 직접 받은 이미지 파일을 쓰는 게 더 효율적이라고 생각합니다.
댓글을 작성해보세요.