docker NextCloud

準備

※今回はsudoを使っています。いつものrootユーザだとプロンプトを再現すると"#"のため、Markupでコメント扱いになりグレイ表示になってしまうのを避けるためsudoでの例にしているだけです。

dockerドキュメント日本語化プロジェクトのページだと日本語でいろいろ説明がありますのでわかりやすいと思います。

Docker CEのインストール

インストールおよびdocker-ceに必要なパッケージをインストールします。
$ sudo yum install -y yum-utils device-mapper-persistent-data  lvm2

Docker CEの最新バージョンを入手できるようにリポジトリを追加します。
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Docker CEをインストールします。
$ sudo yum  install docker-ce -y

Dockerサービスの自動起動有効化と起動を実行します。
$ sudo systemctl enable docker
$ sudo systemctl start docker

docker-composeのインストール

phythonパッケージを使ったインストール方法です。

$ sudo yum install epel-release -y
$ sudo yum install python-pip -y
$ sudo pip install docker-compose -y
$ sudo docker-compose --version
docker-compose version 1.23.1, build b02f1306

GitHub上のComposeリポジトリのリリースから最新版をダウンロードする方法です。
※最新版かどうかは自分で確かめてバージョンを指定してダウンロードします。

バージョン 1.23.1をダウンロードしています。
$ sudo curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.23.1, build b02f1306

Nextcloudのインストール

プロジェクト定義

今回プロジェクトのディレクトリは「/home/docker/nextcloud」にしました。
このディレクトリに「docker-compose.yml」ファイルを作成します。
このファイルの中にNextcloud用のコンテナを記述します。
※ファイルを作成していますが、onelinearで実行は可能です。

$ mkdir -p /home/docker/nextcloud
$ cd /home/docker/nextcloud
$ vi docker-compose.yml

docker-compose.ymlは以下になります。(※あくまで例です)

version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    container_name: nextcloud-mariadb
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=ScrKBFGXoUq7knyR # 適当なパスワードを設定
      - MYSQL_PASSWORD=tGW8fk9NX5nkxGz4      # 適当なパスワードを設定
      - MYSQL_DATABASE=nextclouds
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud:fpm
    container_name: nextcloud-app
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    restart: always

  web:
    image: nginx
    container_name: nextcloud-nginx
    ports:
      - 9080:80
    links:
      - app
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    volumes_from:
      - app
    restart: always

※nignxのポートは他と重複しないように9080番にしてあります。重複する場合は変更してください。
※カレントディレクトリのnginx.confを使うように設定したつもりですがボリュームマウントの話がまだよく理解できていません。構築前にnginx.confがないとエラーになります。

プロジェクトの構築

$  docker-compose up -d
Creating network "nextcloud_default" with the default driver
Creating volume "nextcloud_nextcloud" with default driver
Creating volume "nextcloud_db" with default driver
Pulling db (mariadb:)...
latest: Pulling from library/mariadb
473ede7ed136: Pull complete
c46b5fa4d940: Pull complete
93ae3df89c92: Pull complete
6b1eed27cade: Pull complete
a7571426e9fe: Pull complete
dba27abd0643: Pull complete
b5742ca02a95: Pull complete
3c53ea2689ed: Pull complete
517f1aafa332: Pull complete
39158f499dbe: Pull complete
4368463dd531: Pull complete
8fee7414381d: Pull complete
abdbc91263bb: Pull complete
af85e8800b74: Pull complete
Pulling app (nextcloud:fpm)...
fpm: Pulling from library/nextcloud
a5a6f2f73cd8: Pull complete
633e0d1cd2a3: Pull complete
fcdfdf7118ba: Pull complete
4e7dc76b1769: Pull complete
64114f4b77d1: Pull complete
8808058334c4: Pull complete
b3b498385302: Pull complete
42083dd7d95b: Pull complete
f7d76dec7f98: Pull complete
0160ecfb865a: Pull complete
6372b5a2a037: Pull complete
8ae6a5943777: Pull complete
788d77efc560: Pull complete
52a2378966e0: Pull complete
ef1cb31c79ca: Pull complete
e66cc5f0068e: Pull complete
2dc90e5ac6d3: Pull complete
Pulling web (nginx:)...
latest: Pulling from library/nginx
a5a6f2f73cd8: Already exists
67da5fbcb7a0: Pull complete
e82455fa5628: Pull complete
Creating nextcloud-mariadb ... done
Creating nextcloud-app     ... done
Creating nextcloud-nginx   ... done

