プログラミングやITの経験がある・興味があるという人は、「今DockerやKubernetesを利用したコンテナ技術を理解、使えないと生き残れない」と言われてることを一度は耳にしたことがあると思います。ちなみに私は知りませんでした。

しかしこのコンテナ技術のスキルを身につけるのは簡単ではなさそうです。少し調べるとDockerやKubernetesの入門記事が山のように出てくることからもわかります。

これだけたくさんの入門記事が存在する中で、なぜ同じような記事を書いているのかというと、私のようにそれでも入門できないレベルの初心者がいると確信しているからです。
ということで本記事ではDocker/Kubernetesの入門書・入門記事を読んでも入門できなかった私が何とかつかんだDockerやKubernetesを始めとしたコンテナ技術のイメージを共有します。
そもそも初心者にコンテナ技術は難しい
本題に入る前にようやくDocker/Kubernetesを入門できた(はず)の私が感じたこととして、プログラミング経験少しありますという初心者にとってコンテナ技術は敷居が高いと思いました。
プログラミング経験が少しありますという人の「経験」というのはJavaやJavascript、Pythonなどアプリケーションを作るためのプログラミング言語を触ったという人がほとんどだと思います。
私を含めそのような人たちがDockerやKubernetesに取り組んでみると、次のように慣れない点がたくさんあるのです。
- 今まで環境構築は誰かがやってくれたor手順通りやっていたため、環境を扱うコンテナ技術は馴染みが薄い
- Dockerを使ってわかりやすいアプリケーションを作れるわけではないので動かしても実感がわかない
- 自分のPCで完結するレベルの作品しか作ってないのでコンテナのメリットを実感できない
このように初心者にとってコンテナ技術に慣れない要因がたくさんあるので、勉強をする前にDockerを今理解できなくても恥ずかしいことではないと思います。
コンテナ技術とは
それでは本題のコンテナ技術について説明していきます。
そもそもコンテナとは物流産業において発明された技術です。コンテナが革新的だったのは船に積まれたコンテナを海からそのまま引き上げて輸送できるため海陸一貫輸送を可能とした点です。

IT産業におけるコンテナも基本的には同じ考え方です。最大のウリは海や陸といった環境の違いよらないで中身を届けることができるという点です。
コンテナの中に入っているのはアプリケーションを実行するために必要なライブラリや設定など全部です。そのためどんな環境(コンピューター)でもコンテナを起動させればアプリケーションを同じように動作させることができる点が注目されています。。
なぜコンテナ技術が流行っているのか
ではなぜコンテナ技術がこんなに流行っているかというと、メリットがそれだけ大きいからです。ここでは我々初心者が理解できそうなメリットだけを取り上げて説明します。
どんなアプリケーションでもあらゆる環境で動作・展開・移動が可能
これは先程説明したメリットです。あまり実感が湧かもしれませんが、環境が異なると必要なライブラリがインストールされていなかったり、バージョンが違ったりということがよく起きます。

例えば少し大きなアプリケーションやシステムを構築する場合、開発を行う人の環境とプログラムをテストする人の環境(ハードウェア、OS、ミドルウェアなど)が同じとは限りません。そのため環境の差によるエラーが出るということが多かったようです。
コンテナはアプリケーションの実行環境をそのまま格納するので、開発者以外の人でも開発者と同じ動作を確認することができます。
アプリ開発者が予め環境を構築するため、使用者の環境構築の手間や時間を短縮
次にコンテナが登場したことによって、アプリケーションの開発者自身が実行環境を揃えてコンテナ化するようになりました。
これによってアプリの使用者はコンテナを起動させるだけでアプリを利用できるため余計な環境構築の手間をなくすことができます。
昔は環境構築というと大量の手順書があって人の手で作業を行っていたため、コンテナ技術によってヒューマンエラーもなくすことができます。

軽量・高速
最後は軽量で高速に動作するという点です。よく入門記事には下のようなハイパーバイザー型など他の仮想化技術との比較図が説明されていますが、初心者にとってはよくわからないでしょう。とりあえず軽くて速いんだと知っていればいいと思います。

Dockerとは
ここまでコンテナ技術の話をしてDockerやKubernetesの話は全く出てきませんでしたが、それはこれらが具体例だからです。

Dockerとはコンテナを稼働させるためのソフトウェア(エンジン)の1つです。ただしDockerは次の2点が揃っていたため今ではデファクトスタンダード(コンテナエンジンといえばDocker)となっています。
- Dcokerfileというコンテナの定義ファイルによるコンテナ管理
- コンテナ(イメージ)の運搬・共有を行うシステムの整備
DockerにはDockerHubというコンテナイメージと呼ばれるコンテナの元の保管、共有を行う場が整備されているため、DockerHubからコンテナイメージを転送、取得さえすれば環境を気にせずにアプリケーションを稼働させることができます。
Dockerの課題(なぜkubernetesが必要か)
このようにいいことが満載のコンテナですが、課題もありました。それは便利なコンテナでも数が増えすぎると何がなんだかわからなくなってしまうということです。

コンテナは1台のコンピュータ上で稼働させる場合は手軽に導入できる反面、複数のコンピュータで分散して稼働させる場合は、例えば下のようなことを気にしないといけなくなるためDockerだけでは心もとないのです。
- コンテナの起動停止
- ネットワークやストレージの管理
- コンテナをどのマシンで稼働させるか(スケジューリング)
そこで複数のコンテナを統合管理するツール(オーケストレーションツール)としてKubernetesが使われています。Kubernetesもオーケストレーションツールの1つですが今ではデファクトスタンダードとなっています。

Kubernetesの機能については本記事では触れません。なぜならKubernetesは普通のエンジニアからしても難しい技術と言われているからです。難しい専門用語がたくさん出てきて説明されていますが、個々のコンテナを協調させて動作させるために必要な機能が揃っているという理解で今は十分だと思います。
一つだけ特徴を説明すると、コンテナの振る舞い(システムのあるべき姿)をDockerと同じように定義ファイルに設定することで、障害が発生しても人間が手を加えることなく自動的にあるべき姿に収束させることができるという点が大きな特徴です。

DockerやKubernetesはどんな使われ方をするのか
ではDockerとKubernetesのイメージをつかめたところで、コンテナをたくさん動作させることでどんな使い道があるのかというと一つの例にマイクロサービスという概念があります。
全体として1つのシステムを構築するのではなく、システムをサービス単位で分割してそれぞれのサービスが独立して実行可能な状態で稼働しており、各サービスを協調させて大きなシステムを構築するという考え方です。
マイクロサービスの詳しい話は別の記事にまとめる予定です。
コメント