Packer vs Docker: マシンイメージ vs コンテナ
Packer は多くのプラットフォーム向けにマシンイメージ(AMI、VM イメージ)をビルドします。Docker はコンテナイメージをビルドします - 異なるデプロイ先向けの異なる成果物です。
Packer(HashiCorp)は、単一のソース設定から複数のプラットフォームにわたって同一のマシンイメージ - AMI、Azure イメージ、VM イメージ - をビルドすることを自動化します。Docker は container engine で実行されるコンテナイメージをビルドします。両者は競合というより、異なる成果物タイプ向けのツールです: 完全なマシンイメージ vs レイヤー化されたコンテナ。
| Packer | Docker | |
|---|---|---|
| 成果物 | マシンイメージ(AMI、VM) | コンテナイメージ |
| 対象 | VM、クラウドインスタンス | container runtime |
| boot モデル | 完全な OS イメージ | コンテナ内のプロセス |
| マルチプラットフォーム | 多くの builder | OCI registry |
| 最適な用途 | golden な VM/AMI イメージ | コンテナ化されたアプリ |
CI で
runtime や Kubernetes にコンテナを出荷するなら Docker を使います。golden な VM またはクラウドイメージを焼くなら Packer を使います - 例えば tooling を AMI に事前インストールして、インスタンスが起動時に準備完了になるようにします。多くの pipeline は両方を使います: ベースインスタンスイメージには Packer、その中のアプリには Docker。インフラが実際に何を動かすかで選びましょう。
高速化する
どちらのイメージ build も重いです。レイヤーを cache し(Docker)、ベースイメージを再利用し(Packer)、build を CI で実行します。より高速な managed runner は、これらの長時間のイメージ焼き付けを短縮します。
結論
コンテナをデプロイする場合: Docker。VM/クラウドのマシンイメージ(AMI)を焼く場合: Packer。両者は異なる成果物を対象とし、しばしば一緒に機能します - host イメージには Packer、アプリには Docker。