Dockerとは
Docker 社が開発したコンテナ型の仮想環境を作成・配布・実行するためのプラットフォームです。
コンテナとは
実行環境をアプリケーションとその実行に必要なライブラリごとに隔離する仕組みです。
※詳細は省きますが、Docker はこの隔離技術を Linux カーネルの機能で実現しています。
(namespace,cgroup, UnionFSなど)。
Docker はこのコンテナを実現するためのソフトウェアであるコンテナエンジンを提供してくれます。
※ コンテナにある OS について
本来 Linux の OS を構成しているカーネルとディストリビューションを分離しています。
この構成によって、コンテナでは最小限の機能だけで実行することができます(軽量の仕組み)。
※カーネルとは
OS の中心的な役割を担うものを指します。
例) ハードウェアの制御、アプリケーションの実行環境、対人インターフェースなどを提供
※周辺部(ディストリビューション)とは
カーネルにライブラリやシェルなどの基本コマンド、GUIシステムなどを加えて、1つの OS として配布&利用できる形にまとめたものです。
例) RedHat , Ubuntu , CentOSなど
※仮想マシン
例) VMware , Microsoft Hyper-Vなど
Docker(コンテナ)を利用するメリット
軽量
- コンテナを動作するための環境が仮想マシンに比べて構成が少ないことがわかります。
- 例えば、コンテナはカーネルの共有をしますし、ゲストOSによるリソースの消費が無いことが挙げられます。
つまり、コンテナは仮想マシンに比べて軽量(物理サーバーの負荷が小さい) と言えます。
可搬性
コンテナエンジンによってハードウェアやOS毎の違いが吸収されるため、他のサーバーに移してもすぐに実行することができます。
DockerEngine について
Docker 社が提供しているコンテナ技術を提供するソフトウェアです。
コンテナ作成でそれほど意識することは無いですが、仕組みを知る上では大事なので説明します。
以下の3つの主なコンポーネント(赤枠)を持つクライアント・サーバ型アプリケーションです。
- クライアント(docker CLI)
- REST API
- Docker デーモン
クライアント(docker CLI)
- Docker を操作(通信)するためのコマンドラインツールです。
- ユーザからのコマンドを受け付けると、REST APIを呼び出します。
※API通信について
図ではクライアントがホストの外にある構成ですが、ホストの中にあるパターンもあります。
その場合、Unix ドメインソケットを利用して通信を行います。
REST API
クライアントからコマンドを受け付けます。
Docker デーモン
- Linux のデーモンプロセスで、Docker Engine API が呼び出されるのを待ち受けています。
- Docker デーモンは、呼び出された Docker Engine API に応じて、イメージのビルドやコンテナの起動などを行います。
レジストリ
- Docker イメージを保管します。
- プライベートとパブリックがあり、パブリックとしてはDocker Hubがあります。
- 作成したイメージを配置したり、作成したいイメージを引っ張ってくることが可能です。
コンテナはどうやって作るのか
大まかにいうと以下の工程です。
(1). Dockerfile を作成
(2). Dockerfile からイメージを作成
(3). イメージからコンテナを作成
Dockerfile
- Docker イメージを作成するための手順を記したテキストファイルです。
- 少しややこしいですが、イメージを作成すると言うより、既存のイメージに対してカスタマイズを行い、新規のイメージを作成するということです。
イメージ(Image)
- コンテナ(=アプリケーションの実行環境)を起動するのに必要な設定ファイルをまとめたものを指します。
- " Image はコンテナの元であり、Imageからコンテナを起動する "と理解すると良いと思います。
コンテナ
- アプリケーションとミドルウェア、OSの一部(ライブラリーなど)を隔離したものです。
- コンテナイメージから作成します。
以上、Docker 基本についての記載でした。
この記事に関して間違いなどありましたら、ご指摘いただけるとうれしいです。