カニゲーム攻略日記ブログ

beatmaniaIIDXやハースストーンなどのゲーム攻略日記。主にまったり勢。2016年にIIDX皆伝になった

Docker チュートリアル 5 6

目次

5 DB を永続化する

https://docs.docker.com/get-started/05_persisting_data/

コンテナとファイルシステムの関係

+---------------------+      +---------------------+
|      コンテナ A      |      |      コンテナ B      |
+---------------------+      +---------------------+
|    スクラッチスペース  |      |    スクラッチスペース  |
|      (変更可能)       |      |      (変更可能)       |
+---------------------+      +---------------------+
|                     |      |                     |
|    イメージレイヤー1   |      |    イメージレイヤー1   |
|    (読み取り専用)     |      |    (読み取り専用)     |
|                     |      |                     |
+---------------------+      +---------------------+
|                     |      |                     |
|    イメージレイヤー2   |      |    イメージレイヤー2   |
|    (読み取り専用)     |      |    (読み取り専用)     |
|                     |      |                     |
+---------------------+      +---------------------+
|                     |      |                     |
|    イメージレイヤー3   |      |    イメージレイヤー3   |
|    (読み取り専用)     |      |    (読み取り専用)     |
|                     |      |                     |
+---------------------+      +---------------------+

この図では、コンテナAとコンテナBは、同じイメージのレイヤーを読み取り専用で共有しています。ただし、それぞれのコンテナは、ファイルを作成/更新/削除するための独自の「スクラッチ スペース」を持っています。コンテナAでの変更は、コンテナBには影響しません。これにより、各コンテナが互いに独立して動作できるようになります。

クラッチベースの語源

"スクラッチ"という言葉は、元々は英語で「ゼロから」や「最初から」という意味を持つ言葉で、スクラッチベースの語源となっています。スクラッチベースは、何もない状態から始めることを意味します。コンテナの文脈では、スクラッチスペースとは、各コンテナが独自に持っていて、そこに新しいデータを作成・更新・削除できる空間を指します。この言葉は、各コンテナがゼロから独立した空間を持っていることを表現しています。

コンテナの削除がなぜプルーン?

すべての停止しているコンテナを一度に削除するには、以下のコマンドを使用できます。

docker container prune

pruneという単語は、植物の枝を切り取ることを意味します。この言葉は、不要な部分を取り除くことを一般的に表すようになりました。Dockerでは、pruneコマンドを使用して、不要なリソースを削除できます。これには、停止したコンテナ、未使用のネットワーク、未使用のイメージ、ビルドキャッシュなどが含まれます。

docker container pruneコマンドの場合、停止したコンテナを削除することで、システム上の不要なリソースを取り除くことができます。これにより、ディスクスペースが節約され、システムの整理が容易になります。

pruneが選ばれた理由は、この単語が不要なものを取り除く一般的なアクションを表しているためです。Dockerのコンテキストでは、不要なリソースを削除する際にpruneが使用されます。

ボリュームマウント

+-------------+      +---------------------+
|             |      |                     |
| Host        +------+ Docker Volume Mount |
|             |      |                     |
+-------------+      +--------+------------+
                            |
+-------------+      +--------+------------+
|             |      |                     |
| Container 1 +------+ App data Directory |
|             |      |                     |
+-------------+      +---------------------+

ホストマシンとDockerボリュームマウントが接続されています。Dockerボリュームマウントは、アプリケーションデータディレクトリとしてコンテナ1内にマウントされています。

コンテナ1のアプリデータディレクトリ内でファイルが作成/更新/削除されると、それらの変更はホストマシンのDockerボリュームマウントにも反映されます。このようにして、データがホストマシンに永続化され、コンテナの再起動や削除後もデータが保持されます。

App data Directory?

アプリケーションデータディレクトリは、アプリケーションが実行中に生成、変更、または消費するデータを格納するための場所です。多くのアプリケーションでは、データディレクトリは重要であり、データの永続化やバックアップ、アプリケーションのアップグレードなどのタスクを行う際に役立ちます。

ボリューム マウントを指定してtodo アプリ コンテナーを起動

`docker run -dp 3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started` 

getting-started イメージから新しいコンテナを作成し、実行するためのコマンドです。それぞれのフラグとオプションについて説明します。

  • docker run: Dockerコンテナを作成して実行するコマンドです。
  • -d: コンテナをバックグラウンドで実行し、デタッチモード(非対話モード)で動作させるオプションです。
  • -p 3000:3000: ホストとコンテナ間でポートマッピングを行うオプションです。ここでは、ホストのポート3000をコンテナのポート3000にマッピングしています。
  • --mount: コンテナにボリュームやディレクトリをマウントするためのオプションです。
    • type=volume: マウントタイプとしてボリュームを使用しています。
    • src=todo-db: ボリュームのソース名として、todo-db を使用しています。
    • target=/etc/todos: コンテナ内でボリュームをマウントするターゲットパスとして、/etc/todos を指定しています。
  • getting-started: 実行するDockerイメージの名前です。

このコマンドを実行すると、getting-startedイメージからコンテナが作成され、バックグラウンドで実行されます。また、ホストのポート3000がコンテナのポート3000にマッピングされ、todo-dbボリュームがコンテナの/etc/todosディレクトリにマウントされます。これにより、アプリケーションデータがボリュームに保存され、コンテナが停止または削除されてもデータが保持されます。

