dockerに入門してみる(その6)

2021年まであと少しですね。

前回の記事はこちら↓ ren-opdev.hatenablog.com

Bind Mountsを使う

前回は、名前付きボリュームを使いデータを保持しました。名前付きボリュームの利点は、どこにデータがあるのかを心配せずにデータを保持できる点ですね。 そのとき引用した画像を再掲します。

f:id:renkataoka:20201222005214p:plain
https://docs.docker.com/storage/volumes/ より

今回は、この画像の左側にあるbind mountという概念を勉強していきます。volumeは直接Filesystemの内部を参照しているのに対し、bind mountはFilesystemという単位を参照しているように見えます。

bind mountsはホスト上のマウントポイントをコントロールする概念で、データの保持にも使えますが、コンテナに何かデータを加える用途によく用いられるようです。
つまり、ソースを修正してその差分をコンテナにマウントすることができるようです。

名前付きボリュームとBind Mountsの比較

名前付きボリュームとBind Mountsは、それぞれDockerを利用する上で主要となるボリュームタイプです。他にも色々種類はありますが、ここで2つの比較を整理します。

名前付きボリューム Bind Mounts
ホスト上の場所 Dockerが選ぶ 自分で選ぶ
-vオプションを使用したマウントの例 my-volume:/usr/local/data /path/to/data:/usr/local/data
新しいボリュームにコンテナの中身を入力するか 入力する 入力しない
ボリュームドライバをサポートするか サポートする サポートしない

こうしてみると、Bind Mountsの方が自由度が高いのかな…みたいに思えますね。

コンテナと共に開発する

では、実際の開発フローを模してコンテナを操作していきます。具体的には、

  1. ソースコードをコンテナにマウントする。
  2. "dev" dependencies含め、すべての依存関係をインストールする。
  3. ファイルシステム監視のために、nodemon*1を起動する。

となります。

では、まず以下のコマンドよりコンテナを実行します。

docker run -dp 3000:3000 `
    -w /app -v "$(pwd):/app" `
    node:12-alpine `
    sh -c "yarn install && yarn run dev"

新出オプションの説明を下記にまとめます。

  • -w /app : /appを、コマンドを実行するワーキングディレクトリとして設定する。
  • -v "$(pwd):/app" : 現在のディレクトリを、コンテナ内のホストから/appディレクトリに bind mountする。
  • sh -c "yarn install && yarn run dev" : yarn installyarn run devというshellコマンドを実行する。

コンテナが出力するログを確認すると、nodemonが既に動いていることが分かります。

PS C:\Users\530lo\Documents\docker\tutorial\app\app> docker logs -f b3eedb11f9c4
yarn install v1.22.5
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@1.2.9: The platform "linux" is incompatible with this module.
info "fsevents@1.2.9" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
[4/4] Building fresh packages...
Done in 39.05s.
yarn run v1.22.5
$ nodemon src/index.js
[nodemon] 1.19.2
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] starting `node src/index.js`
Using sqlite database at /etc/todos/todo.db
Listening on port 3000

nodemonがファイル差分を監視していることが分かったので、ソースをいじってみます。
"Add Item"というボタンの文言を"Add"に変えます。

-                         {submitting ? 'Adding...' : 'Add Item'}
+                         {submitting ? 'Adding...' : 'Add'}

http://localhost:3000/ を更新してみると、ちゃんと変更が反映されていますね。 nodemonがファイル差分を感知して、サーバーを再起動したことが分かります。

f:id:renkataoka:20201229145223p:plain


ソース修正後の状態をnodemonを利用して見ることができたところで、このチャプターは終わりです。
次のチャプターでは、production環境に向けてMySQLを操作する方法を勉強するようです。

年内に終わらせたい!

*1:Nodeベースのアプリケーション用ファイル差分監視ツール