Dockerとコンテナ技術 その1:そもそもコンテナとは?

今月(といっても一週間くらい経ってますが。。)のテーマはDockerです。
業務で普通に使うDockerですが、実はコンテナという仮想化技術を利用し手軽にサーバーを構築できるツールというくらいの知識しかない状態だったのでしっかりとした知識として身につけていきたいと思いました。
ということで、Dockerの基礎から学んだことを備忘録として記事にまとめていきます。

初回である今回はコンテナとはそもそも何なのかという超基礎的なことをテーマにまとめていきたいと思います。

コンテナとは

コンテナの概要

コンテナは、アプリケーションを実行するための軽量な仮想化技術です。
従来の仮想マシン(VM)技術と比較して、コンテナはオペレーティングシステム(OS)のカーネルを共有し、アプリケーションとその依存関係をコンテナ内にパッケージ化します。
これにより、アプリケーションはどの環境でも一貫して実行することが可能になります。
Dockerはコンテナを構築するツールのディファクトスタンダードとなっているツールであり、AWSやAzureなどのクラウドサービスでも利用できるツールとなっています。

コンテナの特徴

1. 軽量性

コンテナはOSのカーネルを共有し、それぞれのコンテナが必要なライブラリや実行ファイルのみを含んでいるため、仮想マシンよりも起動が速くリソースの消費が少ない。

2. 移植性

アプリケーションとその実行環境をコンテナとしてパッケージ化することで、異なる環境間での移動が容易になり、開発からテスト、本番環境への移行がスムーズに行える。

3. 独立性

各コンテナは他のコンテナやホストOSから隔離されており、プロセス、ファイルシステム、ネットワークなどが独立してる。これにより、アプリケーション間の干渉を防ぎ、セキュリティを向上させることができる。

4. 効率性

コンテナの起動、停止、デプロイが迅速に行えるため、開発、テスト、デプロイメントのプロセスを高速化できる。

コンテナの仕組み

コンテナの仕組みを一言で言うと。。。

「アプリとファイルシステムを隔離する特殊なプロセス」
と言うことらしいです。

コンテナの仕組み、要するに。。。

従来の仮想化技術は物理マシンを複数のマシンに分けて環境構築しているのに対して、コンテナでは1つの物理マシンで動いている中で、プロセスとアプリだけを隔離させて別マシンで動いているような状態にしていると言うイメージでしょうか。
ChatGPT先生にこんな感じで合っているか聞いてみました。

提供された文章は、Dockerとコンテナ技術の概念を説明する際に正しい方向性を持っていますが、もう少し正確さと明確さを増すことができます。以下に、より正確で分かりやすい説明を示します:


従来の仮想化技術では、物理的なサーバーを仮想マシン(VM)に分割し、それぞれのVMが独立したオペレーティングシステム(OS)を持つことで、複数の環境を構築します。これにより、一つの物理マシン上で複数の異なるOSを実行することが可能になりますが、この方法は比較的リソースを多く消費します。

一方、Dockerを含むコンテナ技術では、物理マシンのOSのカーネルをコンテナ間で共有しつつ、アプリケーションとその実行に必要なライブラリや設定をコンテナ内に閉じ込めます。これにより、それぞれのコンテナが独立した環境として機能し、異なるアプリケーションを隔離して同じ物理マシン上で実行できるようになります。コンテナは軽量で、起動が速く、仮想マシンよりも少ないリソースで多くのアプリケーションを実行することが可能です。

このアプローチにより、開発者はアプリケーションを素早くかつ効率的に開発、テスト、デプロイすることができ、環境ごとの差異に悩まされることなく、アプリケーションを任意の環境で一貫して実行することが可能になります。


この説明では、コンテナと従来の仮想化技術の違いを明確にし、Dockerとコンテナ技術がどのように動作するか、そしてなぜそれが有効であるかを説明しています。

https://chat.openai.com/share/59baf8f4-4f2c-423c-9ed5-f961795429c1

なるほど、分かりやすい。

コンテナの構成

ChatGPT先生が説明してくれた通り、コンテナの構成は物理マシン上のホストOSを共有しています。
ホストOS上にDockerのようなコンテナを構築するソフトウェアがインストールされ、その上にコンテナが作成されます。
各コンテナは独立しながらカーネルはホストOSのものを利用しており、仮想マシン上にゲストOSをインストールする必要がありません。
図にすると以下のようなイメージになります。

オーバーヘッドが大きく手間のかかる仮想化マシンやゲストOSが不要なことがコンテナの軽量さにつながり、それが大きなメリットとなっているのです。

このように複数の環境をコンテナで構築することで、webアプリとDBの通信などを仮想化して再現することができるようになります。

まとめ

  • コンテナとは、仮想化技術である。
  • 従来の仮想化技術よりも軽量で移植性が高く、効率的に開発を行うことができるようになっている。
  • ホストOSのカーネルを共有して利用し、必要なライブラリと実行ファイルのみをコンテナが持ち、ファイルとアプリを隔離することで仮想化を実現している。

今回はコンテナ技術とは、と言う超基礎的なことをまとめてみました。
今まで何となく利用していたDockerですが、きちんと調べて説明を読み、ChatGPT先生にも助けてもらうことでかなり理解できたと感じます。
今や開発に不可欠な技術となっていると思うので基礎からしっかり理解して業務に活かしていきたいと思います。
ここまで読んでいただきありがとうございました。
それでは、また。