結構前からDockerにやるやる言っていたDockerに触れていきたいと思います。
完全に初めての技術です。他のものと並行でやるので進みは極めて遅いと思われます。
それはそうといろいろと入門、入門しているのはいいけど、しっかりと門の中まで入れているのだろうか。
サーバ仮想化技術
コンテナ技術はいわゆるサーバ仮想化技術ですが、サーバ仮想化技術自体はいくつか種類があるので先にそちらを押さえておきます。
ホスト型サーバ仮想化
私もよく使っている(最近はサボり気味)VirtualBoxがそれです。
ハードウェア上にホストOSがあり、そこに仮想化ソフトウェアをインストールし仮想環境を構築します。
ホストOS上へのインストールで気軽に仮想環境を構築することができる反面、ホストOS上にゲストOSを稼働させるためコンテナ型と比較するとオーバヘッドが大きくなる。
ハイパーバイザー型
コンピュータを仮想化するソフトウェアであるハイパーバイザーをハードウェア上に配置する方式。
ハイパーバイザーでハードウェアと仮想環境の制御を行う。
ホストOSが存在しない分リソースを効率よく利用できるが、仮想環境ごとにOSが存在するのでその分の無駄は存在する。
クラウドサービスなどの仮想マシンでも活用されている方式でもある。
コンテナ型
ホストOS上に論理的な区画をつくり、アプリケーションを動作させるためのライブラリやミドルウェアをまとめ個別のサーバとして扱えるようにしたもの。
ここでいう論理的な区画がいわゆるコンテナにあたる。
ホストOSのリソースをコンテナごとに分割しているため、オーバヘッドを最小限に抑えることができる。
コンテナ型では、OSやディレクトリ、IPアドレスなどを個々のアプリがあたかも専有しているように使用することができる。
Docker
Dockerとは
Dockerは前述のコンテナ型のサーバ仮想化技術であり、実行環境が容易に構築できるようになります。
その実はアプリの実行に必要な環境を一つのイメージにまとめ様々な環境に適用することが可能となります。
Dockerの利点は開発環境、検証環境、本番環境などに一つのアプリケーションを実行するための環境が複数ある場合にこそ発揮されます。
通常のシステム開発であれば、開発環境⇒検証環境⇒本番環境のように開発工程によって適用環境を変えていくのが一般的ですが、環境の差異によってシステムが正常に動作しないという事態が発生します。
このリスクを抑えるのがDockerの一つ役割です。
実際の開発の際には、Dockerレポジトリなどに集約し共有を行いそこからDockerイメージを作成し各環境に同一のイメージを適用していきます。
細かいところはまだ分からないので、詳しくはこれから見ていきましょう。
Dockerの基本機能
■Build
一言で言うとDockerイメージをつくる機能。
Dockerではアプリ実行に必要なプログラムやミドルウェアなどをイメージにまとめますが、各イメージには一つのアプリケーションをのせることが推奨されています。
実際のイメージにはアプリ実行に必要なファイル群がディレクトリに格納されたものとなります。
後述するDockerHubなどでも公式によりイメージに一つのアプリがのったものが公開されており以下のような感じでコンテナを構築することになります。
※個人的にはこの辺がちゃんとイメージできてなかった。
Dockerイメージの作成には大きく二つの方法があり一つはDockerコマンドで作成する方法。
もう一つはDockerfileを記述する方法です。
導入の目的やDockerの利点から、インフラをコードで自動構築できる、Dockerfileを記述する方法が推奨されているようです。
■Ship
一言で言うとDockerイメージを共有する機能。
Dockerイメージはレジストリによって共有が行われる。
公式から出されているレジストリがいわゆるDockerHubと言われるもの。
DockerHubではLinux系のOSイメージなどが公開されており、それをベースとしてミドルウェアやアプリのイメージを重ねて必要な実行環境を構築していくことになります。
■Run
一言で言うとDockerコンテナを動かす機能。
DockerイメージはDockerがインストールされた環境であればどこでもコンテナを動かすことができ、通常はコンテナ単位でサーバを動かすことになります。
一つのDockerイメージから複数のコンテナを構築することができ、また一つのサーバ上に複数のコンテナを実行することも可能です。
とりあえずここまでのイメージです。
もしかすると実態とはずれがあるかもしれません。
Dockerのコンポーネント
Dockerは複数のコンポーネントから成り立っています。
どのコンポーネントがどのような働きをしているかはイメージがつく状態にしておいた方が学習を進めるうえでも楽になると思われますので、詳細は別としてここで外観を押さえておきましょう。
■Docker Engine
DockerEngineはDocker技術を支える主要コンポーネントです。
Dockerイメージの生成やコンテナの実行を行います。
■Docker Registry
Dockerイメージの公開や共有を行うコンポーネントです。
DockerHubもこのコンポーネントが利用されています、
■Docker Compose
コンテナ群を一元管理するためのコンポーネントです。
通常は複数コンテナの構成情報をコードで定義して、コマンドで管理を行います。
■Docker Machine
AWSやAzureなどのクラウド環境に実行環境をコマンドで自動生成するためのコンポーネントです。
■Docker Swarm
複数のDockerホストをクラスタ化するコンポーネントです。
Dockerの動作原理
ここで無理に押さえなくても開始は可能だと思うので軽く。
むしろ実際に動作させながらの方が理解は早い気もしますが一応ね
namespase
名前空間(なまえくうかん)はNamespaceの訳語で、名前の集合を分割することで衝突の可能性を低減しつつ参照を容易にする概念である。
引用元:名前空間 - Wikipedia
そもそも言葉としてあまり知らなかったが一般的な概念と同じでよさそう。
Dockerではコンテナを区画するためにLinuxカーネルのnamespaseを使用する。
なにに使用するかと言うと、コンテナ間での名前の衝突を防ぐため。
同一環境に複数のコンテナを配置した場合にネットワークやプロセスの衝突が起きる可能性があるためかなと考えた。
namespaseは以下のようなものが存在する。
Linuxサーバ関連の知識がないとすぐには完璧には理解しにくいかもしれない。
このようなものがあると把握しておいて、出現するたびに戻ってしっかり理解すればよいのかな
・PID namespase
・Network namespase
・UID namespase
・MOUNT namespase
・UTS namespase
・IPC namespase
cgroups
cgroups (control groups) とは、プロセスグループのリソース(CPU、メモリ、ディスクI/Oなど)の利用を制限・隔離するLinuxカーネルの機能。
引用元:cgroups - Wikipedia
こちらもLinuxカーネルの機能。
簡単な言うとリソースの制限、配分みたいな感じだろうか?
Dockerでは一つの環境に複数のコンテナが動作するケースが想定されるが、一つのコンテナがホストOSのリソースを消費し他のコンテナ動作できないような状況を防ぐ。
通常は優先順位を定め、リソースの配分を予め決めておくような使い方になるのだろう。
ネットワーク
Dockerでは以下のようなネットワークが構築される。
まずDockerを起動するとDocker0と呼ばれるブリッジが作成される。
コンテナを起動するとコンテナごとに「172.17.0.0./16」のサブネットをもつプライベートIPアドレスが割り振られる。
このような仕組みになっているため、コンテナが外部通信を行う際にはNAPTを使用する。
これにより、ホストのIPアドレスとポート番号をコンテナのIPアドレスとポート番号に紐づけ一つのグローバルIPアドレスと複数のプライベートIPアドレスに対応させる。
今回はここまで。次回はインストール。
いつも思うけど初めての技術ではじめに概要をまとめるって結構難しいよね。
ほんとはある程度理解している状態で書いた方がよいのかもしれない。