dockerのマウント(Volume)についての勉強メモ.
content
マウントとは
dockerコンテナは再起動のたびに消失してしまうので,
DBとかのデータの永続化が必要な場合にホストOSの上に保存領域を置く(マウントする)てきなもの.
ただ,
- 書き方, 設定方法等
- コンテナ側のマウントしているディレクトリを更新する側からディレクトリを更新するとホストOSに反映されるのか
- ホストOSのマウントされているディレクトリを更新するとコンテナに反映されるのか
とかとか, 色々よく知らないのでお試ししてみる
プロジェクト作成
最小構成のflask appでお試し.
リポジトリは ここ .
flask app
# server.py
from flask import Flask, render_template
app = Flask(__name__,
template_folder='/templates',
static_folder='/templates/static'
)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True, host='127.0.0.1', port=5000)
元となるflaskアプリがこれ.
templatesを置くディレクトリを, コンテナのルート直下にマウントする想定(なので逆にローカルでは動かない)
docker-compose.yml
volumesに,
ホストOS:コンテナ
で羅列してあげてマウントを行う.
version: "3.7"
services:
uwsgi:
build: ./myapp
container_name: uwsgi
restart: always
expose:
- 8080
volumes:
- ./templates:/templates
nginx:
build: ./nginx
container_name: nginx
restart: always
ports:
- "80:80"
つまり, docker-compose.ymlと同ディレクトリに設置されているtemplatesディレクトリがコンテナのルート直下にマウントされることになる.
起動してみる.
$ docker-compose build
$ docker-compose up -d
にアクセスすると, 正しくページが表示されたのでマウントできていることがわかる.
ホストOSのtemplatesを更新してみる
index.htmlに, 適当な文章を追加してブラウザを再確認してみる.
きちんと更新されている.
コンテナからtemplatesを更新してみる
エディタが入ってないので, とりあえずファイルを作るだけ.
$ echo "This is updated from Container!" > /tempaltes/page2.html
ホストOSのtemplatesを覗いてみるとpage2.htmlが追加されていた.
どうやらちゃんと双方向に同期づけがされてるらしい…
ならCOPYとかで設置するよりマウントしてしまったほうが別コンテナとの連携も容易だし, 開発中にリアルタイムで更新を確認できるしかなり良い気がするけど,
通信挟むから性能が落ちたりするのかな…
複数のコンテナ間でのマウント
次はホストOSの一つのディレクトリを, 複数コンテナにマウントすることができるのか確認.
version: "3.7"
services:
uwsgi:
build: ./myapp
container_name: uwsgi
restart: always
expose:
- 8080
volumes:
- ./templates:/templates
nginx:
build: ./nginx
container_name: nginx
restart: always
ports:
- "80:80"
volumes:
- ./templates:/templates
起動は無事できたので色々いじってみたけど結論から言うと, どこからファイルを更新しようが全てのコンテナとホストOSに反映された.
volumeというとデータの永続化で語られることが多い気がするけど, ただただコンテナやOS間のファイル同期として使っても便利な気がするけどあまり良くないのかな.
SPA + RestAPIとかならそれぞれコンテナ建ててなにかしらのファイル共有したいとかありそうだし.
おつ.