無認証 SMB を samba で秒で立ち上げる Dockerfile (& docker-compose)

Pocket

docker 上の Linux (alpine) で Samba を立ち上げ、 無認証の SMB 共有を開始する Dockerfile をメモっておく。

使用例

手っ取り早く実行したい場合、以下のような docker-compose.ymlDockerfile と同じフォルダに保存し、

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 が動くコンテナにアクセスする方法を、以下の記事に調べてまとめた。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください