ownCloud の Docker コンテナを作る

ローカルで自分用の 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: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 設定は以下のような感じで

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

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