どんなDevOpsチームも、程度の違いはあれど「優れた機能を素早く顧客のもとに届けなければ」というプレッシャーに常にさらされているもの。もちろん、困った時には、クラウドプロバイダによる各種サービスが利用できます。優れたCLIとAPI統合を備えたスケーラブルなプラットフォームが勢揃い。しかし、厄介なことに、クラウドプロバイダのインターフェースに互換性がないこともしばしば。そんな時に便利なのが、クラウドネイティブツールです。DevOpsチームによるあらゆるクラウドプロバイダと調和したソリューションの構築を支援してくれます。

そのようなツールの二大巨頭が、VagrantDockerです。これらが何を行い、どのように連携することができるのか理解することが、クラウド環境を最大限に活用する鍵となります。

Vagrantは、仮想マシン(VM)環境を単一のワークフローで構築、管理できるツールです。ハイパーバイザで動作するローカルVMを構築する場合でも、クラウドVMを構築する場合でも、Vagrantが力を発揮します。一貫した設定フォーマット、単一のCLI、ソフトウェアのインストールや設定の変更を担う共有プロビジョナなど、全てがこれで事足ります。

そして、もう一方がDockerです。ソフトウェアとサポートする設定を、複数のプラットフォームで一貫して実行可能なイメージとしてパッケージ化する役割を果たします。Dockerを使用することで、DevOpsチームは、マネージドクラウドプラットフォーム上で実行するのと同じように、ローカル環境でソフトウェアを実行できます。

VagrantとDockerは、「再現性のある環境を作り出す」という点で共通していますが、その方法は異なります。それぞれを補完し合う存在とも言えます。この記事では、VagrantとDockerがどのように機能するのかご紹介したいと思います。

Dockerとは

Dockerはアプリケーションの開発、実行を担うオープンプラットフォームです。Dockerでは、カスタムソフトウェア、サポートアプリケーション、ライブラリのほか、設定、ネットワーク、ファイルのマウント、ヘルスチェック、起動スクリプトなどを、イメージと呼ばれる自己完結型のアーティファクトにパッケージ化可能で、DevOpsの間で広く利用されています。

イメージはその後、コンテナと呼ばれる軽量かつ分離された環境で実行されます。通常、固定量のメモリが確保されます。CPUの使用を厳しく制限するVMとは異なり、コンテナはより柔軟で、必要なメモリとCPUのみを消費します。

このため、多数のコンテナを効率的に並行して実行することができ、コストの削減と規模の拡大が可能になります。しかし、コンテナはVMほど安全とは考えられていません。つまり、コンテナは信頼の置けないコードを実行する理想的な環境とは言えません。

Docker
Docker

Dockerの用途(Vagrantと比較したとき)

DevOpsチームは通常、ウェブアプリケーションの配信や実行にDockerを使用します。その一例がクラウドネイティブアプリケーションで、メッセージキューとの統合も、クラウドベースのトリガーやイベントに対応するFaaSプラットフォームでホストされるケースもあります。

KubernetesのようなプラットフォームはDockerをベースにしており、コンテナを大規模にオーケストレーションすることが可能です。さらに、どのクラウドプロバイダでも、自社のPaaS(Platform as a Service)でDockerコンテナを実行できるように、これをサポートしています。DockerをサポートしていないPaaSを見つけることは、今や困難だと言えるレベルです。

DockerはCLIベースのツールの配布と実行も可能で、一般的なクラウドネイティブツールは通常、CLIを組み込んだDockerイメージを提供しています。

Dockerの強み

Dockerは、従来のソフトウェアデプロイメントプロセスで頻繁に見られた問題を解決するものです。開発者によるローカル環境、本番環境での実行に際し、同じアプリケーションであっても、異なる結果が示される可能性があります。開発者が利用するプログラミング言語のバージョンが違っていたり、ウェブサーバーなどのサポートアプリケーションの構成が異なっていたり、本番環境とまったく違うオペレーティングシステムを実行していたりすることが原因になり得ます。このような違いから、「自分のマシンではうまく機能しているのに、一体どうして」というようなコメントが飛び交うことになりかねません。

Dockerイメージには、カスタムアプリケーションのコード、すべてのサポートアプリケーション、およびライブラリが含まれており、イメージがコンテナ内で実行されることで、どこで実行しても一貫した結果を得ることができます。

DockerイメージはDocker Hubのようなレジストリを使用して簡単に配布でき、DevOpsチーム間でイメージを素早く共有し、様々なホスティングプラットフォームを使用してイメージをデプロイすることができます。ちなみに、Kinstaのローカル環境WordPress開発スイート「DevKinsta」でもDockerを採用しています。

バックエンドアプリケーションと一緒にデータベースをデプロイしたり、関連するマイクロサービス群をデプロイしたり、より複雑なアプリケーションスタックが必要になれば、Docker Composeが利用できます。これを使って、単一のコマンドで複数のDockerコンテナを作成、リンクすることが可能です。すべてのコンテナ、関連する設定、およびネットワーク構成が、1つのYAMLファイルで定義されます。Docker Composeがこのファイルを読み込み、複数のコンテナを1つのユニットとして作成、管理する仕様です。

Dockerはまた、主要クラウドプロバイダでほぼ普遍的にサポートされており、DevOpsがクラウド上でDockerイメージを実行する際に十分な選択肢が確保できます。

Vagrantとは

