NextcloudをDockerで構築する手順

# はじめに
[NextCloud](https://nextcloud.com/)というツールを一度利用してみたいと思ったので、ローカルのDocker環境でNextCloudを起動してみようと思います。

# 利用方法
Dockerをインストール済みのPCで作業を進めます。

## 必要なファイルの作成

Dockerプロジェクト用のフォルダを作成します。
（今回は、`NextCloud-Docker`というフォルダを作成しました。）
作成したフォルダに下記の`docker-compose.yml`と`.env` ファイルを作成します。

```docker:docker-compose.ymlファイル
version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${ENV_MYSQL_ROOT_PASSWORD}  # .envファイルに環境変数を設定
      - MYSQL_PASSWORD=${ENV_MYSQL_PASSWORD}  # .envファイルに環境変数を設定
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud
    ports:
      - 8080:80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    restart: always
```

```bash:.envファイル
# docker-compose内で利用する環境変数をここで設定します。
# 下記2つの環境変数に、適当な文字列を設定してください。

ENV_MYSQL_ROOT_PASSWORD=root
ENV_MYSQL_PASSWORD =root
```

## Docker Composeコマンドで環境を構築し起動する。

下記のコマンドを実行します。

```bash:実行コマンド
docker-compose up -d
```

<details><summary>upコマンドの実行結果</summary><div>

```bash:実行結果
Creating network "nextcloud-docker_default" with the default driver
Creating volume "nextcloud-docker_nextcloud" with default driver
Creating volume "nextcloud-docker_db" with default driver
Pulling db (mariadb:)...
latest: Pulling from library/mariadb
83ee3a23efb7: Pull complete
db98fc6f11f0: Pull complete
f611acd52c6c: Pull complete
aa2333e25466: Pull complete
f53ac4b825fd: Pull complete
c20afcf9b055: Pull complete
54c5dc6dcf19: Pull complete
b1c71d744483: Pull complete
863a8cc01d1c: Pull complete
5d1a793b093f: Pull complete
477cd2b3eba8: Pull complete
402454543166: Pull complete
Digest: sha256:8040983db146f729749081c6b216a19d52e0973134e2e34c0b4fd87f48bc15b0
Status: Downloaded newer image for mariadb:latest
Pulling app (nextcloud:)...
latest: Pulling from library/nextcloud
a076a628af6f: Pull complete
02bab8795938: Pull complete
657d9d2c68b9: Pull complete
f47b5ee58e91: Pull complete
2b62153f094c: Pull complete
60b09083723b: Pull complete
1701d4d0a478: Pull complete
bae0c4dc63ea: Pull complete
a1c05958a901: Pull complete
5964d339be93: Pull complete
1319bb6aacaa: Pull complete
71860efe761d: Pull complete
c5a84dbdd6a5: Pull complete
9336be8ca157: Pull complete
97d64e75bd85: Pull complete
f0f1f417f8ee: Pull complete
4a826539f3e2: Pull complete
3b2254795025: Pull complete
7a56bf6d9f42: Pull complete
b77ec330333f: Pull complete
Digest: sha256:936daec8aca034e035f15db35fbc7e135514bf4b9bf92f034ebc54f2b4b826f3
Status: Downloaded newer image for nextcloud:latest
Creating nextcloud-docker_db_1 ... done
Creating nextcloud-docker_app_1 ... done
```

</div></details>

ログの最後に`Done`と表示されたら、下記のコマンドでコンテナの稼働状況を確認します。

```bash:コンテナ確認コマンド
docker-compose ps
```

```bash:psコマンド実行結果
         Name                       Command               State          Ports        
--------------------------------------------------------------------------------------
nextcloud-docker_app_1   /entrypoint.sh apache2-for ...   Up      0.0.0.0:8080->80/tcp
nextcloud-docker_db_1    docker-entrypoint.sh mysqld      Up      3306/tcp            
```

## 動作確認

nextcloudはローカルホストの8080でリッスンされているので、ブラウザから[http://localhost:8080](http://localhost:8080)にアクセスします。

すると、下記のような画面が表示されれば正常にコンテナが起動しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/ae5c0c17-0d7f-2287-9d5f-055f3ca00e90.png)

## 管理者アカウントの設定
上部の`管理者アカウントを作成してください`の部分にユーザー名とパスワードを入力します。

## データベースの設定

`ストレージとデータベース▼`を選択して、ストレージの設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/dad16418-493e-58b6-aef9-f6a6bb02df3d.png)

