Kotaro7750's diary

低レイヤを中心とした技術ブログ、たまに日記

コンテナについて学習したことのアウトプット

前書き

記事にはしていませんが、最近何回かイベントに参加して色々な企業のインターンについて聞いているのですが、そのなかで、インフラエンジニアという職種に興味がわきました。この職種にも色々あるらしいですが、エンジニアが開発に専念できるような基盤づくりを主な業務とするエンジニアの方に会っていいなと思ったので、彼らがよく扱っている技術について調べ、少しづつですが学習し始めました。 その中で、最近の開発のトレンド(だと感じた)コンテナ技術をまず学ぶことにしたのでアウトプットしていこうと思います。

注意書き

あくまでも学習中の人間が理解を深めるために書いた記事であるので、(いないとは思いますが)あまり鵜呑みにしないようにしてください。 また、間違っているところもある可能性があるので、もし間違っていたら優しく指摘してくれるとありがたいです。

仮想化技術について

コンテナ技術(主にDocker)について書く前に、まずは仮想化についてさらっと整理をします。

仮想化とは

愚直にサーバーを立てようとすると、サーバールームにラックサーバーを設置して、サーバーOSをインストール、その後に必要なアプリケーションを配置、という形になると思います。しかしこの方法だと、例えば規模を大きくするためにサーバを増設したいという時・他のアプリケーションを増やしたいと言う際に小回りが効きません。これを解決するために、仮想化という技術が生まれました。 この技術は物理サーバのホストOS上で仮想化ソフトウェアを動かし、その上で複数の仮想サーバを立てるというものです。この方式はホストOS型と呼ばれ、Virtual Box、VMWareなどがあります。 また、似たような方式にハイパーバイザという方式があります。これは仮想化ソフトウェアをホストOS上ではなく、直接ハードウェア上で動かすものです。例えばLinuxKVMなどがあります。 これらは物理サーバが一台あれば仮想サーバを複数動かせるという便利な技術ですが、いくつか欠点があり、代表的なものにマシンリソースを過剰に使いすぎるということがあります。一つの仮想サーバにつき1OSを用意するため仮想マシンのオーバーヘッドが生じ、性能が出しづらいです。 このように一長一短ある仮想化ですが、いいとこ取りをしたような方式がコンテナ方式になります。

コンテナ方式の概要

従来の仮想化と決定的に異なるのは、OSを共有しつつ、アプリケーションの実行環境を隔離するという点にあります。 従来の方式だと、仮想化ソフトウェア上に仮想サーバを立て、それぞれで個別にOSを動かしていました。一方コンテナはホストのカーネルを隔離しているため、仮想サーバ上で完全なOSを動かす必要がないのです。この事により軽量かつ隔離された実行環境が担保されます。 欠点としては、ホストOSとは異なるベースのコンテナを動かすことができないという点です。(だいたいLinuxベースだから大丈夫なのでは?)

コンテナを支える技術

LinuxベースOSの機能である、cgroups,namespaceなどを使ってコンテナを形成しているらしいですが、これだけでも何本も記事がかけそう&全然学習してないので紹介だけしました。ここらへん扱ってる本とかあったら読んでみたい...

Dockerについて

Dockerはコンテナ型仮想化技術の事実上の標準です。コードベースの設定ファイルを書いてコンテナを作成するので、様々な環境でも迅速に展開が可能という特徴があります。

イメージとコンテナについて

Dockerの基礎概念にイメージとコンテナというものがあります。まずイメージですが、これはどのような仮想環境を作成するかという型のようなものです。Apacheの実行環境イメージだったり、MySQLデータベース実行環境だったりと様々なイメージがDockerHubで配布されているほか、既存のイメージに追加し自分でDockerfileという設定ファイルを書くことで要件にあったイメージをビルドすることができます。 それに対してコンテナはイメージから作成される実体のようなものです。一つのイメージから複数のコンテナを同時に作成することができ、これらはお互いに隔離されているため、明示的に通信をしない限り干渉することはありません。 イメージとコンテナはコマンド一発で作成・実行できますが、ここで書いてもn番煎じな気もするので個々のコマンドについては書きません(面倒なのもあります)

コンテナの状態(state)について

イメージから作成したコンテナは停止中、実行中、破棄という3つの状態を持ちます。一つのコンテナは専用のデータ領域を持ちますが、停止中においては実行中のときのデータは保持されているため、再実行しても前回停止したときの状態を引き継ぎます。 このように、コンテナを終了したつもりでもディスク上に停止中のコンテナの状態は確保されているため、圧迫を防ぐにはコンテナを破棄します。 破棄すると、コンテナは失われデータを復元することは(多分)できません。

参考にした本について

この本で学習してます。とりあえず早めに読み終えて趣味程度に使いながら身につけていきたいです。

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門

長くなったので、ここらで終わりにしますが、次はコンテナ同士を組み合わせるdocker composeや自動スケールなどのためのコンテナオーケストレーションについてまとめようと思います。