おおくまねこ

職業プログラマーです。興味のある話題を書いています。

M1 Macと docker compose の付き合い方について考えた

はじめに

背景

Mac Book Air 2020 年モデル、いわゆるM1 Macを買いました。 今まで使っていた Dockerを動かすとき、docker composeの使い方が変わったので、その内容について記載します。

まえがき

CPUが Apple Silicon と呼ばれるもので、ARMプロセッサーのCPUになります。 以前までのIntell製のCPUと違う点がよく挙げられるのですが、 ソフトウェア開発者視点で遭遇するものの一つにDockerがあります。

今までIntel製で動いていたDockerファイルが動かない。と言われたり、実際になったりすることがあります。 というか、なりました。

その時の Docker、docker compose の使い方についてをまとめようと思います。

環境

今回試した環境は以下 - OS: macOS Monterey - CPU: AppleM1 - メモリ: 16GB

方法

具体的な対応方法について、知っている範囲で説明を記載していこうかと思います。

ARM CPU 対応版の Docker ファイルを利用する

既存のDockerファイルがあり、コミュニティの方でDockerファイルを管理されている場合、 ARM CPU 対応されたイメージがある場合があります。

cassandra を例にすると、Intel CPU で動く cassandra、 ARM 対応した arm64v8/cassandra があります。 そういった対応版を使うとよさそうです。

その他:アーキテクチャを指定する

Docker の起動時、プラットフォームを指定する方法です。 マルチ CPU アーキテクチャのサポートを活用 — Docker-docs-ja 19.03 ドキュメント

1年ほど前(2021年)の時点では、mysql などはM1 Mac で起動すると起動が失敗するケースがあったようです。 (いま手元で試したら mysql は起動したので、Docker側で対応されている気がする)

その際は docker で起動した時にアーキテクチャ指定を行うことで起動していました。 起動時のオプションに--platform linux/x86_64を指定します。

docker compose について

Intel CPU、arm CPU が混在する環境、チームではどうすると良いかと考えた時について。 個人的な解決しては「docker composeファイルの差分ファイルを作って、読み込むようにする」という結論に落ち着きました。

docker-compose.yaml は複数指定すると、差分を上書きして実行してくれます。

ファイル間、プロジェクト間での Compose 設定の共有 — Docker-docs-ja 19.03 ドキュメント

これを利用して、開発者ごとに差分を読み込むようにします。

共通の docker compose ファイル。docker-compose.yamlとする。

version: '3'
services:
  sandbox-service:
    build:
      context: .
      dockerfile: ./Dockerfile
    tty: true
    volumes:
      - ../:/app
    working_dir: /app
    ports:
      - 8080:8080
  cassandra:
    image: cassandra:4.0
    tty: true
    ports:
      - 9042:9042

差分の docker compose ファイル。m1mac.yamlとする。

version: '3'
services:
  cassandra:
    image: arm64v8/cassandra:4.0

それぞれの環境ごとでコマンド実行時に読み込みを行います。

docker compose -f docker-compose.yaml up -d
  • ARM CPU ユーザー
docker compose -f docker-compose.yaml -f m1mac.yaml up -d

アーキテクチャ指定で起動する場合でも、docker-compose ファイル、環境差分ファイルにも起動オプションに上記を指定すれば問題ないのかなと思います。

終わりに

無事にM1Mac でも Docker、docker composeが使える目処がたちました。 まだ触れ出したばかりなので、色々試していきたいと思います。