LainyZine: 프로그래머 가이드 🐣

애플 실리콘 M1 용 Docker 설치 방법

컨테이너가 대중화되면서, 컨테이너 관리 도구 Docker도 프로그래머들의 필수 프로그램 중 하나가 되었습니다. 2020년 12월 애플 실리콘 M1 CPU를 탑재한 맥북이 출시되고, 애플 실리콘을 지원하는 Docker Desktop on Mac이 언제 출시될지 많은 관심을 받았습니다. Docker에서도 발 빠르게 애플 실리콘을 지원하는 테크 프리뷰를 릴리스했고, 지난 2021년 4월 15일 공식적으로 애플 실리콘(M1 칩)을 지원하는 Docker Desktop on Mac을 릴리스하였습니다.

이 글에서는 애플 실리콘을 공식 지원하는 Docker Desktop on Mac을 설치하고, 기본적인 사용법에 대해서 소개합니다.

Windows 10, macOS, Linux, Synology DSM 등 다른 환경에서 Docker를 설치하는 방법은 다음 글에서 다루고 있습니다.

Docker Desktop on Mac 애플 실리콘 공식 지원 버전 사전 작업

먼저 터미널이나 iTerm2를 실행해 Rosetta2를 설치해줍니다. Docker에서는 Docker Desktop on Mac을 실행하려면 Rosetta2를 필수적으로 설치해야한다고 안내하고 있습니다. 라이센스에 동의하면 중간에 대문자 A를 입력해줍니다(동의하지 않으면 설치가 되지 않습니다).

$ softwareupdate --install-rosetta
I have read and agree to the terms of the software license agreement. A list of Apple SLAs may be found here: http://www.apple.com/legal/sla/
Type A and press return to agree: A
2021-05-05 12:30:20.000 softwareupdate[28584:408039] Package Authoring Error: 071-08933: Package reference com.apple.pkg.RosettaUpdateAuto is missing installKBytes attribute
Install of Rosetta 2 finished successfully

Docker Desktop on Mac 애플 실리콘 버전 설치

아래 페이지에서 Docker Desktop for Apple Silicon 최신 버전을 다운로드 받습니다. 2021년 5월 현재 최신 버전은 4월 15일 릴리스된 3.3.1입니다.

Docker Desktop for Apple Silicon 릴리스 목록

다운로드하고 dmg 파일을 엽니다. 볼륨이 열리면 Docker 앱을 Applications 디렉터리로 드래그 앤 드롭해줍니다. 용량이 1.5GB 정도 되서 시간이 꽤 걸립니다.

dmg 파일을 열고, Docker 앱을 애플리케이션 폴더로 드래그합니다

복사가 끝나면 Docker 앱을 실행합니다. Docker를 처음 실행하면 보안 경고가 나타납니다. 열기 버튼을 누르면 Docker가 실행됩니다.

Docker를 처음 실행하면 보안 경고가 나타납니다

Docker는 관리자 권한을 요구합니다. OK 버튼을 누르면 관리자 계정의 패스워드를 입력하는 창이 나타납니다. 패스워드를 입력해야 Docker가 정상적으로 실행됩니다.

Docker를 사용하려면 시스템 관리자 권한이 필요합니다

Docker가 실행되면 macOS 메뉴바에 Docker 아이콘이 나타납니다. Docker 아이콘을 클릭하면 Docker 실행 상태가 나타납니다. 초기 기동시간이 몇 분 정도 걸리는데, 곧 Docker Desktop is running 상태가 됩니다.

Docker가 실행되면 메뉴 바에 Docker 아이콘이 나타납니다

Docker 실행이 완료되면 Docker 앱도 같이 나타납니다. 나타나지 않으면 메뉴 막대에서 Dashboard를 실행합니다.

Docker Desktop 앱 첫 실행 화면

처음 실행 되면 Docker의 기본적인 사용법에 대한 튜토리얼을 볼 수 있습니다. Docker에 익숙하다면 Skip해도 무방합니다. 이 데스크탑 앱을 사용해 Docker의 실행 상태를 확인하고 관련 설정을 변경할 수 있습니다. 커맨드라인을 주로 사용하는 경우 많이 사용할 일은 없습니다만, 메뉴 바에서 Docker 데몬의 상태를 확인하는 용도로 자주 확인합니다.

간단한 Docker 명령어 실행해보기

애플 실리콘 용 Docker를 설치했으니 간단한 예제로 동작을 살펴보겠습니다. 터미널 창을 열고 다음 명령어를 실행해봅니다.

$ docker run -it -p 8000:80 nginx:alpine
Unable to find image 'nginx:alpine' locally
alpine: Pulling from library/nginx
595b0fe564bb: Pull complete
.....
e04efcbce226: Pull complete
Digest: sha256:07ab71a2c8e4ecb19a5a5abcfb3a4f175946c001c8af288b1aa766d67b0d05d2
Status: Downloaded newer image for nginx:alpine

/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
.....
/docker-entrypoint.sh: Configuration complete; ready for start up

