Edited at

Dockerの野望、Kubernetesへ

More than 1 year has passed since last update.

(2018/08/09追記)たくさん「いいね」を頂きました。ありがとうございます:hugging:


これは何?


  • ネットにある多くの情報は「Dockerの本質について」触れていないものが多いように感じたので、そのギャップを自分が理解した範囲で埋めてみます。

  • 主に以下のことを説明します。そのため、Docker(Kubernetes)の特徴の説明の多くを省略しています。


    • 「なぜDockerが生まれたのか?」(Docker以前~Dockerの先にあるもの)

    • 「Dockerは純粋な仮想化ではない」(これまでの仮想化との違いの話)

    • 「Dockerが1コンテナ1アプリの理由」

    • 「Docker=開発環境を簡単に、早く作れていいね」という*だけ*ではない。

    • 「Dockerの野望(本当のゴール)=負荷分散システム(Kubernetes)」であることを説明する。



  • 最後になりましたが、私のDockerの経験は浅く、Kubernetesは使ったこともありません。なので、嘘を書いている可能性もあります。鵜呑みにしないでください。


仮想化の進化について


  • 1台の物理サーバを「より効率的に使いたい」「同一サーバ上に隔離環境を作りたい」という目的から始まり仮想化は進化してきたようです。

  • 仮想化方式の違いを知るには次のようなポイントがあります。


    • 環境の隔離

    • 起動の速さ

    • 仮想イメージの大きさ(サイズ)

    • 起動(systemd,init)の仕組みの違い




1) 物理サーバ


  • 仮想化が無い時代。

+-------------+ +-------------+ ---

| application | | application | ↑
+-------------+-+-------------+ |
| systemd | |distribution
+-----------------------------+ |
| linux kernel | ↓
+-----------------------------+ ---
| hardware |
+-----------------------------+


2) ハードウェア仮想化


  • 1台のPC上で複数のゲストOSを動かしたい。ソフトウェアでPCをシミュレーションしてしまおう

  • ソフトでハードウェア(HW)をシミュレーションすることで、1HWをあたかも複数あるように見せる。

 +-------------+ +-------------+ +-------------+ +-------------+

7| application | | application | | application | | application |
+-------------+-+-------------+ +-------------+-+-------------+
6| systemd | | systemd |
+-----------------------------+ +-----------------------------+
5| linux kernel | | linux kernel |
+-----------------------------+ +-----------------------------+
4| 仮想hardware | | 仮想hardware |
+-----------------------------+-+-----------------------------+
3| virtualbox, kvm など |・・・ここまで1つ
+-------------------------------------------------------------+
2| linux kernel |
+-------------------------------------------------------------+
1| hardware |
+-------------------------------------------------------------+


3) Linux(LXC)コンテナ


  • 1台のPC上で複数のゲストOSを動かしたい、Linux限定 ならもっと早く動かせるよね

  • linux kernel が持つ名前空間を分離する機能を使って、1つのカーネルをあたかも複数あるように見せる。

 +-------------+ +-------------+ +-------------+ +-------------+

4| application | | application | | application | | application |・・・systemdからアプリを起動する。(通常のLinuxの仕組みと同様)
+-------------+-+-------------+ +-------------+-+-------------+
3| systemd | | systemd |
+-----------------------------+-+-----------------------------+
2| linux kernel & 名前空間分離する機能を使用 |・・・ここまで1つ
+-------------------------------------------------------------+
1| hardware |
+-------------------------------------------------------------+


4) Dockerコンテナ


  • 1台のPC上で複数のゲストOSを動かしたい、Linux限定、1コンテナ1アプリ限定ならもっともっと早く動かせるよね

  • Linuxコンテナと違い、1コンテナ1アプリケーションとし、直接アプリケーションを起動する。

 +-----------------------------+ +-----------------------------+

3| application | | application |・・・アプリを直接起動する
+-----------------------------+ +-----------------------------+
| (systemdなし) | | (systemdなし) |
+-----------------------------+-+-----------------------------+
2| linux kernel & 名前空間分離する機能を使用 |・・・ここまで1つ
+-------------------------------------------------------------+
1| hardware |
+-------------------------------------------------------------+


開発現場での仮想化技術へのニーズの変化


  • 開発現場が、コンテナを利用した開発に至るまで。

1)1台のPCで開発

 ↓<課題>
 ↓・毎回、開発環境の構築に手間がかかる。
 ↓・前の開発環境に簡単には戻せない。
 ↓・同じ環境のはずなのに、自分のPCではなぜか動かない。
 ↓
 ↓<対策>
 ↓・ハードウェア仮想化(virtualboxなど)で解決
 ↓
2)1台のPCで、ハードウェア仮想化を利用して開発
 ↓<課題>
 ↓・起動/停止が遅い。
 ↓
 ↓<対策>
 ↓・Linuxコンテナ、Dockerコンテナで解決
 ↓
3)1台のPCで開発、Linux/Dockerコンテナを利用して開発


