見出し画像

DockerとCPUアーキテクチャ #454

最近、DockerコンテナとホストマシンのCPUアーキテクチャの違いから、特定の機能が動かないという事象が発生しました。これまでCPUアーキテクチャはあまり意識したことがなく、理解が浅かったので整理してみます。

理解するに当たって、以下の記事から多くを学ばせていただきました。

前提:起きていた違い

アプリケーションがホストされているコンテナと、そのコンテナをホストするマシンのCPUアーキテクチャは以下のように違っていました。

【CPUアーキテクチャの違い】
Dockerコンテナ: x86_64 (x86アーキテクチャ)
ホストマシン  : M2         (ARMアーキテクチャ)

この差異によって、具体的にはpuppeteerが動かない、という現象が起きていました。

CPUアーキテクチャとは

CPUアーキテクチャは、コンピュータのプロセッサの内部設計や命令セットアーキテクチャ(ISA)を指します。これは、プロセッサが理解して実行できる基本的な命令や、データを扱う方法、プロセッサ内のレジスタの構造など、ハードウェアレベルの詳細を定義します。

ちなみにOSとCPUは密接に関連していますが、OSはソフトウェアであり、ハードウェアであるCPUとは異なる概念です。

そんなCPUアーキテクチャですが、x86アーキテクチャARMアーキテクチャという2つの主要なタイプがあり、それぞれ異なる設計哲学と用途を持っています。

x86アーキテクチャ

インテルによって1970年代後半に開発されたアーキテクチャです。名称は最初のいくつかのプロセッサ(8086、80286、80386、80486)の命名規則に由来します。

複雑な命令セットを持ち、一つの命令で多くの低レベルの操作(データ転送、演算など)を実行できます。これは複雑命令セットコンピューティング(CISC)アーキテクチャと呼ばれます。とても便利ですが、CISC コンピュータの強力な命令にはより多くのトランジスターが必要とされ、スペースと電力を大量に消費するという弱点も持っています。

x86アーキテクチャは、主にPC, サーバー, ワークステーションで使用されています。インテルとAMD(Advanced Micro Devices)が、x86アーキテクチャをベースにしたプロセッサの主要な製造者です。

ARMアーキテクチャ

CISCの弱点である消費電力の多さを解決する方法として、1980年代初頭にAcorn Computersによって開発されたアーキテクチャです。現在は、ARM Holdingsがこのアーキテクチャをライセンスし、さまざまな企業がこれをベースに独自のプロセッサを設計しています。AppleシリコンもARMアーキテクチャを独自カスタムする形で製造されています。

ARMはよりシンプルで限られた数の命令セットを持ち、効率的な実行を目指したアーキテクチャです。縮小命令セットコンピューティング(RISC)アーキテクチャに分類されます。ARMプロセッサは、低電力消費が特徴であり、バッテリー駆動のデバイスに適しています。

スマートフォン、タブレット、組み込みシステム、そして最近では一部のラップトップやサーバーなど、幅広いデバイスで使用されています。

アーキテクチャの違いをエミュレーションする

さてここからが今回の解決策につながります。
CPUアーキテクチャには複数の種類があり、その成り立ちや構造が異なることが把握できました。

冒頭で触れたように、今回はコンテナとホストコンピュータでCPUアーキテクチャが異なっています。

【CPUアーキテクチャの違い】
Dockerコンテナ: x86_64 (x86アーキテクチャ)
ホストマシン  : M2         (ARMアーキテクチャ)

2つの構造を橋渡しして、違いを埋める処理をエミュレーションと言います。

エミュレーション(emulation)とは、ある装置やソフトウェア、システムの挙動を別のソフトウェアなどによって模倣し、代替として動作させること。代替となるソフトウェアなどのことを「エミュレータ」(emulator)という。“emulation” の原義は「競争」「模倣」「真似」など。

IT用語辞典

Rosetta2でエミュレーションする

インテルベースのCPUアーキテクチャで起動しているDockerをM2上でバグなく動作させるため、Rosetta2を使用します。

Rosettaは、Appleが開発したMacコンピュータのプロセッサー間の互換性を実現するための技術です。

具体的には、Rosettaは、IntelベースのアプリケーションをM1チップを搭載したMacで実行するためのトランスレーション(翻訳)レイヤーを提供します。

よっしーノート

Docker DesktopでRosetta2を使用する設定

これはDocker Desktop上で簡単に設定できます。
Settingsを開いて、以下の箇所にチェックを入れるだけです。


この状態でコンテナを立ち上げたところ、無事にpuppeteerが使えるようになりました。

ここまではお読みいただきありがとうございました!


参考


この記事が気に入ったらサポートをしてみませんか?