2020-06-23に更新

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

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

FROM alpine:3.10

RUN mkdir -p /samba/share && \
    chmod -R 0777 /samba/share && \
    chown -R nobody:nobody /samba/share

# install samba
RUN apk update && \
    apk add samba
RUN { \
    echo "[global]"; \
    echo "  security = user"; \
    echo "  map to guest = Bad User"; \
    echo "  guest account = nobody"; \
    echo "  min protocol = SMB2"; \
    echo "[public]"; \
    echo "  path = /samba/share"; \
    echo "  writable = yes"; \
    echo "  guest ok = yes"; \
    echo "  guest only = yes"; \
    echo "  create mode = 0666"; \
    echo "  directory mode = 0777"; \
} > /etc/samba/smb.conf
EXPOSE 139 445

# start smbd as foreground
ENTRYPOINT ["/bin/ash"]
CMD ["-c", "nmbd restart -D && smbd restart -FS --no-process-group </dev/null"]

使用例

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

```yaml:docker-compose.yml
version: '3'
services:
smb:
build: .
ports:
- 445:445


コマンドプロンプト等のターミナルで、以下のように実行する。 ```bash 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 を止めるしかない。

[blogcard url="http://sangosthi.blogspot.com/2011/03/how-to-disable-cifssmb-port-445-on.html"]

2002_docker_samba_smb-01.png

上記の記事にあるように、 Windows 側で Server サービスを止め、無効化した後に OS を再起動すると、 445 ポートが空く。
この状態で、 docker-compose up すれば、エラーなく実行できるだろう。
ただ、ファイル共有をはじめとする様々な機能が Windows 側で動かなくなるだろうが。。。
(ということもあり、あまりオススメできる方法ではない。)

Originally published at aquasoftware.net
ツイッターでシェア
みんなに共有、忘れないようにメモ

advanceboy

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!
ボードとは?

関連記事

コメント