Dockerがよくわからず就職難民になりかけたおじさんが復習に燃えてsambaを無駄にコンテナで立ち上げる話。
大人しくdperson/samba使えって?そりゃ楽だけど、万人に便利ってことは、それだけ無駄があるって事ですよ!!
※以下、セキュリティ的な厳しさとかは気にせず、取り敢えず見えればいいやというスタンスでの設定です
環境
# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
# uname -r
4.11.3-1.el7.elrepo.x86_64
# docker version -f "{{.Server.Version}} : {{.Client.Version}}"
17.03.1-ce : 17.03.1-ce
Dockerfile作る
完成した料理はこちらです。
1 FROM centos:7
2 MAINTAINER hasegit
3 RUN yum -y install samba
4 RUN yum -y install ed
5 RUN useradd -m -d /chamba chamba
6 RUN echo -e 'chamba\nchamba' | pdbedit -a -u chamba
7 RUN echo -e '\
8 /workgroup\n\
9 s/SAMBA/WORKGROUP\n\
10 $\n\
11 a\n\
12 [share]\n\
13 path = /share\n\
14 read only = no\n\
15 guest ok = no\n\
16 valid users = chamba\n\
17 .\n\
18 w\n\
19 q\n' | ed /etc/samba/smb.conf
20 CMD [ "bash", "-c", "nmbd -D && smbd -F </dev/null" ]
Dockerfileの解説
- debianあまり触らないのでcent君にしました。(dperson/sambaはそれが嫌だったというのも...)
- edは使わずにCOPYなりADDなりでもいいんですが、極力Dockerfileだけで閉じたかったので。
- sambaにアクセスするためのユーザーはchambaにしてます。他のユーザーがよければここ変える。
- echo -eでpdbeditのpassword確認を自動入力します。
7-19) edのコマンドをecho -eで噛ませて、無理矢理smb.conf編集してます。やっぱりedは最強。 - 共有ディレクトリは/shareとしています。他のディレクトリを共有するならここ変える。
- コンテナ起動後にnmbdとsmbdを起動してます。ここではまった。
コンテナ起動まで
1. イメージを作成
# docker build -t samba <Dockerfileのあるディレクトリ>
-tでイメージ名(リポジトリ)をsambaにしてます。わかりゃなんでもいいです。
2. イメージ確認
# docker images samba
3. ポートの穴開け
# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="samba" accept'
CentOS7からはiptablesではなくfirewalldがデフォルトなので、一応そちらで設定してみます。
4. 起動
docker run -d -p 139:139 -p 445:445 -v /share:/share samba
-dでDetached Modeで起動(バックグラウンドで動きます)。
-pでポートフォワーディング。
-vでホスト側ディレクトリ(左)をコンテナ側のディレクトリ(右)でマウント。
最後はイメージ名。
以上を実施後、Windows機から共有にchambaで走れればOKです。
余談:ハマったところ
- smbd即死
当初、nmbdとsmbdをどうやってコンテナ起動後に生かしっぱなしにしておくのかが分からなかった。
-Dでデーモン小暮化してもすぐコンテナ死ぬし。
ていうかコマンドがForegroundで動いてないと死ぬというDockerルールを知らなかった。
じゃあsmbd -Fにすればいいんかい、と思ったら、これがまた死ぬ。
ログを見てみたら、Terminatedされていた...。
# docker logs 2c4a5b2b5755f53276d088acc4b65d7f32369588026aef320c2d5d3f0bcbb131
bash: line 1: 9 Terminated smbd -F
で、もうよくわからないんで、dperson/sambaを(結局)参考にして"smbd -F </dev/null"にしたら、なんと動いた。
dockerは起動後に標準入力が無くなっちゃう?ので、/dev/nullで標準入力をキープしないとsmbdが落ちてしまうんだろうか。
ここは結局謎のまま...。(nginxはdaemon offでいけるっぽいですね...sambaも見習って...)
- Windowsからアクセス出来無い
正直に言います。最初余りにもワケわからないので、dperson/samba使いました。結果、うまくいきました。
で、その後がちゃがちゃいじって、いざ自前のコンテナ起動してみたら、案の定Windowsからアクセス不可。
まぁそんなもんだよねと、dperson/sambaに戻してみたら...繋がらない。
どっか変なファイルいじってしまったか!?SELinuxとかいじらないとダメなのか!?と小一時間。
...何のことはない、ダメな時の接続が残っちゃってただけでした。
なんかおかしいと思ったら、net use
実行!!