はじめに
こんにちは!ITスクールRareTECHにてCS(Customer Support)を担当している池村です。今回の記事はDockerのストレージの仕組みであるバインドマウントについてご紹介します。正直これが一番使う気がしますね。
シリーズ記事なので、まず先に以下の記事を読んでいただけますと幸いです。
バインドマウント
バインドマウントは前回の記事のDockerAreaに作成するボリュームと違って、ご自身のPCの指定したディレクトリとデータを連携するマウント方法です。
Webアプリなどをローカルで作成する場合、やはりこのマウントを使うことが多く、ローカルの環境とコンテナ内のディレクトリを連携することで、リアルタイムにコンテナ内で動くコードを更新できます。
マウントしてみる
まずはUbuntuを使って、ローカルのディレクトリ以下をコンテナ内の指定の場所にマウントしてみます。
今回作っておいたディレクトリの環境は以下です。
./test
├── tas.rs
├── test.go
├── test.py
├── test.rb
└── test.sh
1 directory, 5 files
docker run -it -v ./test:/home/ubuntu/ ubuntu
今回はtest
というディレクトリがある場所でdockerを起動しました。
コンテナ内の/home/ubuntu/
以下のディレクトリにローカル内のtest
内のファイルをマウントします。
無事マウントされて全てのファイルがコンテナ内にコピーされています。
ファイルの内容を変更してみる
ではコンテナ内にあるファイルと、ローカルにあるファイル、同じファイルをどちらからも変更してみます。まずはコンテナ内からファイルを変更してみます。
echo 'print("Hello")' >> test.py
cat test.py
コンテナ内でファイルの内容を変更したら、ローカルのファイルの中身を確認してみましょう。以下の画像の場合、上がコンテナ内、したがコンテナ外です。
コンテナ内で変更した1行のPythonのプログラムがコンテナ外でも反映されています。
もちろん反対にコンテナ外からファイルを変更しても反映されます。
これはいろいろ使えそうですね。では次にコンテナの中で簡単なWebサーバーでも動かしてみましょう!
ローカルのWebサーバープログラムをコンテナの中で起動
では実際に簡単なコードを使って、コンテナの中でプログラムを動かしてみます。
正直言いますと、Dockerfileというものを使った方が早いのですが、今回はいろいろ手動でやっていきます。
この前に立ち上げていたコンテナは一度止めて削除しておきましょう。
ローカルのtest.py
を書き換える
from http.server import HTTPServer, BaseHTTPRequestHandler
class TestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write(b"Hello World")
HOST = "0.0.0.0"
PORT = 8000
with HTTPServer((HOST, PORT), TestHandler) as httpd:
print(f"Serving on http://0.0.0.0:8000")
httpd.serve_forever()
今回はFlaskなども使わず、生のPythonでサーバーを立ち上げます。
コンテナを立ち上げて環境構築を行う
docker run -it -v ./test:/home/ubuntu/ -p 8000:8000 ubuntu
-p
と8000:8000
はDockerのネットワークに関係してきますが、今回は説明を省きます。今後詳しく解説する記事も書きます。
以下のコマンドを順番にコンテナの中で叩いていきましょう。
apt update
apt install -y python3 python3-pip
python3 --version
python3 test.py
Serving on http://0.0.0.0:8000
これのPythonのサーバーがうまく立ち上がっていないのであれば、マウントされている場所が違っている可能性が高いです。見直しましょう。
ブラウザで確認
ブラウザを開いて、以下のURLを叩いてください。
http://localhost:8000
コードの変更をした場合の挙動について
例えばローカルのコードを変更した場合、マウント先のコンテナの中のファイルも変更はされますが、サーバーを起動した状態では前の状態のままブラウザに表示されます。
今回は生のPythonでサーバーを立ち上げているため、例えば以下のような変更をしたとして解説します。
self.wfile.write(b"Hello World")
⬇️
self.wfile.write(b"Hello World!!")
この場合、まずはサーバーをCtrl + Cで停止して、再度立ち上げます。
そうすることで反映がされます。生のPythonの場合はwatchdog
と呼ばれるライブラリを入れることで、コードが変更されたことをキャッチしてサーバーを再起動してくれるようなものもあります。
Flaskなどのフレームワークを使っている場合は、debug=True
にしておくと勝手にやってくれます。
フレームワークを使うことが当たり前になっている現在、watchdog
の使い方に需要はない気もするので解説は省かせていただきます。
おわりに
読了ありがとうございます。
バインドマウントはWebアプリを開発する際にかなり使われるマウント方法です。
ここはしっかり押さえていきたいですね。
次はDockerのネットワークについて記事にする予定です。
読んでくれている皆様、ありがとうございます!
余談
皆様、学習お疲れ様です。勉強は楽しいですね!(学習初期は苦しかった思い出しかないですが😂)
自分自身、Dockerfileを使わずに環境構築を久々に行ったのでとてもいい復習になりました。結局やっていることは一緒ですが。もちろん生のPythonでサーバーを立ち上げるのも同様です。
フレームワークに頼りきってるな〜って反省です。。