M1 MacでDockerを使用するための覚書
M1 MacでDockerを使用する際どうするか
M1 Macが搭載しているAppleシリコンはCPUにARM社が開発したアーキテクチャを採用しており、以前のMacに使用されているIntelプロセッサのアーキテクチャとは異なる。ほとんどのスマートフォン・タブレットや、Raspberry PiなどでもARMアーキテクチャは使用されており、例えばRaspberry Pi上のLinuxでDockerコンテナを動かす場合も同様にARM用イメージを使用する。
Intel用に用意したDockerイメージはそのままではアーキテクチャの違いでM1 Mac上で使用することができない。
案1
下記からARM用のコンテナを選択して使用する。
最近のDockerイメージは大抵の場合マルチアーキテクチャイメージなので、特別な対応をせずともARMアーキテクチャのイメージが使われる。
Dockerfile
FROM golang:1.18-alpine # ARM用を選択(こちらはIntelプロセッサでも使用できるはず)
RUN apk add --no-cache git
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o main .
CMD ["./main"]
案2
AMD64で動かす
platform指定を追加する
docker-compose.yaml
services:
db:
build: ./dev/mysql
platform: linux/amd64 #ここを追加
volumes: ...
アーキテクチャの違いとして具体的には、AppleシリコンはBig Endian(格納データの並びが昇順)、IntelはLittle Endian(格納データの並びが降順)となっているため互換性がない。もしAppleシリコン上で Intel用アプリを使用したい場合には適宜変換する必要がある。
その変換をAppleシリコンではRosetta 2というシステムソフトウェアで行っており、Intel用アプリをAppleシリコンで使用する際にバックグラウンドで稼働して自動的に変換を行ってくれる。
案2のようにプラットフォームを指定することでRosetta 2が稼働するようになる。
Rosetta: https://ja.wikipedia.org/wiki/Rosetta
Rosetta 2を使用した場合変換の手間が余計にかかるため、メモリ消費や、データを大量に扱った際に動作が重くなるなど、ARM用コンテナを使用した際に比べて若干の問題が発生する可能性もあるので注意。
コメントを残す