家のクラウド環境のサーバーをラズパイに変更しようかと思いネットで色々とググってみるとDockerに関し間違った内容がクローン記事が広まってるのでちゃんとした内容を掲載しとく。

まずDebian系でDockerをインストールするならdockerではなく、フリーの方のdocker-ceだす(汗)

てことで、まずdocker-ceのインストール。

あくまでお遊びなのでラズパイをサーバーにしてownCloud運用するとか、良い子の皆さんは真似をしないでね!

Dockerのインストール

基本的にhttps://docs.docker.com/engine/install/ubuntu/を参照して作業すれば良いだけなんだけど、ちょっとラズパイ環境ではうまくいかないところもあったので
以下にコマンドを羅列しときます。

$ sudo apt remove docker docker-engine docker.io containerd runc
$ sudo apt update

$ sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

次に本家のドキュメントではアーキテクチャによって

armhfの場合

$ sudo add-apt-repository \
   "deb [arch=armhf] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

arm64の場合

sudo add-apt-repository \
   "deb [arch=arm64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

となっていますが、ラズパイだとエラーが出てしまうので、その場合は/etc/apt/sources.listに

deb [arch=armhf] https://download.docker.com/linux/debian buster stable

または

deb [arch=arm64] https://download.docker.com/linux/debian buster stable

を追記します。

これで、aptのリポジトリの設定は完了したのでdocker-ceのインストールを実行します。

$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose

$ sudo systemctl enable docker

一応ちゃんと動いてるか確認

$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: e
   Active: active (running) since Sun 2020-07-05 10:53:10 JST; 34s ago
     Docs: https://docs.docker.com
 Main PID: 2577 (dockerd)
    Tasks: 12
   Memory: 29.3M
   CGroup: /system.slice/docker.service
           └─2577 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/contain

 7月 05 10:53:05 raspberrypi dockerd[2577]: time="2020-07-05T10:53:05.123464333+
 7月 05 10:53:05 raspberrypi dockerd[2577]: time="2020-07-05T10:53:05.123578870+
 7月 05 10:53:05 raspberrypi dockerd[2577]: time="2020-07-05T10:53:05.123690888+
 7月 05 10:53:05 raspberrypi dockerd[2577]: time="2020-07-05T10:53:05.124770343+
 7月 05 10:53:06 raspberrypi dockerd[2577]: time="2020-07-05T10:53:06.663774242+
 7月 05 10:53:07 raspberrypi dockerd[2577]: time="2020-07-05T10:53:07.015206304+
 7月 05 10:53:09 raspberrypi dockerd[2577]: time="2020-07-05T10:53:09.174534315+
 7月 05 10:53:09 raspberrypi dockerd[2577]: time="2020-07-05T10:53:09.175217792+
 7月 05 10:53:10 raspberrypi dockerd[2577]: time="2020-07-05T10:53:10.399568878+
 7月 05 10:53:10 raspberrypi systemd[1]: Started Docker Application Container En

これでDockerのインストール完了です!

本家ではdocker-composeコマンドのインストールは...

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.26.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

となっていますが、uname -m の結果「armv7l」が上記にはアップされておらずdocker-composeコマンドの中身がNotFoundの文字列となってしまいます
https://github.com/docker/compose/issues/6831
ってことで、古いバージョンだけどaptでインストールを行っています。

これで、Docker環境の出来上がり!

外付けUSBハードディスクの準備

当然、ラズパイだけの容量では大量のファイルは保存できないので、外付けのハードデイスクを用意して自動でマウントできるように設定します。
ここで、注意しないといけないのがラズパイはハード的に電源制御がダメダメということ。
ポータブルなど電源供給しないといけないケースの場合、電圧低下を起こしOSが超不安定になります。
初めてのラズパイだったのでこれにはハマりました(汗)
結局、テレビの録画用の外付けHDDを引っ張り出してきて実験を行う羽目になりました...とほほ。

外付けHDDをラズパイと接続し、デバイスを確認します。

$ sudo lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  1.8T  0 disk 
└─sda1        8:1    0  1.8T  0 part /var/lib/docker/volumes/owncloud_files/_dat
mmcblk0     179:0    0 14.5G  0 disk 
├─mmcblk0p1 179:1    0  256M  0 part /boot
└─mmcblk0p2 179:2    0 14.2G  0 part /

ここでは、sda1が接続したHDDです。

まずは、ディスクのフォーマット。

$ sudo mkfs.ext4 /dev/sda1

HDDを自動で認識させたいので、autofsのインストール。

$ sudo apt install autofs

autofs用の設定ファイル作成

$ sudo vi /etc/auto.master.d/usb.autofs

/mnt /etc/auto.usb

マウント先は、/mnt/dataとしたいので

$ echo "data -fstype=ext4,rw :/dev/disk/by-uuid/"`sudo blkid /dev/sda1 | grep -o '\sUUID=\"[0-9a-f\-]*\"' | grep -o '[0-9a-f\-]*'` | sudo tee -a /etc/auto.usb

