- Docker=chroot+OverlayFS+カーネルのプロセス分離技術
- 仮想OSとは概念が違う。仮想OSはBIOSより上をすべて差し替えるけど、Dockerは特定用途に必要なファイルだけ差し替える。下から全てなのか、上から必要最小限なのかの違い
- 仮想OSぽいこともできるけど、それは狙ったものではないので、失敗することが多い。ネット上の批判はそのあたりに原因がある。
- ソースコード以外の、たとえばデーモンやライブラリや設定ファイルにバージョン管理の概念を導入したもの
- 開発環境と本番環境の同一性を保証するような用途に向く。または、使い捨てのアプリでも、親環境を汚さないで済む
- 基本的にLinux系OSの上に、やりたいことに関連する依存部分すべてををDocker imageとして用意し、基本となるOSの上にDockerで用意した差分を当てることで、特定の用途として使えるようにしたもの
- 基本Linuxで動く。macOSはUnix系なのでDocket for Macを使うことで動かすことが出来る。Windowsは、仕組みが違いすぎるので、Dicker for Windowsを使うことで、内部的に仮想Linuxを立ち上げることで動かしている
- 最近はクラスタリングを便利にする方向に進化している
- 元となるOSからの差分は、OverlayFSを使って、たくさんのレイヤーを重ねることで実現しており、変更はレイヤーごとで管理するので、仮想OS(すべてを一括管理)より入れ替えが楽。これにより開発中のテストや修正などが迅速に行える
- Docker imageは、レイヤーに相当しており、実際にはファイルやサブディレクトリを含んだ1つの読み取り専用ディレクトリとして実装されている。(OverlayFSの下層レイヤーとして機能する)
- Docker containerは、実行する度に作られる管理単位で、一つのDocker imageから複数のDocker containerを作ることが出来る
- Docker containerは、OverlayFSを使っていることもあって、変更された分は最上位レイヤーに差分としてとして管理される。
- コンテナの実行を終えたとき、最上位レイヤーは破棄されるので、残しておく必要があるときはdocker commitを使って保存しておく必要がある
- レイヤーは複数重ねることが出来る。これにより基本部分や特定用途など、用途ごとに管理できる
- レイヤーの層の分、OverlayFSでの重ね合わせが発生する。ファイルを1バイトでも変更すると、ファイル単位のcopy on writeが発生し、これが最大のオーバヘッドとなる。それ以外の部分のオーバヘッドは小さい。
- Docker containerからは、親となるOSのディレクトリを直接マウントできるので、変化するデータは親のファイルシステムに保存するのが定石(じゃないと、遅くなる)
- 仮想OSではないので、親のOSのディストリビューションや、バージョンに影響を受ける。基本的には動くように作っているはずだが、現実的には、同じディストリビューションの同じバージョンで動かす方がよい(ディストリビュービューターの努力依存)
- 元になるOS部分と、一層目のレイヤーの境界線がわかりにくい。要はOS層の中で、マシンが違っても同じ実行を保証するための、共通因子がはっきり定義されてない印象。ただしこれは、元となるOS部分を限りなく薄くして、一層目のレイヤーを厚くすることで吸収するような方向に進化中とのこと
- どこに使えば使えばいいのか、いまいち解りにくい
- 市販の本は、既に古くなっている部分が多いのでオススメしない。 Dockerドキュメント日本語化プロジェクトをオススメする。
- ros2はRobot Operating System ver2です。ロボット開発にパッケージシステムや共通コンパイル環境を用意することで、車輪の再発明を抑制してみんなハッピー、みたいなものです。ただ、進化スピードが早いのと、周辺システムまで含めると巨大なので、コンパイルを通すのがしんどいです。おそらくそれをdockerを使って解決しているのだと思います。
- sagemathは数学系の教育補助ソフトに分類されるのかな。jupyter notebookやsageなどを使って数式を書くと、それを解析的に解いてくれたり、グラフに書いてくれたりします。AIやってる人は結構使ってるはず。同様のものが無料のクラウドサービスとして運用されていますが、混むと遅くなるのでこちらでdocker imageも配布されているようです。(なので自分のマシンで立ち上げてもユーザ登録から始まった気がします)