docker
lxc
kubernetes
マイクロサービス
新人プログラマ応援

(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 の先はどうなるのかな?」も、いくつか考えて(妄想して)いたのですが、さすがにそこまで書いてしまうと、話がぶれそうに感じたのと、まとめるのも難しそうでしたので、省いてしまいました。
  • ですが、この記事の「いいね」に背中を押されていると思って、近々(?)この続きを書いてみます。