コンテナとは?初心者でもわかる!超入門コンテナの基礎!


「コンテナを使って提案してほしいのですが、できますか?」

というようなご相談が弊社にも最近増えつつあります。コンテナという単語は市場的にも広まっていて皆様の関心が高いことがわかります。今後IT関連でお話をしていくにはコンテナというキーワードは重要なものになることは間違いないです。

しかし、従来型のアプリケーションに慣れている方がコンテナ技術を理解するにはそれなりの時間がかかるでしょう。

この記事ではコンテナについて知りたいけど、どこから始めたら良いのかわからないという方々に対して、基本的な内容をわかりやすく説明してコンテナに関する理解を深めていただき、明日からのお仕事にも生かしていただけることを目標にしました。

コンテナとは何か?

コンテナが世界の物流に革命的な変化をもたらしたことは有名です。コンテナの中に品物を入れてしまえば、そのまま積み替えることなく、トラックで陸送、船で海を、飛行機で空を簡単に運ぶことができます。

それによって、例えば中国の工場から日本の消費者に品物を届けるコストが国内の工場から届けるコストより安くなったのです。この革命によってAmazonは今の地位を築くことになったのです。

これは物流の世界のコンテナの話ですが、実はIT業界におけるコンテナも同じように革命を起こしたことは事実なのです。

まず前提として断っておきますが、この記事で「コンテナ」と呼ぶのは事実上コンテナ化ソフトウェアのデファクトスタンダードであるDockerコンテナのことを指します。

それでは、コンテナとはどんなものなのでしょうか?

そもそも、コンテナという言葉は「何かを内部に含むもの」という意味で、前述のコンテナと同様に中に何かを乗せて動くものです。

では一体、Dockerコンテナは何を載せているのでしょうか。次の図を見てください。

コンテナのイメージ図
コンテナのイメージ図2

最初の図のようにコンテナ内部にはアプリケーション・プログラムとそれが動くために必要なミドルウェア、OSの一部(ライブラリー、設定、ファイルシステム等)がパッケージ化されています。同じように別のアプリケーションを稼働させるためのコンテナBや、また別のコンテナC等が同じ船の上に乗って動いています。

2つ目の図にあるように、船にはサーバー・ハードウェアの上に OSとコンテナを動かすためのDockerエンジンがあります。

 ここまで、説明すると「共通のOSの上で個別のアプリケーションを動かすというならVMWareの仮想化と同じじゃないのですか?」という疑問を当然持たれると思います。

しかし、コンテナ環境はVMWare等の仮想マシンの環境とは根本的に違います。

次の図は従来型の単純なプログラム、仮想マシン環境、コンテナ環境の構成の違いを現したものです。

コンテナのイメージ図3

コンテナの利点

まずコンテナの最も大きな利点は、「コンテナを一度作ってしまえばそれを何も変更しないで違う環境に載せ替えて実行することができる」ということです。

これによって、従来型のようにアプリケーションを動かすために必要なハードやOSやミドルウェアを苦労して個別に用意する必要はなくなります。Dockerエンジンさえ動いていれば、どの環境でもすぐに動かせるわけです。

また、VMWareのような仮想マシンと比べてもコンテナの実行は効率的となっています。

仮想マシンはOSレベルから個別に構築されるため、どうしてもメモリ、CPU、ディスクなどのサーバーのリソースを多く消費します。そのために、安定してパフォーマンスを出すためにはコンテナ環境よりも遥かに高価なリソースが必要です。

また、仮想マシンのイメージは一般的に大きくなってしまうので、異なる環境にコピーするのも時間がかかります。その点、コンテナイメージは軽い場合が多いので簡単にコピーや移行、バックアップが可能です。

これによってコンテナの実行を管理するための仕組みも簡単に構築できますが、これに関しては後で詳しく解説します。

コンテナの実行

それでは、コンテナを実際に動かすにはどうしたら良いのでしょうか。

今まで述べたようにコンテナを動かすためには、Dockerエンジンさえ稼働していれば大丈夫です。

DockerエンジンはLinuxのようなサーバーOSだけではなく、WindowsやMac等のユーザーの環境でも動かすことができます。今回はMac環境にDockerエンジンをインストールして、その環境で簡単なコンテナを動かしてみることにしますが、WindowsでもLinuxでも行うことは同じです。

今回は簡単なWebサーバーを立ち上げて、初期画面を表示させてみましょう。

まずは、Dockerエンジンをインストールします。インストールはアプリケーションをダウンロードするだけなので簡単です。

インストールが終わったらDockerを実行します。右側にshellの画面が現れるので、これからのステップはここで実行します。

今回選択するのはapacheなので、スタンダードなイメージとしてhttpdを使用します。使用するポートは80を使用、このコンテナを実行するコマンドは非常に簡単です。

docker run -p 80:80 -d httpd

