Dockerについて深くまとめてみた - その1 Docker概要編

はじめに

はじめまして! ecbeing新卒1年目のいかちゃんです。
今はecbeingのR&D部門で新規プロダクトチームの一員として、機能拡張や環境構築等を行っております。
R&D部門では日々新しい技術の情報交換や調査が行われており、非常に楽しく刺激的な毎日を送れております。

また、1年目の新人にもかかわらずバリッバリに開発を任されており、お仕事に対して強いやりがいも感じております!

さて、今私が担当しております新規プロダクトでは、Dockerを用いて実行環境を構築しております。
(正確にはAWS ECSを通じてDockerを用いております)

Dockerについては学生時代に「ちょーっと聞いた事あるかなぁ…」程度の知識だったのですが、業務で使っておりますし何より めちゃくちゃ面白そう な技術なので…!
ここで1つDockerについてがっつり調べちゃおうという事で記事を作ってみました!

なお、本記事では「仮想環境に関する解説」等の話はいたしません。
「Dockerはどこが作っているのか」「Dockerがどの様にして作られていったのか」等の深い領域について触れる予定です!悪しからず…。

記事の概要としてはこんな感じでいく予定です:

  1. Dockerとは?概要紹介 ←今ここ
  2. Dockerを取り巻く外部サービス
  3. Dockerの構成と仕組み
  4. Dockerのメリット
  5. Dockerの歴史
  6. Dockerの今

それでは行きましょう!

Dockerとは

www.docker.com

Dockerは『Docker社』が提供する、オープンソースのコンテナ型仮想環境構築ソフトウェアです。

正式版がリリースされたのは2014年6月9日(ソース)。
記事執筆現在(2019年7月21日)の最新版は、2019年7月17日にリリースされた、ver18.09.08です(ソース)。
リリースノートを見たところ、現在もかなり頻繁にアップデートが行われているようです!

特徴としては:

  • コンテナ型の仮想環境を提供
    • ゲストOSがホストOSとカーネルを共有する事で、軽量かつ高速な処理を実現
  • コンテナをイメージとして他端末にも配布可能
    • 同一開発環境を簡単かつ迅速に構築可能
  • Linux OS上で稼働する

…といった点が挙げられます。

従来の仮想環境(ホスト型やベアメタル型)だと、動作がもっさりしたりハードウェアレベルで対応しなければいけなかったりと様々な苦行を強いられましたが、Dockerはその様な苦行をしょい込むことなくライトに仮想環境を構築可能です!
もうこれだけで素晴らしい技術だなぁと改めて感じます…。

また、Dockerは現在「無償版(Community Edition, 通称CE)」と「商用版(Enterprize Edition, 通称EE)」が存在します。
ちなみに、この様に分岐したのは2017年の3月にリリースされたDockerからであり、それ以前のDockerはその様には分岐していないようです…。

両者について、Docker Docsより引用すると:

Docker コミュニティ版(CE)は開発者や小さなチームが Docker を使い始め、コンテナをベースとしたアプリケーションを実験するのに最適です。
Docker CE は stable と edge の2つの更新用チャンネルがあります。

  • stable(安定版) は4ヶ月ごとに安定した更新を行います
  • edge(エッジ) は毎月新機能を追加します

Docker エンタープライズ版(EE)はエンタープライズにおける開発と IT チーム向けに設計されており、プロダクションでスケールするようなビジネスにとって重要なアプリケーションを構築・移動・実行します。

…とのことです。
個人開発等で簡易的にサクッと触りたいならDocker CEを、企業で扱いたいならDocker EEを用いるという形でしょうか。

なお、DockerはAWS等のクラウドサービスを経由しても利用することが可能です!
AWSであればECS、AzureであればAKS、Google Cloud PlatformであればGoogle Kubernetes Engineというサービスより利用可能です。
上記の様な巨大クラウドプラットフォームも採用していることからも、Dockerに対する需要や注目度がうかがい知れますね…。

「Dockerとは」の章はここまで、次に「仮想環境を構築する上でのDocker構成について」簡易的に見ていきましょう!

Dockerの構成

今回は「簡易説明」ということで、コンテナとイメージ、レジストリの関係のみを軽くまとめていきます。
これらコンテナやイメージが、計算機上でどの様に稼働しているか等の「Dockerの仕組み」については、次次回…くらいの記事でまとめていく予定ですのでお楽しみに!

