本稿は Docker+Nginx+ownCloud+SSLで構築したの続きである。 Docker Compose を使って、ポータブルな ownCloud 環境を構築する。

過去記事では生の docker コマンドを使って Nginx+ownCloud+PostgreSQL による NASシステムを構築したが、このときの方法では管理コストが大きく、 Docker を利用するメリットがあまり感じられなかった。

特にいけていなかったのは次の通り;

  • Nginx, ownCloud, PostgreSQL を Docker で順番に起動する必要がある。
  • ownCloud を再起動すると、Nginx も再起動しなければならない。
  • ボリュームとしてマウントしているホスト側ディレクトリに触ると容易に壊れる。

で、いろいろ遊んでいたら、案の定 ownCloud と PostgreSQL の整合性が崩れて あっさりシステム利用不可能になった。

そこで、本稿では復旧ついでに Docker Compose を使ってみた。

ちなみに、前回は Nginx+ownCloud+PostgreSQL で構築したが、 今回は Nginx+ownCloud+MariaDB で構築した。

ownCloud の公式を見たら、MySQL が推奨だといっていたのでそうしてみただけであり、 本題には特に関係ない。

ディレクトリ構造

簡単。owncloud/ はどこでもOK。

owncloud/
  + docker-compose.yml
  + nginx-proxy/
    + Dockerfile
	+ default.conf

Nginx のカスタム Dockerfile を作成する

カスタム版 default.conf 入りの Nginx の材料を書く。

% mkdir nginx-proxy
% cd nginx-proxy
% vi default.conf
% vi Dockerfile

default.conf の中身はこんな感じ。

  • 443番ポートで HTTPS を LISTEN する。
  • 80番ポートはガン無視。
  • Let’s Encrypt な証明書を参照させる。
  • ファイルアップロードは 100 GB まで許可。
% cat default.conf
server {
    listen       443;
    server_name  <ホスト名>;

    ssl on;

    ssl_certificate     /etc/letsencrypt/live/<ホスト名>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<ホスト名>/privkey.pem;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://owncloud/;

        client_max_body_size 100g;
    }
略
}

Dockerfile の中身はこんな感じ。

% cat Dockerfile
FROM nginx
COPY default.conf /etc/nginx/conf.d/default.conf

イメージの作成とかはあとで docker-compose コマンドをつかってやるので、 ここではやらなくていい。自信がなければ、 docker コマンドでやってみてもいい。

% docker build -t owncloud_nginx .
% docker run --rm -ti -p 80:80 -p 443:443 owncloud_nginx

的な。

Docker Compose の設定ファイルを作成する

docker-compose.yml を書くだけ。

% cd ..
% vi docker-compose.yml

こんな感じ。

% cat docker-compose.yml
version: '3'

services:
  mariadb:
    container_name: owncloud-mariadb
    image: mariadb:10.1.21
    volumes:
      - mariadb-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: <MYSQLのパスワード>
    restart: always
  owncloud:
    container_name: owncloud
    image: owncloud:latest
    links:
      - mariadb:mariadb
    volumes:
      - owncloud-data:/var/www/html
      - /house:/house
    depends_on:
      - mariadb
    restart: always
  nginx:
    container_name: owncloud-nginx-proxy
    build: ./nginx-proxy
    links:
      - owncloud:owncloud
    ports:
      - "443:443"
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt:ro
    depends_on:
      - owncloud
    restart: always

volumes:
  mariadb-data:
    driver: local
  owncloud-data:
    driver: local

データボリュームコンテナを使う。

前回、ボリュームにはホストOSのディレクトリを指定したが、 今度はデータボリュームコンテナを使う。

データボリュームコンテナはデータ格納専用の Docker コンテナである。 解説はどこかよそのもっと知っている方に譲るとして、要するに、 アプリケーションのデータを、アプリケーションのコンテナとは別の独立した コンテナに持たせる。そうすることで、

  • アプリケーション本体を綺麗でポータブルな状態に保ち、
  • アプリケーションのデータは永続化しつつ、
  • データのポータビリティも確保する

というテクニックである。

データボリュームコンテナは、docker-compose.yml のトップレベルに、 volumes を書くことで勝手に作成される。

今回は、MariaDB 向けに mariadb-data、 ownCloud 向けに owncloud-data を個別に用意した。

カスタム Dockerfile を使う

Dockerfile を指定するときは、 build: <Dockerfileのあるディレクトリへのパス> と書く。

これだけ。

あとは、前回 docker に渡していたものを、適当に直して移植した。

Nginx のイメージ作成

docker-compose.ymlbuild があると、自動的にイメージが作成される。

% docker-compose build

default.confDockerfile を編集し、再ビルドしたい場合にも、 ただ build するだけでよい。

MariaDB と ownCloud のイメージ取得

docker-compose.ymlimage があると、自動的にイメージを取得する。

% docker-compose pull

コンテナ起動

これもコマンド一発でやってくれる。

% docker-compose up -d

ここまでで、MariaDB、ownCloud、Nginx が立ち上がっているはず。

https://<サーバ名>/ にアクセスしてみて、 問題なく ownCloud の設定画面が表示されればめでたく完了である。

ownCloud の設定とかが知りたい方は前回の記事の該当部分を見たらいいと思う。

Docker+Nginx+ownCloud+SSLで構築した

今回の場合、初期設定は次のようにする。

  • user: 任意の管理ユーザ名
  • password: 任意の管理パスワード

  • login: root
  • password: docker-compose.ymlMYSQL_ROOT_PASSWORD に書いたパスワード
  • db: owncloud
  • hostname: mariadb

コンテナ終了

% docker-compose stop

イメージの削除

% docker-compose rm

ボリュームコンテナごと削除したい場合には、

% docker-compose rm -v

感想

Docker Compose 便利。

続き

大きなファイルをアップロードできない問題があったけど、続編で解決した。

参考