今日からはじめるDocker - コンテナー仮想化の必要性を理解して、まず開発環境に導入してみよう!

Dockerは、コンテナー仮想化ツールです。本稿では、サーバーサイドのアーキテクチャの歴史からDockerが生まれた流れや背景を説明し、PCの開発環境で実際にインストールしてDockerの動作を体験します。

今日からはじめるDocker - コンテナー仮想化の必要性を理解して、まず開発環境に導入してみよう!

エンジニアの方であれば、「コンテナー」や「Docker」といったキーワードを耳にしたことがあるかと思います。自分が関わっているシステムの開発や運用に活用できるかどうか検討している方もいるでしょう。

この記事の前半では、コンテナーやDockerとはそもそもどういったものかを概観していきます。後半では、PC(WindowsやMac)を使ってローカルでDockerを試していきます。

コンテナーとDockerを歴史から知る

Dockerは、コンテナー仮想化ツールです。

Dockerを理解するには、まずサーバーサイドのアーキテクチャの歴史を知るところから始めましょう。この章では、Dockerが生まれた流れや背景を説明していきます。

物理マシンでの処理プロセスの解説から始まり、サーバー仮想化の仕組みや、パブリッククラウドへの変遷、Dockerに使われるコンテナーという概念を、ひとつずつ紐解いていきます。

仮想化前はすべて手作業だった

まず、データベースやWebサーバーといった、サーバーサイドのプロセスの稼働を考えてみましょう。従来のサーバーサイドでは、物理マシン(サーバーハードウェア)上でOS(Linux、Windows Serverなど)が動作し、そのOS上で、データベースやWebサーバーのプロセスが動作します。

開発・テスト・本番環境といったさまざまな環境を構築するとき、ハードウェアが手元になければハードウェアの調達に始まり、OSやネットワーク、OS上で動作するソフトウェアなどのインストールや構成といった、多くの手順を踏む必要がありました。これは時間がかかり、手動作業によるミスも起きがちでした。

サーバー仮想化技術の採用

そんな中で発展してきたのが、サーバー仮想化技術です。古くは1960年代からメインフレームで実用化されていたものですが、2000年代に入ってから、PCサーバー上でのサーバー仮想化が広く採用されるようになってきました。

サーバー仮想化は、1台の物理マシン上で複数の「仮想マシン」を実行するものです。物理マシン上で「ハイパーバイザー」と呼ばれる仮想化に特化したOSが動作し、そのハイパーバイザー上で複数の仮想マシンが動作します。それぞれの仮想マシンでは、ゲストOS(x86サーバーの場合は、Linux、Windows Serverなど)と、そのゲストOS上で動作するソフトウェアが稼働します。

PCサーバー向けのハイパーバイザーの代表例としては、次のものがあります。

サーバー仮想化には、さまざまな利点があります。従来、別々の物理マシン上で動作していた複数のシステムを、同一の物理マシン上で動作する複数の仮想マシンとして統合、集約できるようになるのです。

仮想マシン上で動作するソフトウェアからは、自身が物理マシン上で動いているように見えるので、仮想サーバーへの移行は比較的容易です。新しい環境を準備する際も、既存のサーバー仮想化基盤に仮想マシンを作成するだけなので、ハードウェアの調達は不要です。

また、OSやソフトウェアがインストール・構成済みの「仮想マシンイメージ」を事前に準備しておくことで、まったく同じ構成の仮想マシンを何度でも作成できます。仮想マシンや、その下の物理マシンに障害が発生した場合は、正常な物理マシン上にその仮想マシンを移行して復旧できるため、システムの可用性も向上します。

1

Windows 8.1以降(Proエディション以上)では「Hyper-V」、macOSのOS X Yosemite(10.10)ではオープンソースのハイパーバイザー型の「xhyve」がサポートされています。

エンジニアの方がローカルでサーバー仮想化を行いたい場合は、これらのハイパーバイザーか、または後述のホスト型のサーバー仮想化実装を使うことになるでしょう。記事の後半では、WindowsやMacで、Hyper-V/xhyveを使ってDockerを試していきます。

ホストOS上で仮想マシンを動かせるホスト型

サーバー仮想化には、前述の「ハイパーバイザー型」に加えて、ハイパーバイザーではない通常のOS(ホストOS)上で、仮想マシン(ゲストOS)が動作する「ホスト型」もあります。

パブリッククラウドの普及

2000年代後半になると、IaaS(Infrastructure as a Service)型のパブリッククラウドが普及しはじめました。主要なパブリッククラウドのIaaSサービスの例としては、次のものがあります。

クラウドプラットフォーム IaaSサービス
Microsoft Azure Azure Virtual Machines
AWS(Amazon Web Services) Amazon EC2(Elastic Compute Cloud)
Google Cloud Platform Google Compute Engine

これらのIaaSサービスを使うと、自分で物理マシンやネットワークを所有・管理することなく、好みのスペックの仮想マシンをオンデマンドで作成し起動できます