まずは、Dockerを構成する各パーツについて見ていきます:

  • コンテナ:
    • 仮想環境でいう「ゲストOS」に該当する部分
    • ホストOSとカーネルを共有し、ゲストOSのLibやBin等の差異やアプリケーションのみを保持する。
  • イメージ:
    • コンテナの雛形
    • コンテナをイメージ化することで、同一のコンテナが手軽に作成可能
  • レジストリ:
    • イメージを管理できる機構
    • ローカル内にも保持可能
  • Docker Engine:
    • Dockerのコマンドを解釈し、イメージ作成やコンテナ起動などを行う。いわゆる「デーモン」として振る舞う。

また、レジストリには「Docker Hub」と「プライベートDockerリポジトリ」の2種類があります。

  • Docker Hub:
    • リモート上のDockerレジストリ
    • ここにイメージをUPすれば全世界よりそのイメージを利用可能
  • プライベートDockerレジストリ:
    • 独自に作成可能なレジストリ
    • レジストリ本体はローカル環境においてもいいし、AWSのS3上などにおいてもいい(※参考:公式Docs)

そして、これらがどの様に繋がり動いているか…は下記を参照ください:

"Dockerの構成"

例えばDocker上でCentOSのコンテナを利用したい場合は:

  1. DockerHubよりCentOSのイメージをPULL
  2. イメージを基にコンテナを起動

…とする感じです。
たったこれだけでCentOSの仮想環境が構築できます!スゴイ!

次章ではDockerのメリットについて見ていきましょう。

Dockerのメリット

「軽量かつ高速な」「仮想環境」を構築可能なDockerには、他のソフトウェアにはない様々なメリットを持っています。

その1: 汚染されていないクリーンな環境を高速に実行可能

仮想環境が構築可能であるため、ホストOSに存在する環境変数やもともとインストールされているソフトウェアに左右されず、常にまっさらな環境を即座に構築可能です。

これを生かし、実行環境を隔離することで環境に依存することなくソフトウェアを構築できます!
私が携わるプロダクトでも、本番環境とテスト環境とでDockerコンテナを分離し、互いに依存することのない状態でシステムを運用しております。

その2: リソースの省エネ化

仮想環境の強みを生かし、1つの計算機に複数の異なる環境を配置することでリソースの省エネ化を図れます。

例えば仮想環境を非導入である状態では、Webアプリケーションを構築するには最低でも「DBサーバー」と「アプリケーションサーバー&Webサーバー」をそれぞれ2台(もしくは3台)用意しなければなりませんが…。
仮想環境であれば環境をOSレベルで隔離できるため、1つの計算機にDBサーバーとアプリケーションサーバー、Webサーバーを乗っけて複数台のサーバーを購入する必要をなくすことが出来ます!

また、Dockerは仮想環境でありながらホストOSとほぼ変わらないレベルの高速処理が可能であるため、処理性能の低下を懸念する必要なく利用できます。

その3: 他仮想化技術と比べて非常に軽く高速に動作

その2でも少し触れましたが、Dockerは他仮想化技術と比較して非常に軽く、かつ高速に動作を行う事が可能です。
OSとカーネルを共有し、仮想環境内部には各OSのLibやBinしか持たせないことで実現されております。

その4: 作成した実行環境をパッケージ化し使いまわしたり拡張したりできる

先にも少し触れましたが、Dockerは作成したコンテナをイメージとして再利用することが出来ます。
また、このイメージを管理するDockerレジストリという機構もあり、リモート上のDockerレジストリ「Docker Hub」にアップロードすれば様々な人々が同一のコンテナを即座に利用可能です。

また、そのコンテナを利用し独自にアプリケーションを乗っけたものをまた公開し…ということも可能です。 これを利用し、例えばUbuntuにPython開発環境をインストールさせたものをイメージとして配布したり、特定のOSSを導入したものをイメージとして配布したりすることで、環境構築の開発コストをググっと下げる…といった利用をしているところも多々あります!

現にJupyter NotebookNode等、様々なOSSがDockerイメージを提供し、導入コストを下げ手軽に利用できる基盤が作成されております!

その5: 注目度が高い&導入事例も沢山

これまでに挙げた様々なメリットから、Dockerは昨今で非常に注目を集めている技術になっております。
現に、Forester社が毎年1期ごとに調査している、「The Forester New Wave」の2018年第4QにてLeadersクラスの技術として認定されているそうです!
https://www.docker.com/resources/report/the-forrester-wave-enterprise-container-platform-software-suites-2018

これだけ注目されているDockerは、実際の企業にも導入事例がたくさんあります。
日本企業でいうとサイボウズやCyberAgentのAbemaTVが、他にもNiantic社のポケモンGOでも採用されているとのこと。
どこもかなりのビックネームプロジェクト OR 企業がDockerを用いております。凄いですな…。

