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
- Docker API で Socket を監視し、対応する FQDN 宛通信が来たら対応するコンテナへ通信を転送する
- jrcs/letsencrypt-nginx-proxy-companion
- Let's Encrypt で証明書を自動取得してくれる
但し、jwilder/nginx-proxy は client_max_body_size が 100MB に設定されているようで、jwilder/nginx-proxy 経由で通信をする際に 100MB 以上のファイルを転送することが出来ず、ownCloud 宛に 100MB を超える通信をしようとするとエラーになってしまいます。sig/nginx-proxy に client_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 を初期設定状態でインターネットに晒していると危険なので、すぐに初期パスワード等は変更することをお勧めします。
コメント