‫このセクションでは､ 永続的なデータにまつわる講義や課題が満載です｡
‫まず､ 永続的なデータの問題点と､ そもそもなぜそれが問題になったのかについて説明します｡
‫そこで理解すべき重要なコンセプトは､ イミュータブル・インフラストラクチャという考え方です｡
‫そして､ コンテナは本来､ 儚いデザインであるという考え方です｡
‫それらは第1回目の講義で取り上げます｡ 次に､ データボリュームについて､ そして永続的なデータに関する問題のいくつかを解決する方法について説明します｡
‫さらに､
‫バインドマウントと､ それが永続的なデータに関するさまざまな問題をどのように解決するのかについても掘り下げます｡ そして､ このセクションの最後に､ データベースのコンテナを置き換えながら､
‫データベースのデータを保持する方法について､ いくつかの課題を提示します｡ また､ 編集中にホストからコンテナにコードをマウントして､
‫コンテナ内でコードをライブで実行できるようにすることも可能です｡
‫この最初の講義の要件は､
‫コンテナの実行方法と､ これまでに説明したコンテナとイメージの概念を理解していることだけです｡
‫これまでは､ コンテナの実行に必要なものだけを考え､ コンテナ実行後に作成される可能性のあるユニークなデータについては考えなかったのです｡
‫コンテナは､ イミュータブルでエフェメラルであることを意味します｡
‫それらは､ 不変で一時的な､ あるいは使い捨ての､ 空想上の流行語に過ぎない｡
‫ここでは､ コンテナを捨てて､ イメージから新しいコンテナを作ればいいという発想ですね？
‫そうなると､ コンテナの実際の制限の話ではなく､ 設計目標やベストプラクティスの話になります｡
‫これは､ 一度稼働させたものは変えないというイミュータブルインフラの考え方です｡
‫もし､ 設定変更が必要な場合や､ コンテナのバージョンアップが必要な場合は､ 全く新しいコンテナを再デプロイします｡
‫これにより､ 信頼性と一貫性､ そして変更の再現性において大きなメリットを得ることができます｡
‫しかし､ そこにはトレードオフがあります｡
‫アプリが生成するユニークなデータについてはどうでしょうか｡ データベースやキー・バリュー・ストアなど､ アプリがファイルに吐き出すものは？
‫理想を言えば､ コンテナにはアプリケーションのバイナリに混じって､ あなた固有のデータが含まれていないことが望ましい｡ これは「関心事の分離」として知られていますが､
‫実はDockerはここで大きなメリットを与えてくれます｡
‫新しいコンテナを再作成して､ アプリケーションを更新することができます｡ 理想的には､ コンテナがリサイクルされる間､
‫私たちのために保存された固有のデータが､ 必要な場所に残っていることです｡
‫これまでお気づきでなかったかもしれませんが､ これまで使っていたコンテナは､ デフォルトではパーシステントでした｡
‫コンテナを取り外すまで､ 再起動や再起動の際にも､ 実際に変更が加えられていました｡
‫コンテナを停止したり､ ホストを再起動したからといって､ コンテナのファイル変更がなくなるわけではありません｡
‫コンテナを取り外すときに初めてUFS層がなくなるのですが､ それを自由にできるようにしたいのです｡
‫このユニークなデータの問題は､ 業界では「パーシステントデータ」と呼ばれ､ コンテナまではその名称がなかったのです｡
‫というのも､
‫私たちが作ったもののほとんどは､ 5年､ 10年､ あるいはそれ以上にわたって古いアプリを動かし続けている古いサーバーのように､ 永続的なものだったからです｡
‫デフォルトですべてパーシステントになっていました｡
‫コンテナやアプリケーションのオートスケーリングという新しい世界では､ 永続的なデータがユニークな問題を引き起こします｡
‫Dockerはこの問題に対して､ 「データボリューム」と「バインドマウント」という2つの解決策を用意しています｡
‫「Dockerボリュームはコンテナの設定オプションで､
‫そのコンテナのユニオンファイルシステムの外側に特別な場所を作成し､ 固有のデータを保存するものです｡
‫これにより､ コンテナの取り外しの際にも保存され､ 好きなコンテナに装着することができます｡
‫そして､ コンテナはそれをローカルファイルのパスのように見るだけです｡
‫そして､ バインドマウント｡ これは､ ホストのディレクトリやファイルをコンテナに共有したりマウントしたりすることです｡
‫ここでも､ コンテナへのローカルファイルパス､ またはディレクトリパスのように見えるだけでしょう｡
‫実際には､ ホストから来たということはわからないでしょう｡