Apple Silicon(M1/M2)環境で、a-blog cms の docker環境を用意する

この記事は公開日より1年以上経過しているため、現在の内容と異なる可能性があります。

この記事は 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 環境の方は、是非お試しください。

同じタグ付けがされている記事