M1 MacでDockerを使う際のノウハウとエラーの解決方法

「Intel Macで動いていたDockerイメージがM1 Macにパソコンで動かない…」そんな方向けの記事です。

なぜIntel Macで動いていたDockerイメージがM1 Macでは動かなくなるのか、それはCPUアーキテクチャが異なるためです。

ビルド済みのイメージがM1 Mac上で動くようにする方法から書いていきます!

とりあえず動くようにする(docker runできるようにする)対策

以下のように「–platform linux/x86_64」を指定して、あげると大抵のケースで動くようになります。

docker run --platform linux/x86_64 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=password-d mysql:latest

Docker Composeの場合は以下のように指定する。


version: '3'
services:
  mysql:
    image: mysql:latest
    platform: linux/amd64
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - 127.0.0.1:3308:3306

次に、ビルドについて書いていきます!

ビルドできるようにする(docker buildできるようにする)対策

これはなかなか難しいです。

Dockerファイル次第ですがエラー続出したりします。

対応方法は2つです。

2つの対応方法

根気強くエラーを潰す
EC2でビルドする

    根気強くエラーを潰すについて、書いていきます。

    根気強くエラーを潰す

    docker buildする→エラーが出る→エラーの原因を探り対応する→docker buildする→エラーが出る…..といった形でエラーがなくなるまで根気強くエラーを潰す対応です。

    なかなか大変なのと、上記対応でbuildできるDockerファイルができたとしても、次の悩みが今度は出てきます。

    • intel PCで動くのか(チーム内にintel PCの人がいる場合)
    • 動作保証するために、影響範囲・テストなど実施する必要がある

    (大変なのでこのやり方はお勧めしません…)

    次は、EC2でビルドする方法を書いていきます。こちらがオススメの方法です。

    EC2でビルドする

    AWSのEC2(Intel CPU)を使ってビルドする方法です。

    docker buildはEC2でやってdocker runだけ自分のM1 Macでやればいいという発想です。

    ここにたどり着くまで苦労しましたが、これが一番ラクでオススメな方法です!

    次は、デプロイについて書いていきます!

    デプロイする

    2つのデプロイ方法が考えられます。

    2つのデプロイ方法

    Intel PCでビルドしてデプロイ
    M1 Macでビルドしてデプロイ

    Intel PCでビルドしてデプロイ(オススメ)

    デプロイ先は恐らくIntel CPUのことが多いので、Intel PCでビルドするのがお勧めです。

    M1 Macでビルドしたものはデプロイに失敗することもあります。

    基本的にはEC2(Intel CPU)もしくはCodebuildを使ってビルドしてからデプロイするのが良いです。

    M1 Macでビルドしてデプロイ

    AWS ECS FargateではM1 CPUにも対応しているようです。

    AWS ECS Fargateを使い、CPUをARMにしておくと、M1 Macでビルドしたイメージをそのままデプロイして動作させることができます。

    (以下の記事をご参照ください。ARM=M1と置き換えて読んでいただ方がわかりやすいです)

    Amazon ECSの 64-bit ARM ワークロードの操作 - Amazon Elastic Container Service
    クラスターに登録された 64 ビット ARM インスタンスで、高パフォーマンスコンピューティング、CPU ベースの機械学習推論、動画エンコーディング、電子設計の自動化、ゲーミング、オープンソースデータベース、インメモリキャッシュアプリケーションなどを実行できます。

    まとめ

    M1 MacでDockerを使うポイントとエラーとの向き合い方についてみてきました。

    チーム内でM1とIntelが共存しているとなかなか厄介そうですね。

    そのうちM1とIntelを気にしなくて良くなる日が来ることを期待していますー