![見出し画像](https://assets.st-note.com/production/uploads/images/134385079/rectangle_large_type_2_f141415933f17d652e3c75a4fe278c8f.png?width=1200)
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” の原義は「競争」「模倣」「真似」など。
Rosetta2でエミュレーションする
インテルベースのCPUアーキテクチャで起動しているDockerをM2上でバグなく動作させるため、Rosetta2を使用します。
Rosettaは、Appleが開発したMacコンピュータのプロセッサー間の互換性を実現するための技術です。
具体的には、Rosettaは、IntelベースのアプリケーションをM1チップを搭載したMacで実行するためのトランスレーション(翻訳)レイヤーを提供します。
Docker DesktopでRosetta2を使用する設定
これはDocker Desktop上で簡単に設定できます。
Settingsを開いて、以下の箇所にチェックを入れるだけです。
![](https://assets.st-note.com/img/1710809448430-VfGLzz0rLV.png?width=1200)
この状態でコンテナを立ち上げたところ、無事にpuppeteerが使えるようになりました。
ここまではお読みいただきありがとうございました!
参考
この記事が気に入ったらサポートをしてみませんか?