実は、Dockerは*純粋*な仮想化ではない


  • virtualbox、LXC/LXDは、OSとしてはLinuxサーバ(ディストリビューション)そのものを使います。これを、ここでは*純粋*な仮想化と呼びます。(物理サーバで得た経験をそのまま活かせます)

  • 一方、DockerはLinuxの一般的な起動方法(systemd,init)を捨て、ログを管理する仕組みなどを変更しました。この点については、新たにDockerの流儀を学ぶ必要があります。

  • それでは、なぜ、Dockerは「今までのLinuxの一般的な方法をあえて変更」してしまったのでしょう?


なぜ、Dockerは*純粋*な仮想化を実現しなかったのか?


  • いきなり答えから書きます。



    • 「Dockerで分散システムを実現したかった」からです。



  • では、なぜ分散システムなのか?


運用現場での仮想化技術へのニーズの変化


  • 運用現場が、Dockerによる分散システムに至るまで。

1)1台のPCでサービス提供

 ↓<課題>
 ↓・負荷の増大に耐えられなくなった!
 ↓
 ↓<対策>
 ↓・複数サーバにして解決
 ↓
2)WEBサーバx5台、APサーバx5台、DBサーバでサービス提供
 ↓<課題>
 ↓・ピーク負荷の為に、365日ずっと合計5+5+1台を起動
 ↓ しておくのはもったいない!
 ↓
 ↓<対策>
 ↓・自動スケーリングにして解決
 ↓
3)WEBサーバx1~5台、APサーバx1~5台を自動スケーリング、DBサーバでサービス提供
 ↓<課題>
 ↓・もっと自由で効率的な方法はないのか?
 ↓
 ↓<対策>
 ↓・サーバ単位ではなく、アプリ単位で自動スケーリングできればもっと効率的では。
 ↓・小さなアプリ(サービス)で開発すれば工期も短縮できるし、変更も小さくて済むはず。など
 ↓
4)Dockerによる分散システムの実現へ=Kubernetes


Dockerによる負荷分散=Kubernetes

Dockerコンテナを使うことで、今までの負荷分散の仕組みと比べると、以下の特徴があるようだ。



  • 言語や環境の自由度が高い


    • Docerコンテナ内で、どんな言語を使ってもいいし、環境もコンテナに閉じているので自由に選べる。




  • 起動が早い


    • Dockerは、Linuxの一般的な起動方法(systemd,init)を捨て、直接アプリケーションを起動する仕組み(1コンテナ1アプリの原則)としたので、起動するまでのステップが大幅に短くなった。(その代わり、Dockerの流儀に従う必要がある)



今までの負荷分散システムと比べると Kubernetes は、後発ということもあって、より良いものになる可能性がある。

一方、分散ストレージ については、Kubernetes 自身はサポートしていないので、

パフォーマンスがでるような仕組みを別途考える、あるいは用意する必要がある。


マイクロサービスの時代へ


  • 「ハードウェア」という概念が、「クラウド」の登場で薄くなった。

  • 「サーバ」という概念が、「Docker」の登場で薄くなった。

  • 今は昔と比べて「アプリ」の比重がより重くなっている=マイクロサービスの時代へ


「Docker=開発環境を簡単に、早く作れていいよね」の先にあるもの


  • 以上の説明より、もしも単に開発環境を仮想化したいだけなら、LXC/LXDでもいいはず。

  • Dockerを使うなら、そこがゴールではなく、その先があることも知っておいたほうが良さそう。


とても参考になったもの

開発におけるDocker導入のメリット - Qiita

Dockerのメリットがコンパクトで分かりやすく参考になりました。

Docker(コンテナ型仮想化)と Kubernetes についての簡単な紹介 - ゆびてく

Kubernetesとは何なのか?が分かりやすく参考になりました。

レガシー分散システムからモダン分散システムへ - ブログなんだよもん

分散システムとは何なのか?Dockerとは?について参考になりました。

知らぬはエンジニアの恥。今さら聞けない【コンテナ/仮想化技術】11選 - paiza開発日誌

コンテナ、仮想化技術について参考になりました。


(2018/08/09追記)たくさん「いいね」を頂きました。ありがとうございます:hugging:


  • とても驚いています。この記事の最初に、次のように書いたので、まさかこんなに「いいね」をもらえるとは想像していませんでした。


最後になりましたが、私のDockerの経験は浅く、Kubernetesは使ったこともありません。なので、嘘を書いている可能性もあります。鵜呑みにしないでください。



  • そもそも、Docker便利なのは使ってすぐに分かったのですが、しばらくすると違和感がモヤモヤと湧いてきました。ネットで情報収集する中で、最近になってやっと、その答えを自分なりに1本につなげて書けたので「詳しくないエンジニアの話に需要あるのかな?」とも思いつつ、最近アウトプットしていないので、投稿したというのが本当のところです。

  • 実は「Kubernetes の先はどうなるのかな?」も、いくつか考えて(妄想して)いたのですが、さすがにそこまで書いてしまうと、話がぶれそうに感じたのと、まとめるのも難しそうでしたので、省いてしまいました。

  • ですが、この記事の「いいね」に背中を押されていると思って、近々(?)この続きを書いてみます。