前からDockerにやるやる言っていたDockerに触れていきたいと思います。完全に初めての技術です。他のものと並行でやるので進みは極めて遅いと思われます。それはそうといろいろと入門、入門しているのはいいけど、しっかりと門の中まで入れているのだろうか。サーバ仮想化技術ホスト型サーバ仮想化ハイパーバイザー型コンテナ型DockerDockerとはDockerの基本機能DockerのコンポーネントDockerの動作原理namespasecgroupsネットワークサーバ仮想化技術コンテナ技術はいわゆるサーバ仮想化技術ですが、サーバ仮想化技術自体はいくつか種類があるので先にそちらを押さえておきます。私もよく使っている(最近はサボり気味)VirtualBoxがそれです。ハードウェア上にホストOSがあり、そこに仮想化ソフトウェアをインストールし仮想環境を構築します。ホストOS上へのインストールで気軽に仮想環境を構築することができる反面、ホストOS上にゲストOSを稼働させるためコンテナ型と比較するとオーバヘッドが大きくなる。ハイパーバイザー型コンピュータを仮想化するソフトウェアであるハイパーバイザーをハードウェア上に配置する方式。ハイパーバイザーでハードウェアと仮想環境の制御を行う。ホストOSが存在しない分リソースを効率よく利用できるが、仮想環境ごとにOSが存在するのでその分の無駄は存在する。クラウドサービスなどの仮想マシンでも活用されている方式でもある。コンテナ型ホストOS上に論理的な区画をつくり、アプリケーションを動作させるためのライブラリやミドルウェアをまとめ個別のサーバとして扱えるようにしたもの。ここでいう論理的な区画がいわゆるコンテナにあたる。ホストOSのリソースをコンテナごとに分割しているため、オーバヘッドを最小限に抑えることができる。コンテナ型では、OSやディレクトリ、IPアドレスなどを個々のアプリがあたかも専有しているように使用することができる。DockerDockerとは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は複数のコンポーネントから成り立っています。どのコンポーネントがどのような働きをしているかはイメージがつく状態にしておいた方が学習を進めるうえでも楽になると思われますので、詳細は別としてここで外観を押さえておきましょう。EngineDockerEngineはDocker技術を支える主要コンポーネントです。Dockerイメージの生成やコンテナの実行を行います。RegistryDockerイメージの公開や共有を行うコンポーネントです。Composeコンテナ群を一元管理するためのコンポーネントです。通常は複数コンテナの構成情報をコードで定義して、コマンドで管理を行います。MachineAWSやAzureなどのクラウド環境に実行環境をコマンドで自動生成するためのコンポーネントです。Swarm複数のDockerホストをクラスタ化するコンポーネントです。Dockerの動作原理ここで無理に押さえなくても開始は可能だと思うので軽く。実際に動作させながらの方が理解は早い気もしますが一応ねnamespase名前空間(なまえくうかん)はNamespaceの訳語で、名前の集合を分割することで衝突の可能性を低減しつつ参照を容易にする概念である。Wikipediaそもそも言葉としてあまり知らなかったが一般的な概念と同じでよさそう。Dockerではコンテナを区画するためにLinuxカーネルのnamespaseを使用する。なにに使用するかと言うと、コンテナ間での名前の衝突を防ぐため。同一環境に複数のコンテナを配置した場合にネットワークやプロセスの衝突が起きる可能性があるためかなと考えた。namespaseは以下のようなものが存在する。Linuxサーバ関連の知識がないとすぐには完璧には理解しにくいかもしれない。プロセスグループのリソース(CPU、メモリ、ディスクI/Oなど)の利用を制限・隔離するLinuxカーネルの機能。WikipediaこちらもLinuxカーネルの機能。簡単な言うとリソースの制限、配分みたいな感じだろうか?Dockerでは一つの環境に複数のコンテナが動作するケースが想定されるが、一つのコンテナがホストOSのリソースを消費し他のコンテナ動作できないような状況を防ぐ。通常は優先順位を定め、リソースの配分を予め決めておくような使い方になるのだろう。ネットワークDockerでは以下のようなネットワークが構築される。Dockerを起動するとDocker0と呼ばれるブリッジが作成される。コンテナを起動するとコンテナごとに「172.17.0.0./16」のサブネットをもつプライベートIPアドレスが割り振られる。このような仕組みになっているため、コンテナが外部通信を行う際にはNAPTを使用する。これにより、ホストのIPアドレスとポート番号をコンテナのIPアドレスとポート番号に紐づけ一つのグローバルIPアドレスと複数のプライベートIPアドレスに対応させる。