リモート開発メインのソフトウェア開発企業のエンジニアブログです

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

Moba Pro

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

Tags

← 前の投稿

Laravel Sail 初期化時に使用する PHP のバージョンを指定する

次の投稿 →

Laravel のテストで data provider の中で faker を使うとエラーになる

コメントを残す