※最後の3行はちゃんとコンテナ名で表示されています。

ステータスの確認

$ docker-compose ps
      Name                    Command             State          Ports
------------------------------------------------------------------------------
nextcloud-app       /entrypoint.sh php-fpm        Up      9000/tcp
nextcloud-mariadb   docker-entrypoint.sh mysqld   Up      3306/tcp
nextcloud-nginx     nginx -g daemon off;          Up      0.0.0.0:9080->80/tcp

NextCloudの初期設定

ブラウザーからNextCloudのサイトへアクセスしてウィザードを実行します。

セットアップウィザードの開始

各項目は以下のように入力しました。

URL https://IPアドレス:9080
管理者ユーザ admin
管理者パスワード adminpassword
データフォルダ /var/www/html/data
データベース MySQL/MariaDB
データベース管理ユーザ nextcloud
データベース管理ユーザパスワード tGW8fk9NX5nkxGz4
データベース名 nextclouds
データーベースサーバー名 db:3306

※NextCloudの管理ユーザを作成しますのでユーザ名とパスワードが必要です。
※パスワードは推測できない強固なものにしてください。
※それ以外はDBコンテナ定義に記述した内容と一致するように入力します。
※データベースサーバー名はlocalhostではなく「db:3306」になります。
※環境にあわせて適切に変更してください。
セットアップウィザードの終了

NextCloud管理者ページ

右上の設定アイコンから設定を選択すれば、アプリの管理やユーザの管理が行えます。

NextCloud管理者ページ

コンテナの停止/開始

$ docker-compose stop
Stopping nextcloud-nginx   ... done
Stopping nextcloud-app     ... done
Stopping nextcloud-mariadb ... done

$ docker-compose ps
      Name                    Command             State    Ports
----------------------------------------------------------------
nextcloud-app       /entrypoint.sh php-fpm        Exit 0
nextcloud-mariadb   docker-entrypoint.sh mysqld   Exit 0
nextcloud-nginx     nginx -g daemon off;          Exit 0

$ docker-compose start
Starting db  ... done
Starting app ... done
Starting web ... done

$ docker-compose ps
      Name                    Command             State          Ports
------------------------------------------------------------------------------
nextcloud-app       /entrypoint.sh php-fpm        Up      9000/tcp
nextcloud-mariadb   docker-entrypoint.sh mysqld   Up      3306/tcp
nextcloud-nginx     nginx -g daemon off;          Up      0.0.0.0:9080->80/tcp

コンテナ内でシェルコマンドを実行

cat /etc/nginx/nginx.confを実行しています。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
5ec23d13e579        nginx               "nginx -g 'daemon of…"   32 minutes ago      Up 32 minutes       0.0.0.0:9080->80/tcp   nextcloud-nginx
747dde2355c5        nextcloud:fpm       "/entrypoint.sh php-…"   32 minutes ago      Up 32 minutes       9000/tcp               nextcloud-app
5603117e28ac        mariadb             "docker-entrypoint.s…"   32 minutes ago      Up 32 minutes       3306/tcp               nextcloud-mariadb