上記の画面が表示されたら、`MySQL/MariaDB`を選択します。

表示された設定項目に下記の内容を設定します。

- データベースのユーザー名  
docker-compose.ymlで指定したMYSQL_ROOT_PASSWORDの値を設定
- データベースのパスワード  
docker-compose.ymlで指定したMYSQL_PASSWORDの値を設定
- データベース名  
docker-compose.ymlで指定したMYSQL_DATABASEの値を設定
- データベースのホスト名（デフォルトでは「localhost」と表示されています。）  
docker-compose.ymlで指定したデータベース用コンテナ名とそのデータベースが使用するポート番号を設定  
MySQLのデフォルトポートは3306

`推奨アプリをインストール`という項目はチェックボックスをつけたままにします。

`セットアップを完了します`を選択して、作業を継続します。

## 設定後の動作確認
セットアップが完了すると下記の画面が表示されます。

![画面1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/89f7d1e8-2bcf-bf4a-2ed0-4c7568861664.png)

![画面2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/8530a646-79ed-6564-f108-7f8d12e03c27.png)

![画面3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/7ea35e02-f7c0-2bd1-8cfa-d91383386b68.png)

![画面4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/184503de-be1e-c4f0-66ca-dd6ff3794640.png)

![画面5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/88fa3007-a296-cc5a-3293-c42c184055ec.png)
最後の画面まで遷移して、`Nextcloudの利用を開始する`を選択します。

## 色々試してみる
ローカル環境で動作しているので、好きなようにいじり倒します！！


# 後片付け
下記のコマンドでコンテナを停止し削除します。

```bash:コンテナ全削除コマンド
docker-compose down --rmi all --volumes
```


`--rmi all --volumes`を指定する事で、
・コンテナ止める
・ネットワーク削除する
・ボリューム削除する
・イメージ削除する
を同時に行います。


```bash:全削除コマンド実行結果
Removing nextcloud-docker_app_1 ... done
Removing nextcloud-docker_db_1  ... done
Removing network nextcloud-docker_default
Removing volume nextcloud-docker_nextcloud
Removing volume nextcloud-docker_db
Removing image mariadb
Removing image nextcloud
```

<details><summary>Dockerの環境確認（自分用メモ）</summary><div>

## ボリュームの確認方法
下記コマンドでボリュームの一覧を確認する事ができる。
`docker volume ls`
実行結果内に「カレントフォルダ名_コンテナ名」のボリュームが存在する事が確認できます。
各ボリュームの詳細情報を確認するためには下記のコマンドを実行します。

`docker volume inspect nextcloud-docker_db`
`docker volume inspect nextcloud-docker_nextcloud`


## ボリュームのマウント状況の確認

下記コマンドでコンテナの情報をtextファイルに出力
`docker inspect nextcloud-docker_app_1 > inspect_nextcloud-docker_app_1.txt`
`docker inspect nextcloud-docker_db_1 > inspect_nextcloud-docker_db_1.txt`
mountと表示されている部分にボリュームの情報が表示されている。

## ネットワークの確認方法
下記のコマンドを実行してDocker上のネットワーク一覧を表示します。
`docker network list`
ネットワーク名を指定していない場合、「カレントフォルダ名_default」という名前のネットワークで設定されています。
詳細な情報を確認したい場合はinspectコマンドを利用します。

`docker network inspect nextcloud-docker_default`

## イメージの情報確認
`docker-compose images`で情報を表示します。
docker上の全てのイメージを確認するためには下記のコマンドを実行します。
`docker images`

## ドライランする方法

`--dry-run`を付与する。
run実行時に利用可能

</div></details>



# 参考ページ
[Dockerのnextcloudページ](https://hub.docker.com/_/nextcloud)


# 最後に
AWS上で動作させてみたいです。
EC2+S3で動作させる方法やECSを利用してコンテナを実行するのも試してみたいです。
[S3にデータを置く方法](https://qiita.com/myoshimi/items/953119efc90d8c117fd7)