hiro_5656's blog

機械学習やクラウド技術について勉強したことを発信していきます!

【入門/基礎】コンテナとは...?

まえがき

最近システムをサーバレスで作ることが増えてきて、その際にコンテナについて勉強したので共有したいと思います!

コンテナはとてもホットなトピックですし、Googleのサービスも基本的にコンテナ上で動いているということなので、今後はエンジニアとしてより必須知識になっていくでしょう!

参考書

www.amazon.co.jp

コンテナとは...?

ではコンテナについて説明をしていきます。

まず一般的に「コンテナ」というと、大型の貨物船に載っている貨物を詰め込んだ箱のことを想像される方が多いと思います。

今回扱う「コンテナ」も同様に、サーバ(大型の貨物船)上に、ソフトウェア・プログラムやデータ(貨物)を詰め込んだ箱を載せたものだと思ってください。

コンテナを扱う際にオープンプラットフォーム「Docker」というものを使いますが、このDockerのマークを見ると、鯨さんの上にいくつもの箱が載っていますね。

f:id:hiro_5656:20220123182425p:plain

こんな感じで1つのサーバ上にいくつものコンテナが配置され、動作させることが可能です。

ではどのようなソフトウェア・プログラム・データが1つのコンテナ(箱)に詰め込まれるのでしょうか。基本的には、「1つのコンテナにつき1つのアプリケーション」という考えのもとコンテナは作成されます。そのためアプリケーションを動かすために必要なソフトウェア・プログラム・データなどを1つのコンテナにまとめます。

 

コンテナ = 「アプリケーションの動作に必要なものを1つにまとめたもの」

コンテナの特徴

環境の隔離

前述の通り、コンテナはアプリケーションの動作に必要なものを1つにまとめたものです。

そしてこのコンテナはコンテナごとに隔離された環境を用意できます。そのためそれぞれ隔離された環境でアプリケーションを動作させることができます。

f:id:hiro_5656:20220123211340p:plain

環境が隔離されない場合、どういうことが起こりうるか考えます。

例えば異なるシステムで動作しているプログラムAとプログラムBが同じライブラリ(Ver.3)を使用している場合に、プログラムBの都合によりこのライブラリをVer.5にアップデートした場合に、環境の競合によってプログラムAでこのライブラリが使用できなくなることがあります。

f:id:hiro_5656:20220123211927p:plain

複数のシステムが同居しているとこのようなことが容易に起こりうるため大変不便です。なので実際の業務ではシステムごとにサーバを分けて、システムが同居しないようにしていますが、このようにするとどんどん使用するサーバが増えてしまい、コストや管理負担が増えてしまいます。

一方環境が隔離できる場合

f:id:hiro_5656:20220123213410p:plain

環境の競合が起こらず、同じサーバに複数のシステムが同居していても大丈夫なのです。

持ち運び可能

コンテナは持ち運びが可能です。

コンテナはコンテナイメージというものをもとにして作成されます。このコンテナイメージは他の人と共有ができ、Docker Engine などをインストールさえしていれば、誰でも起動することができるのです。

前述のように、コンテナはアプリケーションの動作に必要なものを1つに詰め込んだものなので、そのコンテナイメージさえ入手できれば、手元のPCでもそのアプリケーションを動作させることができるのです。

そのため、コンテナイメージさえあれば手元のPCをWebサーバ化させたり、DBサーバ化させたりもできます。

また、コンテナイメージはどこかのリポジトリに置いておいて、必要なときにそこから入手するのですが、多くのコンテナイメージが Docker Hub に置いてあります。

hub.docker.com

Docker Hub には公式のコンテナイメージなども置いてあり、

例えばApacheMySQLなどの公式が作成したコンテナイメージもあります。

また、公式のコンテナイメージだけでなく自分でカスタムしたコンテナイメージをDocker Hub を通じて世界中の人と共有できますし、他の人が作成したコンテナイメージを使用、または拡張したりもできます。

複数コンテナの同時起動