docker run 명령어로 nginx:alpine 이미지로 nginx 컨테이너를 실행했습니다. nginx:alpine 이미지는 내부 포트 80을 사용합니다. 옵션으로 내부 포트는 80, 외부 포트는 8000으로 열었습니다. 웹 브라우저를 열고 0.0.0.0:8000에 접속해봅니다.

Docker로 실행된 Nginx가 정상적으로 동작합니다

Nginx 서버가 정상적으로 실행된 것을 확인할 수 있습니다. Docker 컨테이너를 실행한 셸에서는 Nginx 접속 로그를 볼 수 있습니다.

172.17.0.1 - - [05/May/2021:03:40:46 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36" "-"
2021/05/05 03:40:46 [error] 32#32: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "0.0.0.0:8000", referrer: "http://0.0.0.0:8000/"
172.17.0.1 - - [05/May/2021:03:40:46 +0000] "GET /favicon.ico HTTP/1.1" 404 556 "http://0.0.0.0:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36" "-"

이를 통해 애플 실리콘 M1 맥북에서도 Docker가 잘 동작하는 것을 확인할 수 있습니다.

linux/amd64 아키텍처와 linux/arm64/v8 아키텍처 이미지 이해하기

기존에 인텔 환경에서만 Docker를 사용해왔다면, 아키텍처에 따라서 도커 이미지가 다르다는 것을 알아두면 좋습니다. 기존 Intel CPU 기반의 macOS나 Linux에서는 linux/amd64 아키텍처의 이미지를 사용합니다. 반면에 애플 실리콘 M1을 사용하는 경우 ARM64 아키텍처 이미지를 우선적으로 사용합니다.

Docker Hub의 이미지 페이지에서 Docker 공식 Nginx 이미지가 지원하는 아키텍처를 확인할 수 있습니다.

Nginx 이미지의 경우 amd64, arm32v5, arm32v6, arm32v7, arm64v8, i386, mips64le, ppc64le, s390x 아키텍처를 지원하고 있으며, 태그 페이지에서 확인해보면 아래와 같이 태그 별로 아키텍처에 해당하는 이미지 목록을 확인할 수 있습니다.

아키텍처 별 이미지 목록을 확인할 수 있습니다

애플 실리콘 용 Docker Desktop을 사용하는 경우 linux/arm64/v8 아키텍처의 이미지를 우선적으로 사용합니다. Docker 옵션으로 보면 --platform linux/arm64/v8이 기본으로 설정되어있는 셈입니다. 하지만 아직 모든 이미지가 arm64 아키텍처를 지원하지는 않습니다.

예를 들어 Docker 공식 MySQL 이미지는 2021년 5월 현재 linux/arm64/v8 아키텍처를 지원하지 않습니다. docker pull을 해보면, 해당 아키텍처의 이미지가 없어서 풀이 받아지지 않는 것을 확인할 수 있습니다.

$ docker pull mysql:latest
latest: Pulling from library/mysql
no matching manifest for linux/arm64/v8 in the manifest list entries

애플 실리콘 용 Docker Desktop은 Rosetta 2를 통해 Intel CPU에서 실행할 수 있도록 linux/amb64로 빌드된 애플리케이션도 실행할 수 있습니다. 이 방식을 사용해 Docker 명령어에 --platform linux/amd64 옵션을 사용하면 linux/amd64 아키텍처 이미지를 사용할 수 있습니다.

이 옵션을 붙여서 다시 도커 이미지를 풀 해봅니다.

$ dockre pull --platform linux/amd64 mysql:latest
latest: Pulling from library/mysql
f7ec5a41d630: Already exists
....
e47da95a5aab: Pull complete
Digest: sha256:04ee7141256e83797ea4a84a4d31b1f1bc10111c8d1bc1879d52729ccd19e20a
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest

linux/amd64 아키텍처의 이미지가 정상적으로 풀 되는 것을 확인할 수 있습니다.

로컬 이미지의 아키텍처는 docker image inspect 명령어로 확인할 수 있습니다.

$ docker image inspect mysql | jq '.[].Architecture'
"amd64"

docker run과 같은 다른 서브 커맨드를 사용할 때도 platform 옵션을 지정할 수 있습니다. linux/arm64/v8 없는 경우 linux/amd64 아키텍처 이미지를 대신 사용할 수 있습니다만, 아직 여러가지 문제가 있는 것을 알려져있으며, Docker 사에서는 가능하면 arm64 이미지를 사용할 것을 권장하고 있습니다. 예를 들어 MySQL의 경우, MySQL을 사용하는 대신 arm64를 지원하는 mariadb와 같은 대체 이미지를 사용하는 방법이 있습니다.

또한 아키텍처가 서로 다르더라도 이미지 이름이 같은 경우 로컬 상에서는 잘 구분이 되지 않는 문제가 있습니다. 이름은 같고 아키텍처만 다른 이미지를 풀 받는 경우 기존 이미지가 덮어씌워지는 문제가 있으니 잘 확인해서 사용하는 것을 추천합니다.

LainyZine은 쿠팡 파트너스 활동에 따른 수수료를 제공받습니다.