過去何十年もの間、VMはコンピューティングリソースのパーティショニングとプロビジョニングに使える信頼性の高い、そして安全なソリューションとして人気を博してきました。クラウドプロバイダ各社による主力商品とも位置づけられ、多くの商用およびオープンソースのソリューションが、オンプレミスでのVM実行を求めるチームや組織向けに提供されています。

しかし、このような多様性が、DevOpsチームにとっての課題を生み出すことに。各ソリューションごとに、VM作成、管理のために異なるCLIやAPIが公開された結果、ローカル開発環境とクラウドベースのプラットフォームとの間で一貫性を維持することが困難になっています。

そこでVagrantの出番です。これを使うことで、VMプラットフォーム間の根本的な差異に橋がかけられ、DevOpsチームによる単一のCLIと一貫した構文でのVMプロビジョニングが可能になります。Vagrantを採用すると、オンプレミスかクラウドかに関わらず、一貫したVMを作成することができ、環境間の切り替えも簡単になります。Vagrantは、MAMPの代替(macOS、Apache、MySQL/MariaDB、PHP、Perl、Python)など、様々な用途で利用することが可能です。

Vagrant
Vagrant

Vagrantの用途(Dockerと比較したとき)

VMを起動し、ソフトウェアを手動でインストールし、設定ファイルを編集して、OSを設定することはたしかに可能です。しかし、理想的ではありません。なぜなら、このプロセスには再現性がなく、異なるOSやプロバイダでVMを一つ一つ作成しなければならないからです。また、後日、VMがどのように構成されたかを理解することは、ほぼ不可能でしょう。

仮想マシン設定プロセスを自動化することで、この問題を解決できます。Vagrantでは、多くのプロバイダの仮想マシン構築プロセスを自動化できます。Vagrantはまた、Vagrant Cloud上に質の高い仮想マシンを数多く取り揃えており、これを独自の仮想マシン構築に利用可能です。

Vagrantの強み

VagrantをDevOpsチーム内で採用することで、オンプレミス、クラウド、またはその両方を念頭にVMを構築する場合であっても、1つのツールに絞り込んで操作方法の学習を進めることができます。Vagrantの設定ファイルを簡単に調整し、後日再び実行したり、チェックすることで、VMがどのように構築されたかを容易に理解可能です。

Vagrantを使うことで、DevOpsチームによる都度のVM構築プロセス見直しを経ることなく、クラウドへの移行やプロバイダ間の移行が行えます。

Vagrantを利用したVMでは、最近のCPUに組み込まれた特別な仮想化サポートを利用することで、高いレベルでの分離が実行されます。このため、高いセキュリティと確実な分離性能が優先される状況で優れた選択肢となります。

UbuntuFedoraなど様々なLinuxディストリビューションの公式Vagrant Boxが提供されていることも特筆に値します。DevOpsチームはこれを土台として使用することで、独自のVM構築にかかる時間を短縮することができます。

VagrantとDockerをもう少し詳しく

VagrantとDockerはどちらも、ソフトウェアアプリケーションの構築、配布、実行を自動化することで、DevOpsチームの効率アップを後押しします。

Dockerは、イメージ形式のカスタムパッケージングと、コンテナによる軽量な実行環境で、これを実現します。コンテナはプラットフォーム間で一貫して実行されるため、複数人での作業であっても、自分たちのソフトウェアが期待通りに動作しているという確信が得られます。DockerはPaaSおよびFaaSのクラウドプラットフォームで広くサポートされているため、状況に合わせて最適なプラットフォームを選択することができます。

多くのコンテナが1つのホスト上に共存し、同じリソースプールを共有しながら、(完全ではないものの)分離することができます。これにより、コンテナを効率的に拡張することが可能です。

一方でVagrantは、既存のプロバイダを用いた一貫したVM構築の術として真価を発揮します。既にVMに投資し、その高い分離性、セキュリティ、コントロール、カスタマイズ性能に信頼を寄せる開発チームにとって魅力的な選択肢でしょう。

Dockerはまた、信頼できるコードを実行しながら、コンピューティングに伴うコストを最小限に抑える策としても有用です。コンテナは互いに適度に分離され、オーバーヘッドがほとんど発生しません。つまり、多くのコンテナを共有OS上で同時に実行することができます。VMは、高度な分離とセキュリティが必要な場合や、多くの異なるOSを並行して実行する能力が必要とされるケースに適しています。

VagrantとDockerは互いに排他的な技術ではなく、両ツールを並行して使用することができます。例えば、Dockerをアプリケーションの開発と実行に利用しつつ、Vagrantを問題の検証用に特殊な環境を再現する際に活用できます。または、Dockerの新しいバージョンをテストしたり、Dockerイメージとして配布されたツールを隔離された環境でテストするために、Vagrantで作成したVM内でDockerを実行することも可能でしょう。

まとめ

アプリケーション構築、配布、実行には多くの選択肢があります。

Dockerは、大規模かつ効率的なリソース利用を可能にするカスタムイメージフォーマットとコンテナ実行環境を特徴とし、PaaSやFaaSプラットフォームと高い親和性を誇ります。

一方でVMも非常に有用です。クラウド、オンプレミスVMプロバイダを利用し、安全かつ分離された実行環境を確保できます。Vagrantは多くの違いを抽象化し、単一のCLIと一貫した設定構文でプロバイダを超えたVMインスタンス化を支援してくれる代物です。

次のアプリケーション開発に着手する前に、是非ともKinstaのアプリケーションホスティングサービスもご確認ください。Dockerfileを利用したコードのデプロイメントと管理が今まで以上に簡単になります。

Salman Ravoof

Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.