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とかならそれぞれコンテナ建ててなにかしらのファイル共有したいとかありそうだし.

おつ.