サービスの有効化と再起動

$ sudo systemctl enable autofs
$ sudo reboot

これで、/mnt/dataにアクセスがあるとディスクを自動でマウントしてくれます。
設定の詳細は、autofsでググってください。

最後にownCloudがこのフォルダにアクセスできるようパーミッションを変更。

$ sudo chown www-data /mnt/data

ownCloudのコンテナ構築

お次は、OwnCloud のコンテナの準備です。OwnCloudのdockerイメージはarm版も用意してくれているのでまずはdocker-compose.ymlを作成します。

$ sudo mkdir -p /var/docker/owncloud
$ sudo vi /var/docker/owncloud/docker-compose.yml
version: '2.1'

volumes:
  files:
    driver_opts:
      type: none
      device: /mnt/data
      o: bind
  config:
    driver: local
  mysql:
    driver: local
  backup:
    driver: local
  redis:
    driver: local

services:
  owncloud:
    image: arm32v7/owncloud:latest
    restart: always
    ports:
      - 80:80
    depends_on:
      - db
      - redis
    environment:
      - OWNCLOUD_DOMAIN=localhost
      - OWNCLOUD_DB_TYPE=mysql
      - OWNCLOUD_DB_NAME=owncloud
      - OWNCLOUD_DB_USERNAME=owncloud
      - OWNCLOUD_DB_PASSWORD=owncloud
      - OWNCLOUD_DB_HOST=db
      #管理者ユーザー、パスワードは適宜設定の事!
      - OWNCLOUD_ADMIN_USERNAME=admin
      - OWNCLOUD_ADMIN_PASSWORD=P@ssw0rd
      - OWNCLOUD_UTF8MB4_ENABLED=true
      - OWNCLOUD_REDIS_ENABLED=true
      - OWNCLOUD_REDIS_HOST=redis
      - OWNCLOUD_MEMCACHED_ENABLED=true
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/status.php"]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - files:/mnt/data

  db:
    image: webhippie/mariadb:latest
    restart: always
    environment:
      - MARIADB_ROOT_PASSWORD=owncloud
      - MARIADB_USERNAME=owncloud
      - MARIADB_PASSWORD=owncloud
      - MARIADB_DATABASE=owncloud
      - MARIADB_MAX_ALLOWED_PACKET=128M
      - MARIADB_INNODB_LOG_FILE_SIZE=64M
      - MARIADB_INNODB_LARGE_PREFIX=ON
      - MARIADB_INNODB_FILE_FORMAT=Barracuda
    healthcheck:
      test: ["CMD", "/usr/bin/healthcheck"]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - mysql:/var/lib/mysql
      - backup:/var/lib/backup

  redis:
    image: webhippie/redis:latest
    restart: always
    environment:
      - REDIS_DATABASES=1
    healthcheck:
      test: ["CMD", "/usr/bin/healthcheck"]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - redis:/var/lib/redis

そして、

$ docker-compose up

でコンテナ起動を確認!

本家
https://doc.owncloud.com/server/admin_manual/installation/docker/

ちなみに.envファイルを利用した環境変数のセットがラズパイではうまくいかなかったのでベタ書きしてます。シェルの設定とかなのかな?

サービス化

serviceファイルの作成。docker-compose.ymlのパスは配置場所に修正すること。

$ sudo vi /etc/systemd/system/owncloud.service

[Unit]
Description=docker-compose owncloud service
Requires=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker-compose -f /var/docker/owncloud/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /var/docker/owncloud/docker-compose.yml down

[Install]
WantedBy=default.target

ファイルができたら登録して終わり。

$ sudo systemctl enable owncloud
$ sudo systemctl start owncloud

最後に、http://ラズパイのipアドレス/ へアクセスして、ownCloudの設定を行います。

----------2020-07-05-11.21.45

ownCloud の設定にて、データベースの接続先はlocalhostではなくコンテナ名であることに注意してください。以下の場合は「owncloud_db_1:3306」がDBのホスト名となります。
この辺は、Dockerの世界なのでどうしてそうなるのかはググってください。

$ sudo docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                    PORTS                NAMES
44d9ca6ba85d        arm32v7/owncloud:latest    "docker-entrypoint.s…"   About an hour ago   Up 30 minutes (healthy)   0.0.0.0:80->80/tcp   owncloud_owncloud_1
45054c2260a6        webhippie/mariadb:latest   "/usr/bin/entrypoint…"   About an hour ago   Up 30 minutes (healthy)   3306/tcp             owncloud_db_1
34d388b9256f        webhippie/redis:latest     "/usr/bin/entrypoint…"   About an hour ago   Up 30 minutes (healthy)   6379/tcp             owncloud_redis_1

2020/7/6 追記

MysqlのデータファイルがSDカード上にあると現実問題書き込みが遅くて使い物にならないですね。
頻繁に書込み、削除が入るファイルはUSBの外付けHDDを利用した方が良さそうです。