VMとDockerの基礎 -コンテナって何なの??言葉と仕組みを理解する
Dockerとは
Dockerは、インフラ関係やDevOps界隈で注目されている技術の一つ.
Docker社が開発している,
コンテナ仮想化(仮想環境)を用いてアプリケーションを開発・配置・実行するための
オープンプラットフォーム。
会社では当たり前に使っているものだけど、
説明できるかっていったらできなかった!ので、簡単に、まとめました(^^)
■ 仮想化...?? "VM(virtual machine)"
仮想化とは。英語では、virtual machine(バーチャルマシン).
実態のないものであり、実在しているかのように作るもの。
1台のサーバーの上に、複数台のサーバーがあるように見える状態を作ること。
(コンピュータの中に、あたかも他のコンピュータがあるように
擬似的なコンピューターを再現したもの。とも言える。)
例えば...
- Macの中にcentOSサーバーを設置
- windowsの中にubuntuを設置
OS:
基本ソフトウェアのこと.応用ソフトウェアとハードウェアの間をつなぐ役割。
ex. ファイルの管理、メモリ管理、プロセス管理、 UI 、TCP/IPなどのネットワーク
※応用ソフトウェア=アプリケーション
仮想化じゃない時代はどうだったのか? --物理的な単一の環境
仮想化されていない時代は、
一つのPCに一つのOS,その上に一つのアプリケーションが一般的だった。
=> 一つのコンピューターシステム上で複数のアプリケーションを同時に実行するといった概念は、
仮想化技術が出現する以前には一般的ではなかった。
= コストもかかるし、リソースの再利用性もない。
なぜ仮想化技術が生まれたのか。
仮想化技術がなかった時代の問題点
■ リソースの有効活用 / ■ サーバーの運用・管理の容易化
■ ハードウェアのコスト削減 / etc...
これらを解決するために生まれた。
コンテナ化が可能になった。
※下で、詳しく書くが簡単にいうと。。。
コンテナ:
コンテナ型技術を使用して作成された実行環境で、仮想環境上で作られたアプリケーション。
コンテナ化:
アプリケーションを必要なすべてのライブラリ、設定ファイル、実行時環境と共に
パッケージ化することで、アプリケーションが異なる環境でも一貫して動作するようにする技術.
このVM技術では、コンテナ化まではできるけど、
そのコンテナ化されたもの一つ一つにOSを設置しないといけなかった。
=> 同じOSを使用するものでも再設置しなければいけない
=容量多い!!! 多く作れるものも作れない。
=> 1つ1つの要領もOSに取られて少なくなる
これらの問題を解決するために生まれたのが、dockerコンテナ。
では、このコンテナについてもう少し深める。
コンテナ型とコンテナとは...?
[英語直訳] container:
コンテナとは、入れ物、箱、容器などの意味
上記で簡単に仮想化について記述したが、
コンテナとは、アプリの動作環境を仮想的に構築する技術の1つ。
VMにもいろいろな種類があり、今回のdockerは、
ホストOSを動かしているカーネルを利用して、
あたかもゲストOSがあるように仮想環境を作り上げる"コンテナ型" のものだ。
そして、そのdockerの上に上がっている部分をコンテナと呼ぶ。
ホストOSのカーネルを利用して操作するので、
ゲストOSがなくてすみ、これにより軽量かつ高速に仮想環境を起動停止が可能で、
これは、dockerを使う利点の一つだ。
補足:カーネル(kernel)とは
カーネル(kernel)とは:
オペレーティングシステム(OS)の基本機能の役割を担うソフトウェア
OSの中核部分として頑張っているソフトウェア!!!!
ハードディスクやメモリなど、コンピュータの資源管理を行なうもの。
もう少し詳しく言うと、
- アプリケーションの実行を許可し、プロセス管理
- 安全なメモリへのアクセス管理
- コンピュータに接続された周辺機器のデバイス管理
Dockerイメージって何??
dockerについて調べてると必ず出てくる言葉、"Dockerイメージ"。
Dockerコンテナの実行に必要なファイルシステム、アプリケーションコード、ライブラリ、
環境変数などを含んだ静的なイメージ。
簡単にいうと、
"コンテナを作成するための指示が記載された読み取り専用のテンプレート"のことをいう。
稼働中のコンテナの中身を記録したブループリントやスナップショットのようなもので、
Dockerイメージは、Docker プラットフォーム上で稼働するコンテナを作成するために必要なもの。
このDockerイメージは、Dockerfileを使用して作成される。
Dockerfile
Dockerファイルは、Dockerイメージをビルドするためのテキストファイル(ビルドスクリプト)。
Dockerfileには、コンテナイメージを構築するためにDockerエンジンに与えられる一連の手順が
記述されている。
※補足: Infrastracture as code(IaC)
インフラの構築管理運用をコード化することをInfrastracture as codeという。
Dockerファイルは、Dockerコンテナのビルドと再現性を保証するために非常に重要!
dockerが使えることのメリット
■ 環境の再現性:
アプリケーションやサービスを実行する環境をコンテナとしてパッケージ化できるため、
開発環境や本番環境を含む,異なる環境間で一貫した動作を保証しやすくなる。
簡単にいうと...
どの環境上でも全く同じ環境を作ることができる!!
ホストOSが何であろうと、好きなOSで環境を作成できるのが仮想環境のいいところ!!
dockerを使用して、環境構築し、それをshareすることによって、可能になる!
■ 軽量かつ高速:
Dockerコンテナは仮想マシンと比べて非常に軽量。
コンテナ型という話を上記でしたが、
Dockerコンテナは、ホストOSのカーネルを使用しているため、
軽量で高速に仮想環境を起動停止できる!
OSを共有し、必要な部分だけを追加してコンテナを構築するため、起動や停止が素早く行えます。
■ 再利用、バージョン管理、配布が容易
OSの指定やミドルウェアのインストール、環境設定がコード化されている。
再利用、バージョン管理、配布が容易!!
※Infrastracture as code
インフラの構築管理運用をコード化することをInfrastracture as codeという。
dockerで仮想環境を構築するためには、dockerファイルが必要だが、
中身はコードで書かれている。よってそこを見ればどのように環境設定しているのかもわかりやすい。
また、コマンドを実行するだけでみんなと同じ環境でにできることもメリット。
Discussion
そんなことはないですよ。現にお手元のパソコンではブラウザー(例えばChrome)とかエディター(例えばVS Code)とかたくさんのアプリケーションが動いていますよね?
一つのコンピューターで複数のアプリケーションを動かすのは、OSがマルチタスク(複数のプロセスを同時に動かすこと)をサポートした頃から特に珍しいことではありません(性能の都合で事実上アプリケーションは一つしか動かせないって時もあったでしょうけども)。
仮想化しない場合に何が問題だったのかというと、一つのOSで複数のアプリケーションを動かした場合、ファイルシステムなどのOSが提供する、共有して使えるものを巡って競合してしまうことがある、などの点です。
一つのOSに一つのアプリケーションだと思ってしまったのは、Dockerが推奨する、「一つのコンテナーに一つのアプリケーション」という習慣と混同してしまったのではないでしょうか?
コメント嬉しいですありがとうございます!
確かに少し混ざっていたかもしれないです...!
その辺もう少し詳細を勉強して、修正します!!