M1 MacでDockerを使用するための覚書

  • Post Author:

M1 MacでDockerを使用する際どうするか

M1 Macが搭載しているAppleシリコンはCPUにARM社が開発したアーキテクチャを採用しており、以前のMacに使用されているIntelプロセッサのアーキテクチャとは異なる。ほとんどのスマートフォン・タブレットや、Raspberry PiなどでもARMアーキテクチャは使用されており、例えばRaspberry Pi上のLinuxでDockerコンテナを動かす場合も同様にARM用イメージを使用する。


Intel用に用意したDockerイメージはそのままではアーキテクチャの違いでM1 Mac上で使用することができない。

案1

下記からARM用のコンテナを選択して使用する。

https://hub.docker.com

最近の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用コンテナを使用した際に比べて若干の問題が発生する可能性もあるので注意。

we are hiring

優秀な技術者と一緒に、好きな場所で働きませんか

株式会社もばらぶでは、優秀で意欲に溢れる方を常に求めています。働く場所は自由、働く時間も柔軟に選択可能です。

現在、以下の職種を募集中です。ご興味のある方は、リンク先をご参照下さい。

コメントを残す