인프런 워밍업 스터디 클럽 4기 데브옵스 - 미션5 (Docker와 Containerd)

인프런 워밍업 스터디 클럽 4기 데브옵스 - 미션5 (Docker와 Containerd)

Docker와 Containerd 명령 실습 [미션5]

쿠버네티스 설치 시 Docker Hub에서 여러 이미지를 다운로드하는 과정에서, "toomanyrequests" 에러가 발생할 수 있음. 이유는 Docker Hub의 요청 제한 정책 때문

  • 익명 사용자: 6시간 동안 최대 100건

  • 로그인 사용자: 6시간 동안 최대 200건

회사에서 여러 사람이 같은 IP로 요청하면 제한에 쉽게 걸릴 수 있음

6시간을 기다리는 것이 아니라 다른 우회 방법을 찾고자 함

 

방법

- 개인 PC인 경우: 휴대폰 테더링으로 IP를 바꿔 우회 가능

- 회사 내부망 전용 PC/VM의 경우: 이미지를 다른 경로(복사 등)로 전달하는 방법을 고려해야 함

 

결론

- 네트워크 제약이 있는 환경이라면 이미지 복사 등 대안이 필요

- 제한을 우회하려면 IP 분리 또는 프록시 등의 방법을 고민할 수 있음

 

image내 개인 노트북을 통해서 이미지를 다운 받고 -> 쿠버네티스가 있는 서버에 복사 하는 플로우 예시

 

[도커 6]->[도커 7]->[컨테이너디 7] 순으로 작업

 

docker

image

containerd

image

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

 

image

 

전체 실습 명령어

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

 

빌드

image

이미지 리스트 조회

image

태그 변경

image

로그인 및 이미지 업로드

image

image

이미지 삭제

image

이미지 다운로드

image

이미지 -> 파일로 변환
image

파일 -> 이미지로 변환
image

 

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

 

네임스페이스 조회

특정 네임스페이스 내 이미지 조회

image

다운로드 및 이미지 확인

image

태그 변경

image

업로드

image

이미지 -> 파일로 변환

image

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

image

삭제 (namespace : k8s.io)

image


 

같은 이미지를 도커에서 받았을 때와 쿠버네티스에서 받았을 때 사이즈가 다른 이유

 

Docker와 Containerd에서 다운로드 받고 이미지 Size를 확인

Docker 다운로드 -> 520MB

image

Containerd 다운로드 -> 247.8MB

image

분석

같은 이미지를 받았는데 사이즈가 이렇게 다를 수 있나? 싶었습니다.

  • Docker로 1pro/api-tester:latest 이미지를 받았을 땐 520MB

  • Containerd로 받았을 땐 247.8MB

처음엔 "혹시 Docker는 amd64 버전을 받고, Containerd는 arm64로 받아서 그런가?" 의심했지만,
두 환경 모두 linux/amd64 플랫폼에서 테스트한 결과, 이건 아니었습니다.

Containerd에서 PLATFORMS 항목에 여러 아키텍처가 표시되는 건,
"이 이미지는 여러 플랫폼을 지원한다"는 정보일 뿐,
여러 플랫폼의 레이어를 실제로 다 받아온 건 아니더라고요.

그렇다면 왜 사이즈 차이가 날까요? 간단히 말하면, Docker는 이미지를 조금 더 '포장'해서 보관합니다.

Docker는 이미지 내에 각종 히스토리, 빌드 정보, 메타데이터 등을 추가로 저장하고, 이걸 자기만의 방식으로 압축하고 재구성해요. 반면 Containerd는 꼭 필요한 것만 가져다 쓰는 경량화 버전입니다.

실제로 Docker에서 이미지를 save해서 파일로 만든 후 Containerd로 가져가면, 파일 사이즈는 줄어들고 그 반대는 오히려 파일 사이즈가 커졌습니다.

 

결론

결국 사이즈 차이는 런타임의 성격 차이에서 비롯된 것 같습니다.

  • Docker는 만능툴답게 이미지에 이것저것 부가 정보를 더 많이 붙입니다. 그래서 같은 이미지라도 더 크게 보이고,

  • Containerd는 핵심만 챙기는 실속형 런타임이라 같은 이미지라도 더 작고 가볍게 보입니다.

그렇기 때문에 오프라인 환경에서 이미지 파일을 주고받을 때는, 사용 중인 런타임에 맞춰 이미지 저장 방식도 맞추는 게 좋습니다. 예를 들어, Kubernetes에서 Containerd를 쓰고 있다면 Docker로 받은 이미지보다 Containerd에서 직접 받은 이미지 파일을 쓰는 게 더 효율적이라고 생각합니다.

댓글을 작성해보세요.

채널톡 아이콘