ボリュームに飛び込む

ボリュームの保存場所を確認

docker volume inspect todo-db

6 バインド マウント

https://docs.docker.com/get-started/06_bind_mounts/

バインドマウントは、Dockerコンテナ内の特定のファイルシステムパスをホストマシンのディレクトリに直接接続する方法です。これにより、コンテナ内のディレクトリで行われた変更が、ホストマシンのディレクトリでリアルタイムに反映されます。

+-----------------+     +----------------------+
|   Host Machine  |     |   Docker Container   |
|                 |     |                      |
|  +-----------+  |<----|->/path/in/container/ |
|  |           |  |     |                      |
|  | Host Dir  |  |     |                      |
|  |           |  |     +----------------------+
|  +-----------+  |
+-----------------+

この図では、ホストマシンにある Host Dir ディレクトリが、Dockerコンテナ内の /path/in/container/ にバインドマウントされています。これにより、コンテナ内で行われたファイルの作成、更新、削除が、ホストマシンのディレクトリにも反映されます。また、ホストマシンのディレクトリで行われた変更も、コンテナ内にすぐに反映されます。これにより、開発時にソースコードの変更がリアルタイムでコンテナに適用されるなど、作業の効率が向上します。

ボリュームとバインドマウント

ボリューム (Volume) バインドマウント (Bind Mount)
概要 Dockerによって完全に管理されるストレージ。 ホストマシンのディレクトリをコンテナに直接マウント。
データの永続性 はい。ボリュームに書き込まれたデータは永続化される。 はい。ホストマシンのディレクトリに直接書き込まれる。
データの共有 コンテナ間で簡単に共有可能。 コンテナ間で共有するには、ホストマシンを経由する必要がある。
使用例 データベース、アプリケーションの設定ファイルなど。 開発中のソースコード、設定ファイルのリアルタイム編集。

nodemonプロセス?

nodemonは、Node.jsアプリケーションの開発時に非常に役立つユーティリティです。ソースコード内のファイルに変更があると、自動的にアプリケーションを再起動することができます。これにより、開発者は手動でアプリケーションを停止して再起動する手間を省くことができます。

nodemonプロセスは、アプリケーションのソースコードディレクトリを監視し、ファイルが更新されたり変更されたりすると、アプリケーションを再起動します。開発者は、自分の環境での変更をすぐに確認し、アプリケーションの動作を迅速にテストできるため、開発サイクルが効率的になります。

アプリを開発コンテナーで実行する

docker run -dp 3000:3000 `
    -w /app --mount type=bind,src="$(pwd)",target=/app `
    node:18-alpine `
    sh -c "yarn install && yarn run dev"

このコマンドは、DockerでNode.jsアプリケーションを実行するためのものです。それぞれのオプションとパラメータについて簡単に説明します。

  • docker run: Dockerコンテナを作成して実行するコマンドです。
  • -dp 3000:3000: -dはコンテナをバックグラウンドで実行し、-p 3000:3000はホストのポート3000をコンテナのポート3000にマッピングします。
  • -w /app: コンテナ内で実行するコマンドの作業ディレクトリを/appに設定します。
  • --mount type=bind,src="$(pwd)",target=/app: ホストマシンのカレントディレクトリ($(pwd))をコンテナ内の/appディレクトリにバインドマウントします。これにより、ホストとコンテナでファイルの変更がリアルタイムで同期されます。
  • node:18-alpine: このコマンドで使用されるDockerイメージで、Node.js v18がインストールされた軽量なAlpine Linuxベースのイメージです。
  • sh -c "yarn install && yarn run dev": コンテナ内で実行されるコマンドです。sh -cはシェルを使ってコマンドを実行します。yarn installで依存関係をインストールし、yarn run devで開発モードでアプリケーションを起動します。

このコマンドを実行すると、Node.jsアプリケーションが開発モードで実行され、ホストマシンとコンテナ間でファイルの変更が同期されるようになります。また、アプリケーションはホストマシンのポート3000でアクセスできるようになります。

これだけだと正常に起動しない?

$ docker run -dp 3000:3000 `
    -w /app --mount type=bind,src="$(pwd)",target=/app `
    node:18-alpine `

その通りです。このコマンドには、アプリケーションの依存関係をインストールし、開発モードでアプリケーションを起動するためのコマンドが含まれていません。そのため、正常に起動しません。

yarnコマンド

yarnは、JavaScriptプロジェクトでパッケージ管理とタスク実行を行うためのコマンドラインツールです。yarnは、主にNode.jsアプリケーションで使用され、npmと同様の機能を提供しますが、いくつかの違いがあります。yarnは、より高速で堅牢なパッケージ管理とインストールプロセスを提供することで知られています。

以下は、yarnコマンドの一般的な使用例です。

  • yarn init: 新しいプロジェクトを作成し、package.jsonファイルを生成します。
  • yarn add [package_name]: プロジェクトに新しい依存関係を追加し、package.jsonファイルを更新します。
  • yarn install: package.jsonファイルにリストされているすべての依存関係をインストールします。
  • yarn remove [package_name]: プロジェクトから依存関係を削除し、package.jsonファイルを更新します。
  • yarn run [script_name]: package.jsonファイルに定義されたスクリプトを実行します。

これらのコマンドを使用して、プロジェクトの依存関係を管理し、特定のタスクを実行できます。