#はじめに
この記事ではDockerの仕組みについて説明します。
##対象
Docker初心者で、Dockerの仕組みを知りたい方向け。
コマンド等具体的な手順、Dockerファイルについて説明していません。
また、かみ砕いた表現をしているため、正確性には欠けているかもしれません。
##参考資料
主に「15Stepで習得 Dockerから入るKubernetes コンテナ開発からK8s本番運用まで」を参考に書いています。
#1.コンテナとは
Dockerはコンテナ技術の一種です。
Dockerの説明の前に、まずはコンテナについて説明していきます。
コンテナとは、アプリケーションを起動する際に必要なミドルウェア、ライブラリ、設定ファイル等をひとまとめにしたものです。
複数のコンテナがある場合もそれぞれ独立しているため、別のマシンが動いているかのように扱うことができます。
コンテナのメリットには以下のようなメリットがあります。
##(1)利用するリソースを削減
以前から仮想環境を構築する方法がありましたがリソースの消費が大きいことが課題でした。
ここでコンテナとの比較のため、従来までの仮想マシンを用いた仮想化環境の説明をします。
仮想マシンを用いた場合以下の構成になります。
ゲストOSが必要なためリソース消費が大きくなります。
一方、コンテナは以下の図のように構成されています。
ゲストOSがないためリソースの消費量を削減できます。
ハードウェアやCPUの利用率を高めることができ、ハードウェアを効率よく利用することができます。
##(2)アプリケーションを異なる環境へ移行しやすい
コンテナの中には、アプリケーション等を実行するために必要なミドルウェア、ライブラリなどがひとまとめになっています。
例えばローカル環境で動作確認し、商用環境に移行するときもコンテナごと移動できるので、
ローカル環境と商用環境で実行構成を変更することなく移行できます。
##(3)環境の構築、設定のしやすさ
コンテナは環境がコード化されているため、構成管理がしやすくなっています。
同様の環境を作る際には、ファイルをビルドするだけで環境構築できます。
参考リンク
https://knowledge.sakura.ad.jp/13265/
#2.Dockerについて
では本題のDockerについて説明します。
Dockerはコンテナの作成、実行、イメージ管理を支援するツールです。
「Dockerイメージ」とは、読み取り専用のコンテナテンプレートで、
コンテナを起動するための実行形式や設定ファイルのかたまりです。
Dockerの構成は下の図のようになります。
矢印(1)~(3)はdocke runコマンドを実行した際の処理の流れになります。
##(1)Dockerコマンドを入力
クライアントはDockerコマンド(コマンドラインユーザーインターフェース)です。
DockerデーモンがDockerコマンドの要求を受け取り、Dockerオブジェクトを管理しています。
この図では「docker run app: 1.0」という要求を受け取り、
イメージ名「app」でタグ名「1.0」がついたイメージからコンテナを生成する処理を実行します。
##(2)レジストリからローカルリポジトリにイメージをコピーする。
Dockerイメージはレジストリに保管されています。
レジストリには以下の3種類あります。
【1】パブリックレジストリ
・Docker Hub
・Quay
誰でも無料で利用できる一般公開されているレジストリです。
docker runコマンドはデフォルトでDocker Hubからイメージをとってくるように指定されています。
参考リンク:https://knowledge.sakura.ad.jp/2210/
【2】クラウドのレジストリ
・Amazon Elastic Container Service
・Azure Container Registry
・Google Container Registry
レジストリの利用者をクラウドのユーザーアカウントに限定することができます。
【3】プライベートレジストリ
・Harbor
・GitLab
・registry
リポジトリ利用者のアクセス元を制限することができます。
レジストリは複数のリポジトリから構成されています。
リポジトリとは、イメージ名にタグをつけてバージョン等を識別して保管しています。
この図ではイメージ名「app」、タグ名「1.0」がついたイメージをレジストリから探し、
ローカルリポジトリにコピーします。
##(3)ローカルレジストリからDockerコンテナを生成
ローカルレジストリに持ってきたイメージ名「app」、タグ名「0.1」のイメージからコンテナを作り出します。
このことを「インスタンス化する」とよく表現されますが、
「イメージ」というひな形からコンテナの「物体」を作り出している、
と想像するとわかりやすいと思います。
これでdocker runの処理は完了し、コンテナが生成されます。