はじめに
Raspberry PiをNASにするため,Dockerでsambaを立ち上げるべく,Alpine Linuxをベースイメージとして,(たぶん)軽量なイメージを作成してみました↓↓
Dockerでsambaを動かす場合はdperson/sambaが有名ですが,今回は勉強もかねてすべて自分でDockerfileを書いてみました.
環境
Raspberry Piで動かします。
- マシン: Raspberry Pi 3B+
- OS: hypriot OS
$ docker --version
Docker version 19.03.5, build 633a0ea
つくるもの
機能は単純に高望みせず,以下のような物を目指します.
- ユーザのホームディレクトリを共有
- 軽量にするためベースイメージはAlpine Linux
- あくまで個人利用目的で複数ユーザ、セキュリティは考慮しない
つくったもの
構成は、
- Dockerfile
- smb.conf
- start_samba_system.sh
の3ファイルです。
smb.confはbuild時にイメージに取り込まれ、デフォルトのsmb.confと置き換えられます。また、start_samba_system.shはsamba起動スクリプトです.
Dockerfile
FROM alpine:3.9
MAINTAINER HoriThe3rd
ENV USERNAME="name" \
PASSWD="weak_passwd"
RUN apk update && apk --no-cache add samba
COPY ./smb.conf /etc/samba/
COPY ./start_samba_system.sh /usr/local/bin
RUN chmod 775 /usr/local/bin/start_samba_system.sh
EXPOSE 139 445
ENTRYPOINT [ "/bin/ash" ]
CMD [ "/usr/local/bin/start_samba_system.sh" ]
コンテナ起動時は、ENTRYPOINTで/bin/ashを呼び出し、CMDでstart_samba_system.shを走らせています.
このシェルスクリプト内で環境変数USERNAMEとPASSWDを使ってsambaユーザを作成し,sambaを起動します.docker run時に環境変数を設定することで任意のユーザ名とパスワードに対応します.
なお、Alpine Linuxを用いているので、シェルはbashではなくashが標準です。
samba起動スクリプト
ユーザの作成を行った後にsambaを起動しています.
シェバンが#!/bin/ashになっています.
# !/bin/ash
# Create an account
adduser -D $USERNAME
echo $USERNAME':'$PASSWD | chpasswd
echo -e $PASSWD'\n'$PASSWD | pdbedit -a -u $USERNAME
# Start daemons
nmbd restart -D
smbd restart -FS </dev/null
最後の行の</dev/nullはコンテナを起動した瞬間にexitedとなってしまうのを防ぐために入れています.こちらの記事を参考にさせていただきました.
Dockerでイメージ作成してsamba立ち上げる
smb.conf
ホームディレクトリを共有する設定をしたものを配置しました.
[homes]
comment = Home Directories
browseable = no
writable = yes
ビルド
Dockerfileのあるディレクトリでビルドします。
docker build -t mysamba:1.0 .
ビルド後のimageのサイズは、私の環境で32.1 MBと思いの外軽量に出来あがりました。dockerhubで有名なdperson/sambaが200 MB以上だったので大幅に軽くなっています。
もちろん、今回作成したものは必要最低限の構成なので、この比較はあくまで参考値とお考えください。
ラズパイのようなリソースの少ないマシンでは特に小型なのは助かります。
Run
自分でビルドしない場合は,次の"Dockerhubからダウンロードして実行する場合"を使ってください.
コンテナの/home/USERNAME/以下がsambaで共有されるので、-vオプションなどでホストのストレージと同期するようにして起動します。--restart=alwaysで再起動時に起動するようにしています。
docker run -d -p 139:139 -p 445:445 --name smb --restart=always -v <host path>:/home/USERNAME -e USERNAME="<your_name>" -e PASSWD="<your_pw>" mysamba:1.0
Dockerhubからダウンロードして実行する場合
Dockerhubにイメージをpushしていますので,以下のコマンドで実行できます.
ラズパイで実行する場合は,rpiタグで使用できます.latestはアーキテクチャがamd64なので通常のマシン用です(試していませんが・・・).
docker run -d -p 139:139 -p 445:445 --name smb --restart=always -v <host path>:/home/USERNAME -e USERNAME="<your_name>" -e PASSWD="<your_pw>" horithe3rd/lw_samba:rpi
おわりに
実際にDockerfileを手書きしてなかなか勉強になりました.
Alpine Linuxを用いることでかなり軽量なsambaイメージを作成することができました.ラズパイのようにリソースが少ないマシンで扱うにはやはりCentOSやUbuntuをベースにすると重たくなってしまうのでAlpine Linuxが便利ですね.
なお,今回作成したイメージはセキュリティなどは全く考えていないので,何かあっても作者は責任は取らないことはお約束です・・・