ローカルで自分用の ownCloud が欲しくなったので docker コンテナとして用意してみました。
わざわざ自作しなくても DockerHub に沢山 ownCloud パッケージが存在しているのですが、細かいところを自分用にカスタマイズしたいというのと、コンテナ作成の練習も兼ねて作ってみた次第。
作りたいもの
要求策定。
- httpd を含んで ownCloud が動作する Docker コンテナ
- DB は基本外部の Mysql を使用するが単体で動作するように sqlite3 も含む
- データフォルダはボリュームとしてホストのディレクトリを利用できる
- ログ、コンフィグ、一時ファイルはボリュームにして永続化できる
- 新しいバージョンをコンテナで提供しても以前の環境が残る
- SSL https を提供する
- SSL キーはボリュームで提供する(=コンテナに含まず交換ができる)
こんなところ。
制作
Debian/wheezy をベースに backports を利用して、ownCloud 7.0.2 のパッケージをインストールする。
Dockerfile
最終的にこんな感じに
FROM debian:wheezy
MAINTAINER rerofumi
RUN echo 'deb http://ftp.jp.debian.org/debian/ wheezy main' > /etc/apt/sources.list
RUN echo 'deb http://ftp.jp.debian.org/debian/ wheezy-updates main' >> /etc/apt/sources.list
RUN echo 'deb http://security.debian.org/ wheezy/updates main' >> /etc/apt/sources.list
RUN echo 'deb http://ftp.jp.debian.org/debian/ wheezy-backports main contrib non-free' >> /etc/apt/sources.list
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update; \
apt-get -y upgrade; \
apt-get -y dist-upgrade; \
apt-get -y -t wheezy-backports upgrade; \
apt-get -y -t wheezy-backports dist-upgrade; \
apt-get -y -t wheezy-backports install owncloud sqlite3 php5-sqlite php5-mysql; \
apt-get clean; \
rm -rf /var/lib/apt/lists/*
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ADD owncloud.conf /etc/apache2/sites-available/
RUN rm -rf /etc/owncloud/*
RUN mkdir -p /etc/ssl/local
RUN a2enmod ssl
RUN a2enmod rewrite
RUN a2enmod headers
RUN a2ensite owncloud.conf
VOLUME ["/etc/owncloud","/etc/ssl/local","/var/lib/owncloud/data","/var/lib/php5","/var/log/apache2"]
EXPOSE 443
CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
apache を含んだアプリは大体こんな感じでテンプレート化してきた感じ。
apache 設定
Dockerfile の途中で Add している apache 設定は以下のような感じで
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
SSLEngine on
SSLCertificateFile /etc/ssl/local/mykey.crt
SSLCertificateKeyFile /etc/ssl/local/mykey.key
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
ErrorLog ${APACHE_LOG_DIR}/ssl_error.log
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
Alias /owncloud /usr/share/owncloud
<Directory /usr/share/owncloud>
Options FollowSymLinks
<IfModule mod_php5.c>
php_flag register_globals off
</IfModule>
<IfModule mod_dir.c>
DirectoryIndex index.php
</IfModule>
</Directory>
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>
SSL鍵とかログとかのパスを、Dockerfile のボリュームに合わせる。
ホスト側の環境
Dockerfile の VOLUME を見るとわかるように、5つのホスト側ディレクトリをボリュームとしてマウントしてあげる必要があります。
この中では SSL鍵の /etc/ssl/local
以外は設定しなくてもコンテナの UnionFS 内のものを利用しますので起動させることができます。逆に言うと SSL鍵を用意してボリュームとしてマウントしないとこのコンテナは起動しません。
Dockerコンテナ起動用を fig で行う場合、fig.yml は以下の様になります。
owncloud:
image: rerofumi/owncloud
volumes:
- /var/opt/container/owncloud/data:/var/lib/owncloud/data
- /var/opt/container/owncloud/log:/var/log/apache2
- /var/opt/container/owncloud/key:/etc/ssl/local
- /var/opt/container/owncloud/session:/var/lib/php5
- /var/opt/container/owncloud/config:/etc/owncloud
ports:
- 8089:443
この例ではコンテナ用のボリュームを /var/opt/container/owncloud/ にまとめてあります。
注意事項
上記 fig では port 8089 にバインドしているので、起動したあとは https://llocalhost:8089/owncloud/
にアクセスすると、コンテナ内の ownCloud にアクセスできます。
/owncloud/ をつけるのを忘れないで下さい。