×
ソフトウェア

どこでも同じ環境を再現してアプリを動かせる仮想化ツール「Docker」の仕組みとは?



Dockerは2013年に登場して以来、急速に普及が進んでいる仮想化ソフトウェアの一つです。「一体Dockerとはどういうものなのか?」について簡単にまとめました。

Docker - Build, Ship, and Run Any App, Anywhere
https://www.docker.com/

Dockerを理解するには、Docker開発者のSolomon Hykes氏の講演ムービーが参考になります。

Introduction to Docker - YouTube


下図の上半分にあるように、現代においては木箱から車やピアノまで大小さまざまな物が輸送されています。多様な物が輸送されているだけでなく、下図の下半分のように物を運ぶための手段もトラックから鉄道、船舶などさまざま。


「どの手段で何を運ぶのか」を考えていくと無数の組み合わせが存在してしまい、キリがなくなってしまいます。


そこで生み出されたのがコンテナです。コンテナの発明によって、どのような物であってもコンテナにしてしまえばどの輸送手段でも使用できるようになりました。


ITの世界でも、「何を」動かすのか、「どこで」動かすのかについて様々な選択肢が存在しています。


手元のノートPCで動作したアプリケーションがサーバーでも動くとは限りません。Pythonのバージョンが違ったり、環境変数の設定が違ったりするなど考慮しなければならないことは無数に存在します。


そこで登場するのがDockerです。


現実世界では輸送手段のフォーマットを統一するために使用されるコンテナですが、ITの世界ではDockerの仕組みに従ってコンテナにアプリケーションを格納することで、どこで実行しても同じ環境を再現してアプリケーションを動作させることができるようになります。


このことを踏まえた上で、Dockerの仕組みを見ていきます。まず「Dockerfile」を使用してDockerイメージを構築します。Dockerfileは「どのディストリビューションを使用するのか」や「どのように環境構築するのか」といった情報が記載されているテキストファイルです。このDockerfileを元にビルドを行うことで実際にDocker上で実行できるDockerイメージを作成できます。そしてこのイメージを実行したものがDockerコンテナです。


1つのイメージから複数のコンテナを立ち上げることも可能です。同じイメージを実行しても動作するコンテナの環境はそれぞれ分離しています。アプリケーションごとにコンテナを分けることでそれぞれのアプリケーションに適した環境で実行できます。コンテナは実行環境とアプリを統合したものだと言えます。


ただし、実際にDockerイメージを実行する際にどのようなイメージでも実行できるという訳ではなく、内部的にOSの機能を使用しているため、ホストOSとコンテナOSのカーネルが同一である必要があります。つまりLinuxイメージはLinux上でしか実行できないということです。とはいえ、Docker for WindowsやDocker for MacはLinux仮想環境の上で動作するので開発の際に問題になることはほぼありません。逆に、DockerはホストOSのカーネルを利用することで動作を高速化できるため、本番環境でも使用できる仮想化ツールとなりました。


Dockerを利用した実際のサービス構築例は以下のようなもの。1つのイメージから複数のコンテナを立ち上げられるため、容易にスケールさせることが可能です。


「容易にスケールさせることが出来る」と書いたものの、物理的に別のサーバーにコンテナを配置する際の通信の設定や、そもそも一つずつコンテナを立ち上げたり落としたりするのは面倒です。そこで活躍するのが「Docker Swarm」や「Kubernetes(クーベルネーテス)」といったクラスタ管理システムです。


クラスタ管理システムを使うことで複数のコンテナの操作や連携を簡単に行えるようになります。かつてはDocker Swarmのみが公式にサポートされていましたが、コンテナ技術を高度に活用しているGoogleがKubernetesを開発・推進していることもあり、Kubernetesが今やクラスタ管理システムのデファクトスタンダードとなっています。Dockerは2017年よりKubernetesを公式にサポートしています。

こうしたコンテナ技術を利用することで、スケーラビリティが向上するだけでなく、実行環境のコード化やアプリケーションとの一体化が可能になり、ホストの環境に関わらず同じように動作するアプリケーションを開発できるようになりました。インフラの構築や運用が簡単に行えるようになるため、依存関係が複雑すぎてアップデートできないライブラリなどの将来の技術的負債を減らす効果もあります。

なお、コンテナ技術を使用して提供されているサービスとしては「ポケモンGO」や「AbemaTV」などが有名です。

・関連記事
プログラマーたちが使った開発ツール2016年トップ50のランキング「Top 50 Developer Tools of 2016」をStackShareが発表 - GIGAZINE

バージョン管理ツール「Git」は一体どういうものなのか? - GIGAZINE

ソフトウェア開発者が感じる企業への不満とは? - GIGAZINE

Googleによるシステム開発・維持管理ノウハウをまとめた本が無料公開中 - GIGAZINE

大規模な分散システムを構築する際に押さえておくべき概念 - GIGAZINE

in ソフトウェア, Posted by log1d_ts