$ docker exec 5ec23d13e579 cat /etc/nginx/nginx.conf
user  www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    upstream php-handler {
        server app:9000;
    }

    server {
        listen 80;

        # Add headers to serve security related headers
        # Before enabling Strict-Transport-Security headers please read into this
        # topic first.
        # add_header Strict-Transport-Security "max-age=15768000;
        # includeSubDomains; preload;";
        #
        # WARNING: Only add the preload option once you read about
        # the consequences in https://hstspreload.org/. This option
        # will add the domain to a hardcoded list that is shipped
        # in all major browsers and getting removed from this list
        # could take several months.
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        add_header Referrer-Policy no-referrer;

        root /var/www/html;

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }

        # The following 2 rules are only needed for the user_webfinger app.
        # Uncomment it if you're planning to use this app.
        #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
        #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json
        # last;

        location = /.well-known/carddav {
            return 301 $scheme://$host/remote.php/dav;
        }
        location = /.well-known/caldav {
            return 301 $scheme://$host/remote.php/dav;
        }

        # set max upload size
        client_max_body_size 10G;
        fastcgi_buffers 64 4K;

        # Enable gzip but do not remove ETag headers
        gzip on;
        gzip_vary on;
        gzip_comp_level 4;
        gzip_min_length 256;
        gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
        gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

        # Uncomment if your server is build with the ngx_pagespeed module
        # This module is currently not supported.
        #pagespeed off;

        location / {
            rewrite ^ /index.php$request_uri;
        }

        location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
            deny all;
        }
        location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
            deny all;
        }

        location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) {
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            # fastcgi_param HTTPS on;
            #Avoid sending the security headers twice
            fastcgi_param modHeadersAvailable true;
            fastcgi_param front_controller_active true;
            fastcgi_pass php-handler;
            fastcgi_intercept_errors on;
            fastcgi_request_buffering off;
            fastcgi_read_timeout 300;
        }

        location ~ ^/(?:updater|ocs-provider)(?:$|/) {
            try_files $uri/ =404;
            index index.php;
        }

        # Adding the cache control header for js and css files
        # Make sure it is BELOW the PHP block
        location ~ \.(?:css|js|woff|svg|gif)$ {
            try_files $uri /index.php$request_uri;
            add_header Cache-Control "public, max-age=15778463";
            # Add headers to serve security related headers (It is intended to
            # have those duplicated to the ones above)
            # Before enabling Strict-Transport-Security headers please read into
            # this topic first.
            # add_header Strict-Transport-Security "max-age=15768000;
            #  includeSubDomains; preload;";
            #
            # WARNING: Only add the preload option once you read about
            # the consequences in https://hstspreload.org/. This option
            # will add the domain to a hardcoded list that is shipped
            # in all major browsers and getting removed from this list
            # could take several months.
            add_header X-Content-Type-Options nosniff;
            add_header X-XSS-Protection "1; mode=block";
            add_header X-Robots-Tag none;
            add_header X-Download-Options noopen;
            add_header X-Permitted-Cross-Domain-Policies none;
            add_header Referrer-Policy no-referrer;

            # Optional: Don't log access to assets
            access_log off;
        }

        location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
            try_files $uri /index.php$request_uri;
            # Optional: Don't log access to other assets
            access_log off;
        }
    }

}

コンテナの削除

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
c73d7064f855        nginx               "nginx -g 'daemon of…"   3 minutes ago       Exited (0) 14 seconds ago                       nextcloud-nginx
04a5d83da136        nextcloud:fpm       "/entrypoint.sh php-…"   3 minutes ago       Exited (0) 12 seconds ago                       nextcloud-app
9316199da28e        mariadb             "docker-entrypoint.s…"   3 minutes ago       Exited (0) 9 seconds ago                        nextcloud-mariadb

$ docker rm c73d7064f855 04a5d83da136 9316199da28e
c73d7064f855
04a5d83da136
9316199da28e

イメージの削除

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nextcloud           fpm                 3dce6332093c        14 hours ago        552MB
nginx               latest              e81eb098537d        22 hours ago        109MB
mariadb             latest              95d6852bba5a        35 hours ago        365MB

