![[워밍업 클럽:쿠버네티스] 미션#5. 컨테이너 이미지 사례 실습](https://cdn.inflearn.com/public/files/blogs/dac3ac78-3e38-433c-8cd4-8a75a6e2f605/인프런 워밍업 클럽 4기.jpg)
[워밍업 클럽:쿠버네티스] 미션#5. 컨테이너 이미지 사례 실습
해당 실습과정은 큐브옵스 카페의 미션을 실습한 과정입니다.
Docker와 Containerd 명령 실습
도커 (Docker)
CI/CD 환경이 구축된 서버에서 진행
▶ 사전 준비사항
# 도커 파일 및 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
curl 명령어로 Dockerfile과 hello.js를 CI/CD 서버에 다운받았다.
<실습 시작>
1. 빌드
2. 이미지 리스트 조회
docker image로 hello가 있는걸 확인
3. 태그 변경
태크가 다른 이미지가 하나 더 생겼다.
4-1&2. 로그인 및 이미지 업로드
Docker Hub를 확인하면 새로만든 hello image가 hub저장소에 있는 걸 확인
5. 이미지 삭제
hello 이미지 1.0과 2.0 이 모두 CI/CD 서버에서 제거 된걸 확인
6. 이미지 다운로드
Docker Hub에 저장된 hello 이미지를 서버로 다운로드함
새로 1.0 hello가 생긴 걸 확인
7. 이미지 -> 파일로 변환
hello 이미지를 file.tar로 변환하여 저장
▶ 이미지 삭제
8. 파일 -> 이미지로 변환
file.tar 파일에 저장된 정보를 바탕으로 image load -> hello image 생성확인
▶ 정리
컨테이너디 (Containerd)
쿠버네티스가 있는 인프라 환경에서 진행
<실습 시작>
1. 네임스페이스 조회
2. 특정 네임스페이스 내 이미지 조회
3. 다운로드 및 이미지 확인 (이미지는 default라는 네임스페이스에 다운 받아집니다.)
default 네임스페이스가 생성되어졌고,
default 에 hello image 생성을 확인
4. 태그 변경
태그를 변경한 결과,
이미지 1.0과 2.0이 존재하는 걸 확인
5. 업로드
도커허브 상에 2.0 tag가 올라간걸 확인
6. 이미지 (namespace : default) -> 파일로 변환
hello:1.0.0이 file.tar로 변환된걸 확인
7. 파일 -> 이미지로 변환 (namespace : k8s.io)
k8s.io 네임스페이스에 file.tar 파일을 이미지로 변환해 저장한다.
저장 결과 k8s.io 에 hello 이미지가 생성된걸 확인
8. 삭제 (namespace : k8s.io)
같은 이미지를 도커에서 받았을 때와 쿠버네티스에서 받았을 때 사이즈가 다른 이유
▶ Docker Hub (248.26 MB)
Docker Hub의 1pro/api-tester 이미지 중 latest tag를 다운받고 비교할 예정이다.
▶ Docker (490MB)
▶ Containerd (248.3 MiB)
가정 1. Container Image를 만들 때 플랫폼(amd64, arm64)을 고려해야 되는데,
Docker에서는 amd64를 받았고, Kuberentes에서 arm64를 받아서 이미지 크기가 달라졌을 것이다.
▶ Docker (amd64가 보임)
▶ Containerd (amd64, arm64)가 보임
containerd는 amd64와 arm64 두 버전을 모두 지원하는 이미지임에도 불구하고,
amd64 한 버전만 지원하는 Docker의 이미지보다 크기가 작다.
따라서 amd64이건 arm64이건 플랫폼에 따라 크기가 달라지는 건 아닌것 같다.
가정 2. Container 이미지는 각각의 Layer로 구성돼 있는데, Docker에서 다운 받을 때는 전체 Layer를 받았고,
Kubernetes에는 기존 이미지에 이미 존재하는 Layer가 있기 때문에 새로 받은 이미지의 Size가 작게 조회 됐을 것이다.
위 가정이 맞는 지 확인을 위해 전 가정에서 설치했던 Docker image -> Containerd 옮겨보고,
Containerd image -> Docker 환경으로 옮겨보며 사이즈가 어떻게 바뀌나 확인해보겠습니다.
▶ Docker -> Containerd
IMG -> 파일로 변환
1pro/api-tester image 를 파일로 변환시킨 후 (docker-image.tar 생성)
[root@cicd-server ~]# docker save -o docker-image.tar 1pro/api-tester:latest
크기를 확인해보니 490MB -> 472MB 로 조금 줄어들었다.
파일 복사 (CI/CD -> k8s 서버로)
아래와 같이 파일을 인프라 환경에 복사시키고, k8s-master 서버에서 결과를 확인해보겠습니다.
정상적으로 잘 받아온 걸 확인했고, 이제 이미지로 변환해서 자료 크기를 확인해야겠죠?
파일 -> IMG 변환
기존에 존재했던 이미지를 삭제시킨 후, 복사한 파일을 image로 변환시킵니다.
이후 k8s 상 동작하는 image 사이즈를 확인하니, 472MB -> 248.3MiB로 바뀌었습니다.
▶ Containerd -> Docker
IMG -> 파일로 변환
k8s 상 존재하는 이미지는 Docker에서 가져온 파일을 통해 만든 것이므로, Docker Hub에서 pull로 이미지를 다시 다운받음.
이 이미지를 이제 파일로 변환하면 되겠죠?
IMG (248.3MiB) -> 파일 (249M) 변환 완료
파일 복사 (CI/CD -> k8s 서버로)
CI/CD 환경 상에 잘 복사가 된걸 확인
파일 -> IMG 변환
기존 이미지 삭제 후 containerd에서 가져온 파일을 img로 변환
사이즈 확인 (490MB)
가정 3. 쿠버네티스에는 다른 Runtime을 사용 했을 수 있고,
같은 이미지더라도 사용하는 Runtime에 따라서 이미지의 크기는 달라질 것이다.
일프로 님의 설명에 따르면,
Docker는 다른 많은 기능들을 지원해 주기 때문에 (ContainerD 외에도) 실제 이미지가 248.26MB라고 하더라도,
다운 받은 이후 자신의 매타데이터 규격에 맞게 데이터들을 더 추가하고 이미지를 재구성 합니다. 그래서 490MB로 사이즈가 늘어난것!
Containerd에서 이미지를 파일로 바꿔 복사를 해도, Docker 상에서 돌아가는 이미지를 구성할 때 데이터들을 추가해주니 사이즈가 늘어난거라 이해하면 될것 같다.
즉, 우리는 컨테이너 이미지를 받을 때, 쿠버네티스에서 ContainerD를 사용해 컨테이너를 동작시키는 경우, Docker를 통해 이미지를 만들 경우 불필요한 데이터로 인해 이미지 사이즈가 더 커지게 될 수 있다는 걸 확인했다.
댓글을 작성해보세요.