Dockerのインストール

Dockerのインストールは、Linux環境であれば必要パッケージをインストールしてaptyumでインストールが可能なのですが…。
先の章でも記載した通りDockerはLinuxOS上でしか稼働しないため、LinuxOSではない環境(WindowsやMac)では、Linux仮想環境を構築するためのソフトウェアが必要となります。

このソフトウェアに該当するものとして過去には「VirtualBox」が採用されており…。
Dockerを利用するには、このVirtualBoxとDockerが提供するVirtualBoxを操作するツール「Docker Machine」が必須であったそうです。

そして、「2015年8月12日 〜 2016年8月1日」の間このVirtualBoxやDocker Machineの他Dockerを利用するために必要なツールやソフトウェア全てをひとまとめにした「Docker ToolBox」が提供されていたそうです。
過去の記事を見るとDocker ToolBoxという単語が出現するのはこれの影響の様ですね。

しかし、2016年8月1日からはDockerがVirtual Boxではなく「各OS純正の仮想環境を利用する」Docker for WindowsDocker for Macをリリースしております。
また、最近リリースされたWindowsのWSL2を利用した、Docker Desktop for WSL 2版も近々リリース予定とのこと!参考記事)

なので、今後WindowsやMacでDockerを利用する際はこちらにしましょう!
インストーラ形式で提供してくれているので、導入もとっても楽にできます。
(Windowsにインストールするには、Hyper-Vを有効化するというひと手間がかかりますが…。)

ちなみに現在Docker ToolBoxは「Docker for Windows/Macの使用要件を満たしていない端末に対して導入するもの」と位置付けられております…。
公式側も「可能であれば、新しいアプリケーションにアップデートすることをお勧めします」と表明しているっぽいですし、なるべくDocker ToolBoxには頼らずDocker for Windows/Macを利用するようにしましょう!

参考記事

まとめ & 次回記事へ続く…

本記事ではDockerの概要や仕組みの簡単なまとめ、またDockerのメリットや導入事例について見ていきました。

Dockerには「Dockerをより利用しやすく、活用しやすくするため」のサービスがたくさんありますため…。
次回記事ではこの外部サービスについてまとめていく予定です!

最後に、Dockerについてよりディープな?部分をまとめたものをTipsとしてまとめてみました。
宜しければご覧ください。
それではまた次回記事にて!

~ecbeingでは技術を深堀りしてまとめてくれる、発信力のある若手エンジニアを大募集中です!~ careers.ecbeing.tech

Tips

Tips-1: Dockerを作った企業について

Dockerを作ったのは正確には『dotCloud』社という企業です。
dotCloud社は元々PaaSプロバイダであり、そしてDockerは「自社プラットフォームの主要コンポーネントをオープンソース化」したものであるとの事です。
今ではすっかり「Docker」という名前が有名になってしまいましたね…。


参考記事その1, 参考記事その2

Tips-2: Moby Project

github.com

Moby is an open-source project created by Docker to enable and accelerate software containerization.
訳: Mobyは、ソフトウェアのコンテナ化を可能にし加速するためにDockerによって作成されたオープンソースプロジェクトです。

2017年4月、DockerはDockerのコアコンポーネントを別リポジトリ化し「Moby Project」として運用することを表明したそうです。
こちらに関しては、さくらのナレッジさんが超素敵にまとめてくださっていたので引用させていただきます…:

Docker社によると、MobyはDockerやコンテナ環境のための研究開発プロジェクトという位置付けで、Mobyプロジェクト上で外部開発者とのコミュニケーションや外部開発者からの貢献を受け、それを元にDockerを開発するという。
また、Mobyの成果物はDocker上で単にアプリケーションを動かしたいといった人達に向けたものではなく、Docker自体をカスタマイズしたり、独自のコンテナシステムを開発したいような人向けという位置付けだそうだ。

このMobyプロジェクトのリポジトリは新規に作成されたのではなく、dockerのリポジトリ(GitHub上の「docker/docker」リポジトリ)が改名されて利用された。
これにより、Docker(Docker CE)のソースコードが入手できなくなるのではないかという危惧の声も出ていたのだが、その後GitHub上にdocker/docker-ceというリポジトリが作られ、現在はこちらでDocker CEのソースコードが入手できるようになっている。
参考記事: 「Moby」ベースとなったオープンソース版Dockerの最新状況 | さくらのナレッジ

元々DockerはDockerを構成するコンポーネントを細分化する動きが割とあった様で、その動きの一環としてこのMoby Projectが稼働されたようです。
より様々な人々が貢献しやすい様に細分化してくれているのでしょうか…。