$ docker rmi 3dce6332093c e81eb098537d 95d6852bba5a
Untagged: nextcloud:fpm
Untagged: nextcloud@sha256:608753ab4c9da3cc117f041ccb00722ee0fe468d5603b3a54e707535a2b269a8
Deleted: sha256:3dce6332093c81f01a3ca849d0ea310a9936071f8d7492660c6e86e39622ff96
Deleted: sha256:675e1b2681356c95d329bc014901e6d8bbfecac21829f1b9e2195747d48d6d6f
Deleted: sha256:76c657257a00592a57003ef9ce95f65318bc0c6920900d5797ada8a36e6eaf9c
Deleted: sha256:582962c35ba6abe5c5809235435d6346d8717f3d18bb3fd3d97d8ac89d52202e
Deleted: sha256:65ca1cdcacf7c523232416da2fc712d2cdf6e65f41437010a9725a0141f40e19
Deleted: sha256:b7360af0b7a96f7686b2328de9d42c236db76d496364feaa5056dc1d4bcff7b3
Deleted: sha256:8c6412a06a652b95992f6a9a158e9718891e53128bfaeaaa3e14848303626238
Deleted: sha256:bdb56734ad22b2598b384fd919729abb1aaa2d23c0bcfc0df279349970b3a3cf
Deleted: sha256:125c6b80599d7438dbd80987ba560ea0c48249f26362d544f5d8067d8667429e
Deleted: sha256:70c9f2653ac24ed9df57a7dcf004159a61dc932163f027fbdab7ecef1fd105da
Deleted: sha256:4a3ff6e5c538b92532021703507bb0b5862dd084021efa660c65a1791a9e9ea6
Deleted: sha256:ee97a5b9c1e40e70bde0c77928577616a934caf1d473f60272d4046debb0a3d5
Deleted: sha256:acc554686478329c799c2dfd87080d949ecd06bb35cb8b74bd73dd8218e4192c
Deleted: sha256:56c63b99faf4d27372c55c6ea80dd92724425a4d2dd2e7fb361b78573a223983
Deleted: sha256:5e16161993d29f75ba030368b49b6ae0793e6022f115070e7116f1a9707a2e1e
Deleted: sha256:76e96d6d15a0b6608b4646a15ac7258028ebee1828b5122e1ddbc317f0ab9110
Deleted: sha256:7ec6ba7709d4f96109012e4b85020b07de97500bb046f482979758d52f1d6318
Untagged: nginx:latest
Untagged: nginx@sha256:2491c3ac3f39cf5298d92a20b51c45ff0ddc613f66fdf97edaa1d5a219cd54b0
Deleted: sha256:e81eb098537d6c4a75438eacc6a2ed94af74ca168076f719f3a0558bd24d646a
Deleted: sha256:7055505a92c39c6f943403d54a1cda020bfeb523b55d9d78bfe1dad0dd32bb2d
Deleted: sha256:378a8fcc106dc4d3a9f2dc0b642b164e25de3aab98a829e72b2d8c0cf0bad8ee
Deleted: sha256:ef68f6734aa485edf13a8509fe60e4272428deaf63f446a441b79d47fc5d17d3
Untagged: mariadb:latest
Untagged: mariadb@sha256:5c5f70ec8fadf873b154e86af15cd91d88f6ad01c45ac43308d73a2dcfd70614
Deleted: sha256:95d6852bba5ae4adc374fe563b8a6665032449e9b45e9f133e845fb33d2a09d7
Deleted: sha256:d94f3d6fd9da5cbf74994a7111d94142a2022ad3c78de43df2c87ab347bd8258
Deleted: sha256:aa4688472e353e42affb62b097cb872395db9058b215888f52b78fd6d5f87583
Deleted: sha256:5708ec56af7170e5394ab5cff17008c7c9ca4749fa42fdbfe0d63fbe34151148
Deleted: sha256:df11c43e86f5d08fbba550558afd3f5f8ab134f0e7153cb12e7085dfc2b9d9eb
Deleted: sha256:4a7c12bf3651001a0d3bcb63fb0ac84f1bda4dc6b9fee1396b3c5e314a5ef41c
Deleted: sha256:af7ae140ebddda4a4f531d33516a09fd45faeae737bf0914d188dd183ef8be59
Deleted: sha256:8400338efcf209b15210d1f0c368324d3b13c401055126f1cd941e03891f5300
Deleted: sha256:b44bcac2813fe8332d701fc944a5da96ad1781a08aff8a4e136d9122d801ca28
Deleted: sha256:801cfbc0916ef7a2c1b108d019ad584b328ac51e25a3cf2e42ad1edb19cdd73f
Deleted: sha256:342d154ea6579a5417d2db84cddcfb728d1391928c0ee49e0ccc9a6e75750070
Deleted: sha256:2ac9356b41d2d032dc980b6ee2b2a911790a47b59b4fcfd92e52a0729a389403
Deleted: sha256:f19c7e29a7e3fbaf44997bab14791e3d3d26d689bc3e2e720a9d5d8a77f68d6c
Deleted: sha256:b951bb1959dc1a5dfeda46229b36b33c4cc01e3f682ee1b77af8dab1cc7cf8a3
Deleted: sha256:102645f1cf722254bbfb7135b524db45fbbac400e79e4d54266c000a5f5bc400

ボリューム削除

$ docker volume ls
DRIVER              VOLUME NAME
local               nextcloud_db
local               nextcloud_nextcloud

$docker volume rm nextcloud_db nextcloud_nextcloud
nextcloud_db
nextcloud_nextcloud

※docker volume prune で未使用のローカルボリュームをすべて削除できます。

ネットワーク削除

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
e0aa158c26ac        bridge              bridge              local
dec23423260a        host                host                local
4796936e1f26        nextcloud_default   bridge              local
16758089dc6c        none                null                local

$ docker network rm nextcloud_default
nextcloud_default

※docker network prune で未使用のネットワークをすべて削除できます。
他にもコマンドはいろいろありますのでドキュメントなどを参照してください。

ディストリビューション

CentOS 7.x