スペックや起動時間を基にした従量課金で料金を支払い、不要になればいつでも仮想マシンを停止・削除できるのがメリット。ハードウェアを購入する必要がないので初期投資が不要になり、システムへの負荷に合わせてエラスティック(伸縮自在)にシステムのスケーリングができるようになります。

コンテナーの活用

2013年に登場したオープンソースプロジェクトの「Docker」によって、サーバー仮想化に代わるモデルとしてコンテナーが注目され始めました。「OSレベルの仮想化」とも呼ばれるコンテナーでは、物理マシンや仮想マシンの上で動作するOS(ホストOS)上で、ゲストOSなしに、分離された複数のプロセス(コンテナー)が動作します。

コンテナーは、同じホストOS上で動作している他のコンテナーが使うリソース(CPU、メモリ、ディスクI/O、ネットワーク通信、ファイルなど)を確認することはできません。

2

そのため、サーバー仮想化の仮想マシンの場合と同様に、コンテナー内からはあたかも独立した物理マシン上で動作しているように見える利点があります。その一方で、仮想マシンごとに、最低でも数GB以上のメモリ、ある程度のCPU、数十GB以上のディスクを消費するゲストOSを起動するというオーバーヘッドを回避することができます。

コンテナー自体は、決して新しいテクノロジーではありません。コンテナーの先駆けとなったchroot(UNIXでプロセスのルートディレクトリーを変更する操作)は1982年に登場しています。2000年代に入ると、FreeBSD jail、Solaris Containersといった実装も相次いで登場しました。

Linuxでは、プロセスIDやファイルシステムといったリソースを分離するnamespacesや、CPU・メモリ・ディスクI/Oといったリソースを管理するためのcgroupsが登場し、これらのテクノロジーを組み合わせたコンテナー実装であるLXC(Linux Containers)も登場していました。

では、Dockerでは何が新しくなったのでしょうか?

Dockerの登場

Dockerは、Docker, Inc.が主導して開発されているオープンソースのコンテナーテクノロジーです。Dockerは、Linuxの既存のコンテナー実装(cgroupsやnamespacesなど)に、抽象化・自動化のためのレイヤーを追加するものです。Dockerを使うことで、LinuxのホストOS上で複数のコンテナー(実体はLinuxのプロセス)を実行できます。

Dockerには、コンテナーの「イメージ」という概念があります。イメージは実行可能なソフトウェアのパッケージであり、アプリケーションの実行に必要となるすべてのコード、ランタイム、ツール、ライブラリー、設定情報が含まれています。

ゲストOSのすべてのバイナリが含まれている仮想マシンイメージがGBクラスになるのとは違い、コンテナーのイメージは小さければ数十MB程度になります。

実行したいコンテナーイメージさえ準備しておけば、ローカルマシン、オンプレミス(社内設置型)のサーバー環境、パブリッククラウドなど、Dockerを実行できる多様な環境で、そのコンテナーイメージを実行できます。

アプリケーションをコンテナーとして実行することで、柔軟性とポータビリティーが得られるわけです。

開発者・運用担当者から見るDockerのメリット

DevOps(開発者と運用担当者が一体化した開発手法)という言葉がありますが、ここではDevとOpsそれぞれにとっての利点を考えてみましょう。

開発者(Dev)にとっては、Dockerを使って開発環境の構築を自動化することにより、アプリケーション開発に集中することができます。

面倒なデータベースのインストール作業をする必要もないですし、プログラミング言語やツールの複数のバージョンをインストールして、それらを切り替えながら使っていく必要もありません。必要となるソフトウェアや依存関係はすべてコンテナーの中にあるので、「自分のマシンでは動くのだけど、他の環境では動かない」といった問題を回避できるのです。

次に、運用担当者(Ops)はDockerによって、アプリケーションのデリバリーが簡素化されます。バグ修正や新機能を迅速にデプロイできるようになります。開発環境から本番環境にわたって、アプリケーションのビルド、テスト、デプロイを自動化しやすくなるのです。

目的別Dockerの利用パターン

Dockerの典型的な利用パターンを、いくつか見てみましょう。

利用パターン 説明
DevOps CI/CD(継続的インテグレーション/デリバリー)によってデプロイのパイプラインを自動化し、フィードバックを迅速に取得し、開発生産性を向上する
マイクロサービス マイクロサービスアーキテクチャで設計されたアプリケーションの開発、デプロイを簡素化する
従来型アプリケーションのモダナイゼーション(現代化) 既存アプリケーションをコンテナー化することで、コード修正することなしに、コストを削減し、クラウドへの移行もしやすくする
インフラストラクチャ最適化 アプリケーションをコンテナー化することで、サーバーの高密度化、集約を進め、コストを削減する
ハイブリッドクラウド オンプレミス環境からパブリッククラウドまで、コードの修正することのない、完全なポータビリティーを実現する

これらにメリットを感じるようであれば、コンテナーのより詳細な情報をぜひ調べてみてください。

Dockerを試してみよう! 開発環境へのインストールと起動

エンジニアHubに会員登録すると
続きをお読みいただけます(無料)。
登録のメリット
  • すべての過去記事を読める
  • 過去のウェビナー動画を
    視聴できる
  • 企業やエージェントから
    スカウトが届く