Apple Silicon(M1/M2)環境で、a-blog cms の docker環境を用意する
この記事は Advent Calendar 2022 の25日目の記事となります。a-blog cms にまつわる25日分の記事が公開されていますので、是非ご覧ください。 https://adventar.org/calendars/7427
a-blog cms の Docker 環境
a-blog cms を動作させる Docker環境として「atsu666/ioncube」や「atsu666/acms」というイメージが用意されていました。ただしこのイメージはCPUアーキテクチャが「linux/amd64」のみになっており、M1/M2 mac OS の「arm64」アーキテクチャでは動作しないイメージでした。
これにより、M1/M2 mac OS の環境でも「amd64」にエミュレートしたコンテナを動作させることになり、M1 mac OS に最適化されたパフォーマンスが出せない状況でした。
そこで今回、このイメージをマルチ CPU アーキテクチャに対応したイメージを作成し、M1/M2 mac OSの環境でも「arm64」アーキテクチャのまま動作させれるようにしました。
CPUのアーキテクチャ
CPUのアーキテクチャとは、CPUの仕様・設計だと思ってください。基本的にアプリケーションは、CPUのアーキテクチャ毎に違うものが必要で、別のアーキテクチャで動作させるには、エミュレートするような仕組みが必要となってきます。
CPUアーキテクチャの種類
アーキテクチャ | 説明 | OS例 |
---|---|---|
amd64 | 「AMD社」が発表したx86アーキテクチャを64bitに拡張したもの | Windows、Linux、Intel Mac |
intel64 | 「インテル社」が発表したx86アーキテクチャを64bitに拡張したもの | Windows、Linux、Intel Mac |
x86-64 | amd64とIntel64を含んだ総称 | Windows、Linux、Intel Mac |
arm64 | スマホやタブレットなどで多く利用されているARMアーキテクチャを64bitに拡張したもの | iOS、M1/M2 Mac、ARM版Windows |
「amd64」「intel64」「x86-64」と呼ばれるアーキテクチャには互換性があり、WindowsやLinux, Intel mac OS の環境となります。 対して「arm64」は、スマホやタブレットなどで使用されてきたアーキテクチャで、M1/M2 mac OS の アーキテクチャでもあります。
Dockerイメージの対応アーキテクチャ確認方法
例えば、Docker Hub という Docker コンテナ共有サービス があります。「atsu666/acms」や「atsu666/ioncube」もこのサービスで公開されています。ここを見に行くと以下のような記述が見られます。
「OS/ARCH」のところに、「linux/amd64」や「linux/arm64」などが書かれています。これはこのイメージのタグが対応しているアーキテクチャが記載されています。どのアーキテクチャに対応しているかは、後から実際に動かすときに必要な情報ですので、使用するコンテナは調べれるようにしておきましょう。
Apple Silicon(M1/M2)環境で動作させる
それでは、上記の知識を踏まえ、実際にコンテナを動作させるときのポイントを見ていきたいと思います。動作させるマシンや、使用するイメージによって以下のパターンに分けて紹介します。
- Windows や Intel Mac の場合
- M1/M2 Mac の場合 かつ 使用するイメージが「linux/amd64」のみの場合
- M1/M2 Mac の場合 かつ 使用するイメージが「linux/arm64」も使用できる場合
* ここでは、docker-compose.yml を使った起動を例でみてみます。
Windows や Intel Mac の場合
今までと同じ内容で大丈夫です。詳しくはこちらをご覧ください。
version: '3' services: acms: image: atsu666/acms:8.1 container_name: acms.org privileged: true volumes: - ./acms.org:/var/www/html:rw - /etc/localtime:/etc/localtime:ro environment: - VIRTUAL_HOST=acms.org - HTTPS_METHOD=noredirect
M1/M2 Mac の場合 かつ 使用するイメージが「linux/amd64」のみの場合
M1/M2 Mac 環境で、使用するイメージが「linux/amd64」など、「linux/arm64」アーキテクチャがない場合は、そのままだとコンテナの起動に失敗します。対応するには、「platform」で使用するアーキテクチャを明示してあげる必要があります。ただしエミュレートしてコンテナを動作させることになるので、動作は少し遅くなります。
version: '3' services: acms: image: atsu666/acms:8.1 container_name: acms.org platform: linux/amd64 # この行を追加 privileged: true volumes: - ./acms.org:/var/www/html:rw - /etc/localtime:/etc/localtime:ro environment: - VIRTUAL_HOST=acms.org - HTTPS_METHOD=noredirect
M1/M2 Mac の場合 かつ 使用するイメージが「linux/arm64」も使用できる場合
M1/M2 Mac 環境で、使用するイメージが「linux/arm64」アーキテクチャも含む場合は、特にyamlを変更することなく、今までと同じように利用できます。
version: '3' services: acms: image: atsu666/acms:8.1 container_name: acms.org privileged: true volumes: - ./acms.org:/var/www/html:rw - /etc/localtime:/etc/localtime:ro environment: - VIRTUAL_HOST=acms.org - HTTPS_METHOD=noredirect
全体の docker-compose.yml 例
最終的に a-blog cms を動作させるための「docker-compose.yml」の例を以下にのせます。MySQLや他のコンテナイメージもCPUアーキテクチャの対応が必要なので、Docker Hubで対応しているアーキテクチャを確認しながら、指定をしましょう。特にMySQLはタグによって「linux/arm64」に対応していたり、していなかったりするので、注意が必要です。
version: '3' services: proxy: image: jwilder/nginx-proxy:0.9.0 container_name: proxy volumes: - /var/run/docker.sock:/tmp/docker.sock:ro ports: - "80:80" - "443:443" redis: image: "redis:latest" container_name: redis ports: - "6379:6379" volumes: - "./data/redis:/data" mysql: image: mysql:8.0.30 container_name: mysql user: "1000:50" ports: - "3306:3306" volumes: - ./docker-compose.d/mysql/data:/var/lib/mysql:rw - ./docker-compose.d/mysql/conf.d:/etc/mysql/conf.d:ro environment: MYSQL_ROOT_PASSWORD: root command: --innodb-use-native-aio=0 www: image: atsu666/acms:8.1 container_name: acms.org privileged: true volumes: - ./acms.org:/var/www/html:rw - /etc/localtime:/etc/localtime:ro links: - mysql:mysql - redis:redis environment: - VIRTUAL_HOST=acms.org - APACHE_DOCUMENT_ROOT=/var/www/html - HTTPS_METHOD=noredirect extra_hosts: - acms-300x.org:127.0.0.1
以上となります。 M1/M2 Mac 環境の方は、是非お試しください。