dockerに入門してみる(その6)
2021年まであと少しですね。
前回の記事はこちら↓ ren-opdev.hatenablog.com
Bind Mountsを使う
前回は、名前付きボリュームを使いデータを保持しました。名前付きボリュームの利点は、どこにデータがあるのかを心配せずにデータを保持できる点ですね。 そのとき引用した画像を再掲します。
今回は、この画像の左側にある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の方が自由度が高いのかな…みたいに思えますね。
コンテナと共に開発する
では、実際の開発フローを模してコンテナを操作していきます。具体的には、
となります。
では、まず以下のコマンドよりコンテナを実行します。
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 install
とyarn 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がファイル差分を感知して、サーバーを再起動したことが分かります。
ソース修正後の状態をnodemonを利用して見ることができたところで、このチャプターは終わりです。 次のチャプターでは、production環境に向けてMySQLを操作する方法を勉強するようです。
年内に終わらせたい!
*1:Nodeベースのアプリケーション用ファイル差分監視ツール