【ふくだ学習録】Docker入門 part2【21日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)
[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)
[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/ref=cm_sw_r_tw_dp_U_x_XlokEbJQK2N7P )

### 今読んでいる本

[Docker入門](https://www.amazon.co.jp/dp/480071091X/ref=cm_sw_r_tw_dp_U_x_xVlmEbN8ZTHZK)

# Docker入門

### ハードウェアレベル仮想化,OSレベル仮想化とは？
**ハードウェアレベル仮想化**
サーバーハードウェアを擬似的に再現した「仮想化マシン」を提供。
仮想マシン上に、ゲストOSをインストールして、その上でアプリケーションを稼働させる。

メリット：ホストOSと異なるゲストOSを自由に選択できる。ホスト環境とゲスト環境の分離度が高いため、セキュリティ面では安全性が高い。
デメリット：ハードウェアの再現やゲストOSが必要になるため性能が出にくい。

**OSレベル仮想化**
アプリケーション実行環境を分割した「隔離環境」をホストOSの機能で提供。隔離環境内では、あたかもホストOSを自分だけが占有しているかのように外部環境とは独立してアプリケーションを実行できる、

メリット：ホストOSで通常のアプリケーションを実行する場合と、ほぼ同じ利用資源量でアプリケーション実行ができるため軽量。
デメリット：ホストOSと異なるOSを隔離環境内で使用できない。分離度が比較的低いため、安全性が脅かされる可能性がある。

### Namespaceとは？
Linuxカーネルが提供してくれる機能の一つ。プロセスに対してリソースを分離する機能。
Dockerでは、各コンテナの資源をホスト環境から分離して相互参照できないようにするために使用している。

[namespace (名前空間)](https://qiita.com/wellflat/items/7d62f2a63e9fcddb31cc#namespace-%E5%90%8D%E5%89%8D%E7%A9%BA%E9%96%93)

### Cgroupsとは？
control groupsの略で、タスクをグループ化したり、そのグループ内のタスクに対して割り当てる様々なリソースを制御している。
Dockerでは、コンテナ内で実行するプロセス群を、それ以外で実行するプロセスと区別するために使用されている。

[cgroups](https://qiita.com/wellflat/items/7d62f2a63e9fcddb31cc#cgroups)

### NamespaceとCgroupsの役割の違い
namespaceではホスト名やPID空間などのカーネル/OSが扱うリソースを制御(隔離)する。
cgroupsで制御するのはCPUやメモリといった物理的なリソース。


### chrootとは？
システムの基準ディレクトリを一時的に別のディレクトリに置き換える機能。
コンテナごとのルートディレクトリを変更するために使用している（っぽい）

[chrootとは何でしょうか？](https://teratail.com/questions/1508)

### Netfilterとは？
ネットワークパケットを適切なサイズごとに分割&処理してくれる機能。あとはNATとしての役割も持っている。
下記サイトがわかりやすかった！

[Netfilterに関するエトセトラ](http://enog.jp/wp-content/uploads/2012/12/netfilter_etc_121221.pdf)

### 仮想ネットワークドライバ
（あくまでこの本内の文脈上だが）あるアプリケーションなどがハードウェアを占有しようとすると、仮想デバイスドライバがその命令を奪い返して、複数の命令が重なっても不都合なく実行できるようにするためのもの。
下記サイトの説明が分かりやすかった。（windowsって書いてるけど、多分windowsだけに限った概念じゃないはず）

[仮想デバイスドライバ](https://www.weblio.jp/content/%E4%BB%AE%E6%83%B3%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90)

### AUFS,OverlayFSとは？
Linux のファイルシステムサービスであり、複数の異なるファイルシステム (ブランチと呼ばれる) のファイルやディレクトリ同士を透過的に重ねる (マージする) ことができる技術。そういったシステムのことをユニオンファイルシステムという。
Dockerで、イメージの積み重ねをすることができるのは、この技術を使用しているから。

AUFSとOverlayFSはその代表格。

[aufs](https://ja.wikipedia.org/wiki/Aufs)
[OverlayFSについて](https://qiita.com/awakia/items/a9296840349f0b6f4482)

### device-mapperとは？
Linux上で多くのボリューム管理技術の基盤となるカーネルベースのフレームワーク。
dockerでは、イメージを統合する際のストレージ・ドライバ1つとして使用されている。

[Dockerのストレージドライバを理解する](https://qiita.com/NaotoHanaue/items/b9f395a63f7aae2a41b7)

### dockerインストール向きのホストOS
「CentOS」か「Ubuntu Server」がおすすめ。
理由はサーバー用Linuxディストリビューションのため、軽量（GUIサポートなどの必須ではないコンポーネントが入っていない）かつサポート期間が長いから。

またDockerの利用を前提として作られた「Core OS」「CentOS Atomic Host」といったディストリビューションもあり、こちらはさらに効率化されているものになるので、パフォーマンス改善の時には検討しても良いかも。

### apt-getコマンド
apt-getコマンドは、Debian系のディストリビューション（DebianやUbuntu）のパッケージ管理システムであるAPT（Advanced Package Tool）ライブラリを利用してパッケージを操作・管理するコマンド。

# 今日の一言
結論、下記サイトがいっちゃん分かりやすい説。

[Docker ドキュメント日本語化プロジェクト](http://docs.docker.jp/engine/userguide/storagedriver/imagesandcontainers.html)