docker 上の Linux (alpine) で Samba を立ち上げ、 無認証の SMB 共有を開始する Dockerfile をメモっておく。
使用例
手っ取り早く実行したい場合、以下のような docker-compose.yml
を Dockerfile
と同じフォルダに保存し、
version: '3'
services:
smb:
build: .
ports:
- 445:445
コマンドプロンプト等のターミナルで、以下のように実行する。
docker-compose build
docker-compose up
何に使うのか
docker でデータを永続化する際、 Bind Mounts を使えば、デスクトップ側にファイルが永続化されているため、そのまま永続化されたファイルを覗き見ることができる。
しかし、 Bind Mounts では一部の機能に制限があることから、 Volumes (Named Volumes, Anonymous Volumes) を使うこともあるだろう。
(とりわけ Windows デスクトップから Linux コンテナを使う場合、 ファイルシステムの違いから Bind Mounts だと期待しない動きに遭遇しやすい。)
このとき、 Volumes の中身を SMB で共有させるコンテナを起動させておくと、 デスクトップ側から Volumes の中身が簡単に見られるようになるので、開発や検証に便利になる。
(但し上記の手順だと、 認証などが一切なく、 ネットワーク内のだれからでもアクセスできるので、 実運用上では 別途認証やアクセス元の制限を加えるなど、注意は必要だ。)
Docker Desktop for Windows での回避策
ホスト側が Linux であったり、 Windows 上の Docker Toolbox であれば、上記の手順だけでも問題なく SMB 共有が実行されるだろう。
しかし、 ホスト側が Docker Desktop for Windows である場合は、 Windows とコンテナの間で 445 ポートが競合してしまい、 以下のようなエラーが出て起動に失敗するはずだ。
ERROR: for smb Cannot start service smb: Ports are not available: listen tcp 0.0.0.0:445: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
ERROR: Encountered errors while bringing up the project.
SMB は他のポートではアクセスができない。
また、 Docker Desktop for Windows では、 Windows デスクトップにポートフォワーディングせずに、 Hyper-V 上の Linux のホストマシンにアクセスする方法が用意されていない。
このため、コンテナの SMB 共有させたければ Docker Desktop を起動している Windows 側の SMB を止めるしかない。
上記の記事にあるように、 Windows 側で Server
サービスを止め、無効化した後に OS を再起動すると、 445 ポートが空く。
この状態で、 docker-compose up
すれば、エラーなく実行できるだろう。
ただ、ファイル共有をはじめとする様々な機能が Windows 側で動かなくなるだろうが。。。
(ということもあり、あまりオススメできる方法ではない。)
残念ながら、 WSL ベースの Docker Desktop for Windows では、 Server
サービスが必須となるため、これを停止できない。
このため、 localhost の 445 ポートを使わずに SMB が動くコンテナにアクセスする方法を、以下の記事に調べてまとめた。