Dockerを使って、ownCloudをセットアップしてみた。

#はじめに
Dockerを学習するために、ownCloud+Mariadbの組み合わせでセットアップを行った備忘録。
後々クラウド上の仮想マシンに反映する予定。
パラメーターの名前が、色々変なのは、色んなサイトから引っ張って来たからです。

##テスト環境
テスト環境は、VirtualBox+Vagrantの組み合わせで、行いました。
特に珍しい環境でも無いので、構築等は割愛。

##ホストOS
いつもであれば、Ubuntu Serverを利用するのですが、Dockerを使うのであれば、専用のOSを使いたいという事で、[軽量DockerホストOS Barge](http://qiita.com/A-I/items/8dc7ddc52e6038b5c74b)を使うことにしました。
Vagrant用のboxが用意されているのが嬉しいですね。

```:cmd
> vagrant box add ailispaw/barge
> vagrant init -m ailispaw/barge
> vagrant up
```
PuTTY(SSHクライアント)から接続するには、鍵ファイルを設定する必要があります。
```vagrant ssh```コマンドを実行すると接続方法が表示されます。

```:cmd
> vagrant ssh
`ssh` executable not found in any directories in the %PATH% variable. Is an
SSH client installed? Try installing Cygwin, MinGW or Git, all of which
contain an SSH client. Or use your favorite SSH client with the following
authentication information shown below:

Host: 127.0.0.1
Port: 2222
Username: bargee
Private key: <秘密鍵のフルパス>
```
PuTTY鍵生成ツールを使って、ppk形式へ変換して、PuTTYへ指定します。
ローカルな開発環境ですが、鍵ファイルを使った方が、パスワード入力しなくて良いので楽ですね。
##初期設定
###dockerのバージョンアップ
Barge OSは、サイズが大きくなるのを嫌ってデフォルトでは、Version1.10.3がインストールされています。
サイズに関しては、それほど拘りが無いので、最新のバージョンへ更新します。

```:bash
$ sudo /etc/init.d/docker restart v17.03.0-ce
$ docker version
Client:
 Version:      17.03.0-ce
 API version:  1.26
 Go version:   go1.7.5
 Git commit:   60ccb22
 Built:        Thu Mar  2 01:11:00 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.0-ce
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   60ccb22
 Built:        Thu Mar  2 01:11:00 2017
 OS/Arch:      linux/amd64
 Experimental: false
```
###docker-composeのインストール
docker-composeは、複数のコンテナを一括して管理するツールです。
Barge OSは、サイズを極限まで絞り込んでいるためdockerの実行に必要なツールしか用意されていません。
独自のpkgツールで用意されているgitなどは、ツールを使ってインストールできるのですが、用意されていないツールに関しては自分で、何とかする必要があります。
docker-composeは、コンパイル済みファイルが用意されているのみたいなので、ダウンロードして配置するだけで使えるようになります。

```:bash
$ wget -L https://github.com/docker/compose/releases/download/1.11.2/docker-compose-`uname -s`-`uname -m`
$ chmod +x docker-compose-`uname -s`-`uname -m`
$ sudo mv docker-compose-`uname -s`-`uname -m` /opt/bin/docker-compose
$ sudo chown root:root /opt/bin/docker-compose
$ docker-compose version
docker-compose version 1.11.2, build dfed245
docker-py version: 2.1.0
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t  3 May 2016
```
##Mariadb(MySQL)の場合
###データベースのセットアップ
データベースにmariadbを使う場合には下記のようにセットアップします。

```:bash
$ docker pull mariadb:10
$ docker run -d --name db_nextcloud \
       -v /mnt/nextcloud/db:/var/lib/mysql \
       -e MYSQL_ROOT_PASSWORD=supersecretpassword \
       -e MYSQL_DATABASE=nextcloud \
       -e MYSQL_USER=nextcloud \
       -e MYSQL_PASSWORD=supersecretpassword \
       mariadb:10
```
nextCloudのセットアップ事例から引っ張って来たので、名前とか色々変ですが、読み替えてください。
mariadb:10は、バージョン10のmariadbという意味のようです。
下記のコマンドで、コンテナのインスタンスが動作しているのが分かります。

```:bash
$ docker ps
```

###ownCloud本体のセットアップ
執筆時点で公開されているイメージは、8.1が最新ぽかったので、8.1を使いました。
肝は、--linkの部分です。
Dockerは、コンテナ同士は隔離されておりお互いが干渉しない作りになっています。
--linkを指定することで、他のコンテナを参照できるようになります。

```:bash
$ docker pull owncloud:8.1
$ docker run -d -p 80:80 --link db_nextcloud:db_nextcloud owncloud:8.1
```
http://192.168.33.10/ へアクセスすると管理者の登録とデータベースの設定画面が現れます。
下記の画像のように設定すれば接続できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7839/e4093921-c74e-a00b-2c3b-814593bc1306.png)
##Postgresの場合
###データベースのセットアップ
データベースにpostgresを使う場合には下記のようにセットアップします。

```:bash
$ docker pull postgres
$ sudo mkdir /opt/pg_data
$ docker run --name=postgres \
  -e POSTGRES_PASSWORD=supersecretpassword \
  -v /opt/pg_data:/var/lib/postgresql/data \
  -d postgres
```
下記のコマンドで、コンテナのインスタンスが動作しているのが分かります。

```:bash
$ docker ps
```
###ownCloud本体のセットアップ
postgresのセットアップでは、tag(バージョン)を指定せずに、latestでセットアップしてみました。

```:bash
$ docker pull owncloud
$ docker run --name owncloud -p 80:80 --link=postgres -d owncloud
```
http://192.168.33.10/ へアクセスすると管理者の登録とデータベースの設定画面が現れます。
下記の画像のように設定すれば接続できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/7839/372c5bfd-fa40-87d2-a747-ad18e29925ea.png)
##開発環境からアクセスする設定
Vagrantの設定で、開発環境からアクセスできるように設定します。

```:Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ailispaw/barge"
  config.vm.network "private_network", ip: "192.168.33.10"
end
```
##docker-composeを使ってコンテナを一括管理
コンテナが増えてくるとdockerコマンドを駆使するのも大変になってきます。
また、--linkオプションを使った場合には、コンテナの起動順番も考慮する必要があります。
スクリプトファイルを使うのも一つの選択肢ですが、オーケストラレーション（配備設定管理自動化ツール）を使ってみました。
簡単にいうとdocker専用のmake,ant,gulp.jsのようなものです。
設定ファイルは、docker-compose.ymlというファイル名で、YAML形式で記述します。

```:docker-compose.yml
# postgres
postgres:
    image: postgres
    volumes:
        - "/opt/pg_data:/var/lib/postgresql/data"
    environment:
        POSTGRES_PASSWORD: supersecretpassword
# owncloud
owncloud:
    image: owncloud
    ports:
        - "80:80"
    links:
        - postgres
```
下記のコマンドを実行すれば、イメージのダウンロードから実行までが、自動的に行われます。

```:bash
$ docker-compose up -d
```
次のコマンドで、動作しているのが分かります。

```:bash
$ docker-compose ps
```
全コンテナを停止するのは、次のコマンドです。

```:bash
$ docker-compose kill
```
他にも色々とできるみたいなので、徐々に調べていきたいと思います。