docker 上の Linux (alpine) で Samba を立ち上げ、 無認証の SMB 共有を開始する Dockerfile をメモっておく。
https://gist.github.com/advanceboy/a315d83d900929103d858a461b673e52
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.yml
を Dockerfile
と同じフォルダに保存し、
```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 の中身が簡単に見られるようになるので、開発や検証に便利になる。
(但し上記の手順だと、 認証などが一切なく、 ネットワーク内のだれからでもアクセスできるので、 実運用上では 別途認証やアクセス元の制限を加えるなど、注意は必要だ。)
ホスト側が 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"]
上記の記事にあるように、 Windows 側で Server
サービスを止め、無効化した後に OS を再起動すると、 445 ポートが空く。
この状態で、 docker-compose up
すれば、エラーなく実行できるだろう。
ただ、ファイル共有をはじめとする様々な機能が Windows 側で動かなくなるだろうが。。。
(ということもあり、あまりオススメできる方法ではない。)
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント