らくがきちょう

なんとなく

Docker で SSL/TLS 化された BitBucket と ownCloud を簡単に構築する

GitBucket を使うと Git リポジトリを、ownCloud を使うと DropBox クローンを利用することが出来ます。「各々を構築する」ことは当然可能ですが、Docker コンテナを利用すると構築の手間を大幅に省けます。コンテナを利用することは一長一短ですが、「構築の手間が省ける」以外にも「最新バージョンのコンテナが提供されたら、古いコンテナは廃棄して新しいコンテナに差し替えるだけで OK」といったメリットもあります (その場合、データをコンテナの外部へ保存するようにしておく必要があります)。

しかし、BitBucket と ownCloud を同じサーバで提供しようとする場合、「GitBucket 用のコンテナは TCP/80 で、ownCloud 用のコンテナは TCP/8080 で…」といった具合にポート番号を分けて運用する、といった工夫が必要になってしまいます。これはフロントに nginx-proxy を用意し、クライアントがアクセスしてきた FQDN に応じて通信を適切なコンテナに転送することで解消することが出来ます。また、昨今では Web サイトを SSL/TLS 化するケースが増えていますが、これも専用のコンテナを使うことで簡単にサーバ証明書の取得や更新を自動化することが出来ます。

目次

Docker のインストール

まず最初に Docker をインストールします。

curl -fsSL https://get.docker.com/ | sh

インストールが完了したら起動/自動起動の設定をしておきます。また、Docker を一般ユーザでも実行出来るように、該当ユーザを docker グループに追加しておきます。

sudo systemctl start docker.service
sudo systemctl enable docker.service
sudo usermod -aG docker $USER

Docker Compose のインストール

次は Docker Compose をインストールします。

curl -L https://github.com/docker/compose/releases/download/1.8.0-rc1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Docker Compose 用の設定

ディレクトリ/ファイル設計

今回、ディレクトリは以下のように設計しました。Nginx-Proxy や GitBucket、ownCloud 等を各々、自由に操作出来るよう意図的にディレクトリを分けています。

.docker-compose.d/
├── certs
├── htpasswd
├── git.example.com
└── oc.example.com

また、Docker Compose 用の yml ファイルは以下のようにしました。

No. yml ファイル 用途
1 ~/.docker-compose.d/docker-compose.yml リバースプロキシ & 証明書の自動更新
2 ~/.docker-compose.d/git.example.com/docker-compose.yml GitBucket
3 ~/.docker-compose.d/oc.example.com/docker-compose.yml ownCloud

設計通りにディレクトリを作成しておきます。

mkdir ~/.docker-compose.d
mkdir ~/.docker-compose.d/certs
mkdir ~/.docker-compose.d/htpasswd
mkdir ~/.docker-compose.d/git.example.com
mkdir ~/.docker-compose.d/oc.example.com

Nginx-Proxy

以下の 2 つのコンテナは組み合わせて使うと非常に便利です。

但し、jwilder/nginx-proxy は client_max_body_size が 100MB に設定されているようで、jwilder/nginx-proxy 経由で通信をする際に 100MB 以上のファイルを転送することが出来ず、ownCloud 宛に 100MB を超える通信をしようとするとエラーになってしまいます。sig/nginx-proxyclient_max_body_size を 10GB に設定したコンテナを用意したので、今回はこちらを使います。

Docker Compose 用の yml ファイル (~/.docker-compose.d/docker-compose.yml) は以下のように記載しました。Docker API で Socket を監視するので、docker.sock を ro (ReadOnly) でマウントしておきます。

nginx-proxy:
  image: sig9/nginx-proxy
  privileged: true
  ports:
    - 80:80
    - 443:443
  volumes:
    - ./docker-compose.d/certs:/etc/nginx/certs:ro
    - ./docker-compose.d/htpasswd:/etc/nginx/htpasswd
    - /etc/nginx/vhost.d
    - /usr/share/nginx/html
    - /var/run/docker.sock:/tmp/docker.sock:ro

letsencrypt-nginx-proxy-companion:
  image: jrcs/letsencrypt-nginx-proxy-companion
  privileged: true
  volumes:
    - ./docker-compose.d/certs:/etc/nginx/certs:rw
    - /var/run/docker.sock:/var/run/docker.sock:ro
  volumes_from:
    - nginx-proxy

コンテナを起動しておきます。

cd ~/.docker-compose.d/
docker-compose up -d

GitBucket

事前に GitBucket 用のデータディレクトリを作成しておきます。

sudo mkdir -p /opt/data/gitbucket

GitBucket 用のコンテナは sken/gitbucket を利用させて頂きました。Dcoker Compose 用の yml ファイル (~/.docker-compose.d/git.example.com/docker-compose.yml) は以下のように記載しました。VIRTUAL_HOST には、このコンテナで使いたい FQDN を指定します。LETSENCRYPT_HOST は Let's Encrypt で取得するサーバ証明書の Common Name を指定します。通常は VIRTUAL_HOST と同じになります。LETSENCRYPT_EMAIL には証明書の有効期限が近くなった場合のお知らせメール等を受信するメールアドレスを指定します。

nginx:
    image: sken/gitbucket
    privileged: true
    volumes:
        - /opt/data/gitbucket:/gitbucket
    environment:
        NGINX_ROOT: /usr/share/nginx
        VIRTUAL_HOST: git.example.com
        LETSENCRYPT_HOST: git.example.com
        LETSENCRYPT_EMAIL: admin@example.com

コンテナを起動しておきます。

cd ~/.docker-compose.d/git.example.com/
docker-compose up -d

ownCloud

事前に ownCloud 用のデータディレクトリを作成しておきます。

sudo mkdir -p /opt/data/owncloud/apps
sudo mkdir -p /opt/data/owncloud/config
sudo mkdir -p /opt/data/owncloud/data

Dcoker Compose 用の yml ファイル (~/.docker-compose.d/oc.example.com/docker-compose.yml) は以下のように記載しました。

owncloud:
    image: owncloud
    privileged: true
    volumes:
        - /opt/data/owncloud/apps:/var/www/html/apps
        - /opt/data/owncloud/config:/var/www/html/config
        - /opt/data/owncloud/data:/var/www/html/data

    environment:
        VIRTUAL_HOST: oc.example.com
        LETSENCRYPT_HOST: oc.example.com
        LETSENCRYPT_EMAIL: admin@example.com

コンテナを起動しておきます。

cd ~/.docker-compose.d/oc.example.com/
docker-compose up -d

通信確認

ブラウザから「https://git.example.com」や「https://oc.example.com」へアクセスし、警告が表示されることも無く、正常にサービスへアクセス出来ることを確認します。これは Docker コンテナに関係無いことですが、GitBucket や ownCloud を初期設定状態でインターネットに晒していると危険なので、すぐに初期パスワード等は変更することをお勧めします。