コマンドを実行すると、httpdという名前のコンテナイメージをDocker Hubからダウンロードしてきて実行してくれます。終了するとDockerの画面に実行中のコンテナの情報が表示されます。

稼働の確認のためには自分のPCのIPアドレスにブラウザからアクセスしてみます。
Apacheのwelcome画面である「It works」表示されれば、成功です。

Dockerの画面からは実行中のコンテナの操作も可能です。

今回は最も簡単な方法で実行しましたが、実行時のオプションはたくさんありますし、dockerfileという設定ファイルを作成すればもっと詳細な設定やイメージの内部の変更を行った上で実行することもできます。

一度試してみた上で、関連する情報を見つけて色々やってみるのがオススメです。

コンテナの実行の考慮点

前述のようにコンテナを実行することは非常に容易です。ただ実行にあたっては、考慮すべきことがいくつかあります。

下で詳しく見ていきましょう。

停止すると全てのデータは消えてしまう

コンテナが他の環境と完全に独立して動くために、全ての使用リソースはコンテナ内部で完結するようになっています。そのため、稼働中に内部のファイルに書き込んだデータはコンテナが停止するとなくなってしまいます。

同じコンテナを再実行してもデータは初期化されるので引き継がれることはありません。そのため、再実行時に前回の内容を引き継ぎたい、あるいは、データを他のアプリケーションで使用したいという場合にはそのための設定が必要になります。

方法としては色々考えられますが、一番簡単なのはコンテナ内部で使用するディレクトリをホスト側のディレクトリにマッピングして共有する方法です。

これは実行時にマッピングするパラメータを指定するか、dockerfileの設定上で指定することもできます。

ただ、この共有によってセキュリティ的なリスクが増える可能性は大きいので注意が必要です。

コンテナ内部のセキュリティ対策

アプリケーションを稼働させるということは当然ですが、セキュリティ的なリスクが生じてきます。

特にWebサーバーをインターネット上で稼働させるような場合には、単体のサーバーで行うのと同様な対策が必要です。

基本的な対策は、以下の通りです。

  • セキュリティ面を十分に考慮した上で、作成されたコンテナイメージを使用すること
  • 使用数が少ないイメージは使用しないこと
  • 実行するアプリケーションの脆弱性に関して常に環境をアップデートすること

当然、ホスト側で十分な対策を行うことも必要です。

リソースの消費とパフォーマンス

色々なコンテナのイメージを動かしてみるとわかりますが、コンテナの作りによってはホストのリソースの使い方に大きな差がありますし、パフォーマンスにも差が出てきます。

例えばWebサーバーとしてApacheを使用しているものより、NGINXを使用しているものの方が一般的にスピードは速くなりますが、NGINX独特の設定方法に慣れていないと十分に能力を発揮できないということもあります。

またコンテナが使用するOSとしては、一般的なCentOS等よりは軽量に作られたAlpine LinuxやCoreOSの方が速いと言われています。ただ、これらも必要なコマンドが組み込まれていないなどの考慮点もあります。

コンテナの将来

ここまで、コンテナの入門記事として、概念から利点、実行方法までを解説してきましたが、最後にコンテナの世界の将来について簡単に紹介しておきます。

コンテナはその利便性や変化への対応の容易さから、すでにIT業界ではスタンダードになりつつあります。そのような状況において、これから充実されて行くと思われるのはコンテナ実行環境の管理系の機能です。

最も有名なものとしては、Kubernetes(k8sと略されます)があります。

Kubernetesは、コンテナの実行環境の効率的な管理と自動化を実現するオープンソースのソフトウェアです。

多くのコンテナを実行していると必要なサーバーの構築や運用に多くのワークが割かれることになりますが、これらのワークを管理し、自動化するのがKubernetesの役割です。

実際の環境では、事実上このような機能がなければコンテナ実行環境の管理は不可能であると言っても良いでしょう。AWSやAzureではクラウドのマネージドサービスとして提供されていますし、RedHatのOpenShiftのようにより多くの機能を持つものもあります。

終わりに

ここまで述べてきたように、実はコンテナを理解するのは難しくはありませんし、事例をお見せしたように簡単な方法で実験的に動かしてみることもできます。

こちらでコンテナに関心を持って導入してみたいと思われた方、詳細を確認したいことございましたら、ぜひスカイアーチネットワークスへご相談ください。

コンテナサービスを利用した構築実績もございますので、ご要望に合わせて設計からご支援させていただきます。

おそらくこれからのIT環境において、コンテナは必須のものであり、それを前提にして進化してゆくことは確実です。それは、コンテナの仕組みが、簡単に変化に対応するスピードを持っているからであり、その変化が従来環境や他の実行環境に全く影響しない強固な環境だからです。

その意味では今回この記事で学んでいただいた内容は、明日からすぐにお役に立つでしょう。