前述のようにコンテナを使うことで環境を隔離することができるので、複数のコンテナを1つのサーバに安全に同居・起動させることができます。例えば Wordpressを使用したい場合には ApacheMySQLが必要ですが、コンテナであればこれら2つのコンテナを同時に起動させることで、まるで2つのサーバが独立して稼働しているかのように扱えます。

つまり別々のコンテナを同時に起動させ、組み合わせることで1つのアプリケーションを構築することもできるのです。

Docker にはLinuxが必ず必要

コンテナを扱う際に必要なオープンプラットフォーム「Docker」には必ずLinux OSが必要です。WindowsMac OSでもDockerを使用することはできますが、どこかしらには必ずLinux OSが組み込まれています。

Docker の仕組み

「Docker」という単語が何度か出てきているのでこちらについても簡単に説明したいと思います。

「Docker」とは、コンテナを扱う際に必要なオープンプラットフォームのことです。

簡単にいうと、Linux OSにDocker EngineをインストールしていればDockerのコマンドを使うことでコンテナに対する処理が行えるようになるということです。

イメージで言うとこんな感じ。

f:id:hiro_5656:20220123231611p:plain

WindowsMac OSであったとしても内部的に必ずLinux OSを持つようにしてその上でDocker Engineは動いています。

コンテナ内部にディストリビューションが含まれる

コンテナの特徴としてもう1つ、コンテナ内部にディストリビューションを持つという特徴があります。

まずディストリビューションとは何かというと、OSにはハードウェアを操作するための「カーネル」と呼ばれる部分があります。

ただしソフトウェアはこの「カーネル」に直接指示を出すことはできず、「カーネル」がその指示を理解できるよう仲介してくれる「ディストリビューション」というものを通じて「カーネル」に指示を送ったり、「カーネル」からの処理結果を受け取ったりしています。

有名なディストリビューションには、Red HatCentOSUbuntuなどがあります。

f:id:hiro_5656:20220123233055p:plain

コンテナの場合、この「ディストリビューション」をコンテナ内に保持しています。そのため、複数のOSが競合したりせず(コンテナが幾つあろうがカーネルは1つのため)オーバーヘッドが少なく、起動も速いのです。

VMとの比較

コンテナと同じように複数の環境を作成できると言う点でVM(Virtual Machine)がありますが、こちらと比較してみましょう。

f:id:hiro_5656:20220124000151p:plain

VMはコンテナとは異なり、ハイパーバイザを介してハードウェアのリソースを複数のOS環境に分け、それぞれで仮想マシンが稼働しています。

VMの利点としては以下のようなメリットがあるようです。

  • 複数のOSでハードウェアリソースを共有
  • 物理で可能な機能はほぼ実現可能
  • OSを問わず仮想マシンを稼働可能
  • 物理と同様にIP管理が可能

VMでは Host OS リソースを使用しながら、 Guest OS の動作を演算し直して動作させているため、コンテナに比べ動作が遅いと言われています。またリソースに無駄が生じやすいとも言われています。

コンテナのメリット・デメリット

改めてコンテナのメリット・デメリットを抑えます。

メリット

  • アプリケーションやソフトウェアを環境ごと隔離できる
    • アプリケーション・ソフトウェアごとの管理がしやすい
    • 他への悪影響を考慮せずにアップデートでき、最新の状態に保てる
  • コンテナイメージ化して持ち運び・共有がしやすい
  • VMに比べ、起動・動作が速い
  • サーバ台数を削減できる
  • 開発環境と本番環境の環境の違いによる障害が起こらない
  • 個々にコンテナを開発することで、開発者同士で競合しない

デメリット

  • 1つのサーバに多数のコンテナを載せる場合、その物理マシン自体に障害が起こった際の影響が大きい

あとがき

いかがだったでしょうか。コンテナについて少しでもご理解いただけたでしょうか。

別の記事でDockerの使い方や、余裕があればKubernetesの使い方なども(Kubernetesは中々まとめるの難しそうですが (>_<))触れていきたいと思います!