[Docker] M1 맥북에어로 라즈베리파이(ARM)용 docker image 만들어 보기 Develop Tip

지난번에 간단 M1 애플실리콘의 맥북에어를 살펴보았습니다.
애플이 과감히 인텔의 X86 CPU를 버리고 자체 ARM 기반 CPU를 만들었다는 
아주 큰 사건이었죠.

30년도 더 전에 8086, 8088과 같은 CISC 머신 대비,
68000, HP-UX 머신 등과 같은 RISC 기계를 다루어 본 적이 있는데,
이번 인텔과 ARM의 가장 큰 차이 역시 이 CISC냐 RISC냐의 차이 인 것 같습니다.

CPU 입장에서는 OP코드가 있어서 어떤 어떤 일을 수행하도록 되어 있고,
이를 CPU 차원에서의 마이크로코드라 했던 것 같네요.

암튼 CISC인 경우 이 OP 코드가 알알이 꼼꼼이 무지 많고
(시간이 지날 수록 더 많아지지요), 반대로 RISC 머신은
아주 적은 세트의 OP 코드만 존재하지만, 동일한 기능을
상단의 소프트웨어가 처리한다는 개념입니다.

뭐 궁극적으로는 전력 소비, 발열 등등에서 그 차이가 나온다 하는데,
기존 라즈베리파이, 작은 임베디드 시스템 등에서 사용되어 오던
ARM CPU가 M1 애플 실리콘이 나와서는 급기야 기존 인텔 CPU를
여러면에서 확 뛰어넘는 계기가 되었다 봅니다.


최근에 라즈베리파이 에서도 docker를 돌리고 필요 이미지를 build 해 볼 필요가 있었습니다만,
그런 생각이 들었습니다.
'어.. 같은 ARM 계열이라면 라즈베리파이 등의 작은 ARM CPU용의 docker image 를 
 M1 맥에서 생성할 수 있지 않을까?'
하고 말입니다.

결론은 쉽게 됩니다! 입니다.
뭐 CPU가 달라서 기존 인텔용 윈도우를 돌리는 제약사항이 생기는 대신,
반대로 장점이 되는 순간입니다.


우선 약 일이주일 전 (2021년 4월중)에 설치를 한 docker인 경우,
애플의 M1 칩을 아주 잘 지원합니다.

위와 같이 해당링크에서 Docker Desktop을 설치합니다.
기본 설정은 변경하지 않았습니다만, 설정을 들어가서

Docker Engine을 확인하고 설정을 확인해 보았습니다.
참조 블로그에서는 expermental을 ture로 놓았지만,
아마도 buildkit 부분으로 나뉘어진 것 같네요. 기본으로 된 상태입니다.

다음 위의 속성은 기본으로 되어 있는지 아니면 체크한 것인지는 정확하게 기억나지 않지만 체크했습니다.

이제는 M1 맥에서 서로 다른 CPU 플랫폼 별 build 가능한 목록을 확인해 보겠습니다.

docker buildx ls

라고 명령을 주면,
linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
와 같이 결과가 나옵니다. 현재 대부분의 인텔 CPU는 amd64로 보시면 됩니다. 일부 32비트는 386 이라 보시면 될 것 같네요.
또 기본 M1 칩은 arm64로 보입니다. 재미난 부분은 ARM이 버전별로 v6, v7 등의 하위 CPU도 존재하는데,
그것에 맞는 linux/arm/v7, linux/arm/v6 와 같은 CPU를 타겟으로 docker 이미지를 생성할 수 있다는 사실입니다.

우선 특정 테스트 디렉터리를 만들고 그 안에 들어갑니다.
그 다음, 다음과 같은 아주 간단한 Dockerfile 을 생성합니다.

FROM debian:buster
CMD uname -m

위의 내용으로 docker image를 빌드하면 데비안 시스템을 가져와서
uname -m 이라고 명령을 내리고 그 결과를 출력합니다.
uname -m은 해당 머신의 CPU 플랫폼을 출력한다 보시면 되겠습니다.

이제 아래와 같이 간단한 build.sh 쉘 스크립트를 만들어,


#!/usr/bin/env bash
docker buildx ls

docker buildx build -t debian-local-build .
docker run --rm debian-local-build
# output is
#aarch64

docker buildx build --platform linux/amd64 -t debian-amd64-build .
docker run --rm debian-amd64-build
# output is
#x86_64

docker buildx build --platform linux/arm/v7 -t debian-armv7-build .
docker run --rm debian-armv7-build
# output is
#armv7l

특정 플랫폼별 (기본, linux/amd64, linux/arm/v7)
이미지를 생성하고 실행시켜보면,

다음과 같이

M1 기본 CPU 이미지인 경우 : aarch64 (일반적인 ARM 64비트 CPU)
linux/amd64 이미지인 경우 : x86_64 (일반 적인 인텔 64비트 CPU)
linux/arm/v7 이미지인 경우 : armv7l (ARM V7 CPU)

와 같이 이미지가 생성되고 실행까지 되는 것을 확인할 수 있었습니다.
(amd64인 경우 로제타2 또는 QEMU가 돌린 결과인지는 확실하지 않네요)

암튼 M1 칩으로 또 다른 세상을 접하고 있다고 생각됩니다.


어느 분께는 도움이 되셨기를 ..

덧글

  • 둥굴둥굴 2021/08/20 00:03 # 삭제 답글

    선생님 혹시 m1에서 오라클 sql developer 사용이 가능할까요??
  • 지훈현서아빠 2021/08/23 13:12 #

    https://shanepark.tistory.com/87
    참고하시면 될 듯요
댓글 입력 영역

구글애드텍스트