2022-11-17-TIL
2022-11-17-TIL
Today I Learned
JIB build vs Docker build
Jib은 Dockerfile 없이, 그리고 로컬 Docker 데몬 없이 Java 애플리케이션의 컨테이너 이미지를 만드는 도구다. Maven이나 Gradle 플러그인으로 동작하면서 애플리케이션을 의존성, 스냅샷 의존성, 프로젝트 의존성, 리소스, 클래스 같은 여러 레이어로 나눈다. 자주 바뀌는 클래스와 잘 바뀌지 않는 큰 의존성을 다른 레이어에 두기 때문에, 코드만 고쳤다면 바뀐 레이어만 다시 빌드하고 푸시한다(Jib FAQ). 반면 docker build는 Dockerfile에 적은 명령을 순서대로 실행하므로 레이어 구성을 직접 설계해야 한다.
기본적으로 JIB는 멀티플랫폼으로 빌드가 되지않는다. 따라서 도커 플러그인 buildx를 활용해서 멀티플랫폼 빌드를 해야한다.
조금 더 정확히 적으면, Jib FAQ는 플랫폼을 지정하지 않았을 때의 기본값이 amd64/linux 단일 플랫폼이라고 설명한다. jib.from.platforms(Gradle)나 <from><platforms>(Maven)에 여러 플랫폼을 적으면 이미지를 플랫폼별로 만들고 manifest list를 푸시하지만, 이 기능은 incubating 단계이고 로컬 Docker 데몬이나 tar 파일로 빌드할 때는 쓸 수 없다. 그래서 Dockerfile과 buildx로 빌드하는 방법이 대안이 된다.
1
2
3
4
$ docker buildx create --use --name mybuild node-amd64
mybuild
$ docker buildx create --append --name mybuild node-arm64
$ docker buildx build --platform linux/amd64,linux/arm64 .
위 명령은 amd64 노드와 arm64 노드를 하나의 빌더(mybuild)로 묶은 뒤, 두 플랫폼 이미지를 한 번에 빌드한다. Docker 문서는 멀티플랫폼 빌드 전략으로 QEMU 에뮬레이션, 여러 네이티브 노드, 크로스 컴파일 세 가지를 든다. 위 방식은 두 번째로, 에뮬레이션보다 빠르고 QEMU가 처리하지 못하는 경우도 다룰 수 있다(Docker: Multi-platform builds).
- https://cloud.google.com/blog/topics/developers-practitioners/comparing-containerization-methods-buildpacks-jib-and-dockerfile
- https://gitter.im/google/jib?at=5f5f2d1aa9c2c8511e93cfaa
- https://www.linkedin.com/pulse/docker-image-build-vs-jib-eran-shaham
- https://tomgregory.com/jib-vs-spring-boot-for-building-docker-images/
- https://github.com/GoogleContainerTools/jib/issues/2523
- https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md
Graviton
Graviton은 AWS의 프로세서 제품군이다. AWS는 Graviton을 EC2 워크로드에 가장 좋은 가격 대비 성능을 내도록 설계한 프로세서라고 소개한다(AWS Graviton). 아키텍처는 x86이 아니라 Arm 계열이다. AWS의 Graviton 시작 가이드를 보면 Graviton2는 Arm Neoverse-N1, Graviton3는 Neoverse-V1 코어를 쓰며, C6g, M6g, C7g 같은 인스턴스가 Graviton 위에서 동작한다(aws-graviton-getting-started).
위의 멀티플랫폼 빌드가 필요한 이유가 여기에 있다. x86 노트북이나 CI에서 만든 amd64 이미지는 Graviton 인스턴스(arm64)에서 그대로 실행되지 않는다. 두 아키텍처용 이미지를 하나의 태그 아래 manifest list로 묶어 두면, 실행하는 쪽이 자기 아키텍처에 맞는 이미지를 골라 받는다. 같은 가이드는 Amazon ECR이 멀티 아키텍처 컨테이너를 지원한다고 적고 있다.
- https://sungwookkang.com/1493
- https://aws.amazon.com/ko/ec2/graviton/
- https://aws.amazon.com/ko/blogs/korea/category/compute/graviton/
댓글
아직 댓글이 없습니다