【俺の頭もしかして猿なん?】コンテナ技術がわからなすぎて困ってる人向けの超ざっくりな説明

コラム

で、コンテナって何?

「最近、コンテナ技術を取り入れようかと考えています」

「そうか、コンテナ、、いいよね、いいんじゃない?」

よくわからずに頷いている方もいるのではないでしょうか

いざ調べてみて、いろいろな説明があるものの、まあ難しい

俺の頭は猿になってしまったのか?猿でもわかるように説明してくれないか?

そう言いたくなるほど、専門的でややこしい話がたくさん出てきます

というのも、比較的新しい概念、単語、OSSが出てくるため、どの説明を見てもイマイチ前提知識が揃わない、ちゃんとわかろうとしている人しか調べないから、ちゃんとした説明はあるけどざっくりした説明がない

そういう状況だと思います

Immutable Infrastructure?
冪(べき)等性?ポータブルなアプリケーション?可搬性?
Kubernetes? Docker? Amazon ECS?

なんだこれは、、日本語で話してくれないか、、

という方向けに、自分なりに雑に理解した内容をお話します

まずは、何が嬉しいのかを知ろう

コンテナ技術が”どういう仕組か”、を知る前に、「なんだこれは、、」というレベルの方は

”なにがそんなに嬉しいのか”を知ったほうがいいです

そうすると、おお!いいね!もっと知りたい!となるので、まずはそこから始めましょう

そのうえで、やはりImmutable Infrastructureと冪(べき)等性は知っておくべき共通認識として避けて通れないので、

思い切って身近な例えで(多少間違っていたとしても)そのメリットを理解をしていきます

コンテナがもたらすメリットは、維持管理に関する仕事からの開放

維持管理に関する仕事からの解放、まだイマイチピンとこないでしょう

身近な例で例えます

スマホを買ったとしましょう

iPhoneXを買いました

iPhoneXには最新のOS、アプリが搭載されていますね

しかし、これから年月が経つと、OSバージョンアップのサポートは切れて最新のOSのインストールは不可、アプリも対応していません、なんて表示が出ます

そうするとiPhoneを買い換える必要が出てきます、そのころはiPhone13でしょうか

Immutable Infrastructureの概念においては、”iPhoneの買い替え”をしません

”iPhoneは毎回使い捨てる”のです


”iPhone本体を持つ”という”状態をサブスクリプション契約した”ようなイメージです

今日使ったiPhoneは明日使わない

今日持っているアプリとか、保存した写真とか、全部クラウドに持たせてあるし、どこにどのアプリを配置するとかもAppleIDに覚えてもらってる

だから、明日全く違うiPhoneが手元にあっても全く問題ない

完全に昨日の状態が再現されるから


そういう状況をイメージしてください

そうすると、気づけばOSは日に日に最新化をし、本体も知らぬ間に新しい機種iPhone11になっています

時々、OSのアップデートに追従しないアプリ等が出てくるかもしれませんが、

一気に全部が使えない、なんてことにはなりません

明日全く違うiPhoneが手元にあっても全く問題ない、完全に昨日の状態が再現されるから


という状態がまさに

冪等性です


実際のところはその実現に必要なAnsible, Chefなどの動作・原理について理解が必要そうですが、今回はコンテナに集中したいので無視します

「この冪等性の高さ、満足度高いな」

ちなみに、先日妻がスマホ(Android)をなくして、新しく買い替えたのですが、Googleアカウントを入力するだけで過去に使っていたアプリが勝手にインストールされ、ほとんど前と同じ状態が再現できたことに感動していました

このときに妻がもし「この冪等性の高さ、満足度高いな」などとつぶやいたなら、なんと理解の深い、、、と頭が下がる思いだったことでしょう

インフラ、アプリ、現場のみんなが幸せになる技術

システム開発の現場でも、ハードウェアを買い換える、サーバのOSをバージョンアップする、ということは、アプリケーションサイドとしては考慮すべき事項が多く、開発スケジュールに与える影響は甚大です

アプリケーションからすれば、少しでも環境が変わると、動作を保証できないからです

動作を保証するためには、あらゆるテストケースを洗い出し、やり切る必要があります

インフラサイドもアプリサイドも、そういったことをしょっちゅうやりたくないので、数年に一度、OSサポート切れるから、しかもセキュリティ案件だからマスト・なるはやで、などの理屈で無茶振りを受け、しぶしぶ、大規模な改修を対応することになるのが常です

そういった、オリンピック的なインフラ整備、iPhoneの数年に一度の買い替え、をするのではなく

常日頃から、古い環境を捨てさり、新しい環境に身を置き、動作を保証し続ける


それがImmutable Infrastructureの概念であり、

そうすることで大規模な改修を避け、OSのバージョンアップや物理的買い替えの影響を最小化し、継続的で安定的な開発環境を提供する、そういうメリットがある、そういう世界を目指したい、そういう概念だと思ってください

