家にCentOSでNASといってもRAID構成はしていない簡易的なものがあるのですが、DockerでReadyMediaを起動してみました。
ホストにインストールしてもよかったのですが、FFmpegって外部レポジトリ参照したり依存物も多くてできればゲストとして動かしたいというのが動機です。
つい先日までCentOS6.6で動かしていたのですが、Dockerをよく使うのでCentOS7.1へアップデートしていました。
DLNAといえばMediaTombだったのですが最近更新が止まっているのかCentOS7.1ではうまくコンパイルできなかったので、ReadyMediaをインストールすることにしました。
FFmpegをインストールするとき、自分でコンパイルするか外部レポジトリを使うかでいろいろやり方があるのですが、nux-dextopのレポジトリからインストールする方法にしました。
自分で、FFmpegのインストールオプション等を調整したいという方はソースからのインストールのほうがより細かく調整できます。
今回は、DockerのゲストOSとして起動するのでyumでお手軽にインストールします。
Dockerコンテナに含めるファイル
start.sh
[bash]
#!/bin/bash
if [ ! -e /etc/sysctl.d/readymedia.conf ]; then
echo "fs.inotify.max_user_watches = 100000" >> /etc/sysctl.d/readymedia.conf
sysctl -p
fi
/usr/local/sbin/minidlnad -d
[/bash]
ReadyMediaのリストに表示させるメディアの数が8192より多いと、それ以上ファイルを追加できないので、fs.inotify.max_user_watchesの数を100000に変更しています。
8192より少ない場合は指定しなくてもよいと思います。sysctlの設定を変更する場合はDockerのrun時に--privilegedを指定する必要があり、Dockerにより権限を与えることになるので。
minidlna.conf
[bash]
# port for HTTP (descriptions, SOAP, media transfer) traffic
port=8200
# network interfaces to serve, comma delimited
#network_interface=eth0
# specify the user account name or uid to run as
#user=jmaggard
# set this to the directory you want scanned.
# * if you want multiple directories, you can have multiple media_dir= lines
# * if you want to restrict a media_dir to specific content types, you
# can prepend the types, followed by a comma, to the directory:
# + "A" for audio (eg. media_dir=A,/home/jmaggard/Music)
# + "V" for video (eg. media_dir=V,/home/jmaggard/Videos)
# + "P" for images (eg. media_dir=P,/home/jmaggard/Pictures)
# + "PV" for pictures and video (eg. media_dir=PV,/home/jmaggard/digital_camera)
media_dir=A,/media/audio
media_dir=V,/media/video
media_dir=P,/media/picture
# set this to merge all media_dir base contents into the root container
# note: the default is no
#merge_media_dirs=no
# set this if you want to customize the name that shows up on your clients
friendly_name=DLNA Server
# set this if you would like to specify the directory where you want MiniDLNA to store its database and album art cache
#db_dir=/var/cache/minidlna
# set this if you would like to specify the directory where you want MiniDLNA to store its log file
#log_dir=/var/log
# set this to change the verbosity of the information that is logged
# each section can use a different level: off, fatal, error, warn, info, or debug
#log_level=general,artwork,database,inotify,scanner,metadata,http,ssdp,tivo=warn
# this should be a list of file names to check for when searching for album art
# note: names should be delimited with a forward slash ("/")
album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg
# set this to no to disable inotify monitoring to automatically discover new files
# note: the default is yes
inotify=yes
# set this to yes to enable support for streaming .jpg and .mp3 files to a TiVo supporting HMO
enable_tivo=no
# set this to strictly adhere to DLNA standards.
# * This will allow server-side downscaling of very large JPEG images,
# which may hurt JPEG serving performance on (at least) Sony DLNA products.
strict_dlna=no
# default presentation url is http address on port 80
#presentation_url=http://www.mylan/index.php
# notify interval in seconds. default is 895 seconds.
notify_interval=900
# serial and model number the daemon will report to clients
# in its XML description
serial=12345678
model_number=1
# specify the path to the MiniSSDPd socket
#minissdpdsocket=/var/run/minissdpd.sock
# use different container as root of the tree
# possible values:
# + "." - use standard container (this is the default)
# + "B" - "Browse Directory"
# + "M" - "Music"
# + "V" - "Video"
# + "P" - "Pictures"
# + Or, you can specify the ObjectID of your desired root container (eg. 1$F for Music/Playlists)
# if you specify "B" and client device is audio-only then "Music/Folders" will be used as root
#root_container=.
# always force SortCriteria to this value, regardless of the SortCriteria passed by the client
#force_sort_criteria=+upnp:class,+upnp:originalTrackNumber,+dc:title
# maximum number of simultaneous connections
# note: many clients open several simultaneous connections while streaming
#max_connections=50
[/bash]
今回の設定では、cacheファイルをホストディレクトリに配置してdocker run時にホストディレクトリをマウントします。
またメディアファイルはコンテナ上からは/media/{audio,video,picture}として、docker run時にホストディレクトリをマウントします。
その他の設定は基本デフォルトだと思います・・・。
Dockerfileの内容
[bash]
FROM centos:centos7
RUN yum -y update \
&& ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN yum -y groupinstall "Development Tools" \
&& yum -y install git \
&& yum -y install libjpeg-turbo-devel libid3tag-devel libogg-devel libvorbis-devel flac-libs flac-devel wget sqlite-devel libexif-devel
RUN yum -y install git vim \
&& yum -y install epel-release \
&& yum -y localinstall http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm \
&& yum -y install ffmpeg ffmpeg-devel
RUN cd /usr/local/src \
&& wget -O minidlna-1.1.5.tar.gz "http://downloads.sourceforge.net/project/minidlna/minidlna/1.1.5/minidlna-1.1.5.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fminidlna%2F&ts=1449585164&use_mirror=jaist" \
&& tar zxf minidlna-1.1.5.tar.gz \
&& cd minidlna-1.1.5 \
&& ./configure && make && make install
ADD minidlna.conf /etc/
RUN echo '/usr/local/lib' > /etc/ld.so.conf.d/minidlna.conf \
&& ldconfig
ADD start.sh /
RUN chmod +x /start.sh
CMD /start.sh
[/bash]
ReadyMediaコンテナの起動
[bash]
# build
docker build -t readymedia .
# run
docker run -d -it \
--net=host \
--privileged \
-v /datafs/docker/readymedia/cache:/var/cache/minidlna \
-v /datafs/dlna:/media \
--name readymedia \
readymedia
[/bash]
ビルドして起動します。docker ps等でreadymediaが表示されていれば起動はしていると思います。
あとはDLNAクライアントで表示できれば問題ないと思います。
家の環境ではPS3とMacのVLCで再生できました。