docker
ownCloud

ownCloud の Docker コンテナを作る

More than 3 years have passed since last update.

ローカルで自分用の ownCloud が欲しくなったので docker コンテナとして用意してみました。

わざわざ自作しなくても DockerHub に沢山 ownCloud パッケージが存在しているのですが、細かいところを自分用にカスタマイズしたいというのと、コンテナ作成の練習も兼ねて作ってみた次第。


作りたいもの

要求策定。


  1. httpd を含んで ownCloud が動作する Docker コンテナ

  2. DB は基本外部の Mysql を使用するが単体で動作するように sqlite3 も含む

  3. データフォルダはボリュームとしてホストのディレクトリを利用できる

  4. ログ、コンフィグ、一時ファイルはボリュームにして永続化できる

  5. 新しいバージョンをコンテナで提供しても以前の環境が残る

  6. SSL https を提供する

  7. SSL キーはボリュームで提供する(=コンテナに含まず交換ができる)

こんなところ。


制作

Debian/wheezy をベースに backports を利用して、ownCloud 7.0.2 のパッケージをインストールする。


Dockerfile

最終的にこんな感じに


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 設定は以下のような感じで


owncloud.conf

<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 は以下の様になります。


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/ をつけるのを忘れないで下さい。