Immutableなんとかはわかった、さあコンテナは?

さて、本題のコンテナです

コンテナは、そんな素敵な概念であるImmutable Infrastructureを実現するうえでなくてはならない存在です

なぜか

コンテナ=アプリケーションと、その動作環境を含む単位


だからです

基本的に、コンテナの中でアプリケーションの動作確認まで完了できます

そのコンテナ稼働に互換性のあるOS上で動かす分には基本的に問題がない状態になってます

アプリケーションを作って、いざ本番環境で動かしたけど、微妙にOS、ミドルウェアのバージョン差異があって動かない、、

という事態を避けることができます

ここまで来ると、あ、たしかにコンテナっていう単位は確かに便利だと思いませんか?

環境が知らないうちに新しくなっていっても動作を保証し続ける、そういう環境を整備するうえでは必要な技術だ

そういうイメージが湧いてきたのではないでしょうか?

また、もう一つ大きな特徴として、

コンテナを使うと、一つのOS上で複数のアプリケーションを稼働できる


という点があります

これまで、一つのサーバ上に一つのOS、そのうえに一つのアプリケーション、というのが当たり前でした

それは、アプリケーションによって必要になるライブラリ、ミドルウェアが違う、リソースを競合したくない、いろいろな理由から分けたほうが安全だったからです

コンテナはアプリケーションの動作環境までを含むため、一つのOS上で、複数稼働させることができます

それにより、別々にOSを用意する手間は省け、リソースは効率的に共有できます

また、一つのOS上で複数のコンテナが稼働できる、ということは

メンテナンスすべきサーバ・OSを最小化できるということです


言ってみれば、家庭のパソコンの中にあるユーザプロファイルのような感覚でしょうか

お父さん用の環境、お母さん用の環境、子ども用の環境が一つのパソコンにある

一つのパソコンというリソースを有効に共有できている

しかもそれらの環境情報はすべて別個に管理されていて、お互いに干渉しない

便利ですよね

もう一つのコンテナの大きなメリットが”可搬性”です

例えば、お父さんは自分の環境を会社に持っていって、全く同じように動作させることができたら便利ですよね

家に帰ったら、今度は自宅のパソコンで自分の環境を使うことができる

それがたとえ違うパソコンだったとしても

なんだか、Gmailのようなクラウドサービスと似た利点を感じますね

パソコンでアクセスしても、スマホでアクセスしても常に同じ状態で動いてくれる

コンテナの場合、クラウドと違って、実体(コピー)が移動しますが、結局はコンテナをクラウドにアップして運ぶとすれば似たようなものです

どこでも同じように環境を取り扱える、簡単に持ち運びできる便利さを可搬性といいます


これも、コンテナの大きなメリットの一つです

実際、アプリケーションと動作環境をセットで送ったり受け取ったりできたら、開発者同士、とても連携しやすいですよね

誰のPCで動かしても、全く同じなのですから

実際、そういう時にコンテナを動作させるのに使うのがDockerです

Docker=コンテナを動かすアプリケーションだと思えばいいでしょう

一つのサーバ上に一つのOS、そのうえに一つのアプリケーション、という考えは終わった

かつては、アプリケーションを作ったら、その事業の成長に合わせてアプリケーションも肥大化し、

それに合わせてインフラも肥大化するような状況でした

しかし、変化の激しい時代、同じような機能は長続きせず、細かなニーズに合わせたアプリケーションを作っては消し、小さな単位で改修し続ける、そういうことが求められるようになってきました

アプリケーションは小さく維持したい、大きくしたくない

早くテストしたい、インフラの準備を待っていられない

開発プロセスは、そういう環境に最適化しつつあります

その流れの裏にある概念がImmutable Infrastructureであり、その実現に必要な性質が冪等性であり、その実現に寄与する技術としてコンテナがあり、コンテナの大きな特徴として可搬性がある

コンテナの実行環境がDockerで、コンテナを管理するためのプラットフォームがKubernetesだ


ここで説明を聞いているような人は、DockerやKubenetesそれぞれが実際どういう使い勝手のものか、そこまで知る必要はないと思います

ここまで読んで、それぞれの単語についてこの感覚でいれば十分だと思っています

専門家からするとツッコミどころが満載だと思いますが、あくまで私も含め猿にもできる理解ということで参考にしていただけたら幸いです

最後に

「Kubernetesはクラウド界のLinuxになる」


そう言われています

少なくともそれぞれの立場から、Linuxが何であるかに対する理解と同様の理解は必要そうだ、という認識がちょうど良いと思います

もしも自分がLinuxと同じくらいのレベルでKubernetesを理解していないな、と思ったら、もう少し必要なレベルまで勉強してみるといいでしょう