Docker非対応のNAS上でDockerを動かしてみた

# はじめに
以前から所持していたSynology DS420j上でDockerを動かしてみました。
SynologyのパッケージとしてDockerは提供されておりますが、DS420jは公式ではサポート外となっていた為、無理やり動かしています。
[Docker - アドオン パッケージ | Synology Incorporated](https://www.synology.com/ja-jp/dsm/packages/Docker)

手順は以下を参考にしました。
[Can I install Docker on arm8 based Synology Nas - Stack Overflow](https://stackoverflow.com/questions/52520008/can-i-install-docker-on-arm8-based-synology-nas)

<font color=red>**※NASのシステム層をいじくるので、データ破損してしまった場合、復旧できなくなる可能性があります！<br/>　実施する場合はくれぐれも注意し、自己責任でお願いします。**</font>

# 手順
## NASへのSSH接続を有効化
### NASの設定
WebブラウザからNASへアクセスし、管理者権限でログインします。
![1_Login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/1cb353cf-2982-2d8e-ccf6-7b055fc0244b.png)

コントロール パネルを開き、「端末とSNMP」を選択します。
![2_ControlPanel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/893c8934-b73b-9e8d-4611-33322fd27e6f.png)

『SSHサービスを有効化する。』にチェックを入れ、「適用」を押します。
![3_SNMPSSH.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/6923d6c5-d0ad-7f3e-774e-b43e9d9b682c.png)

これで、クライアントからNASへの接続が可能となります。

### SSH接続確認
今回はMacOSから操作を行いました。
Windowsからの接続はTeraTermを利用するとよいかと思います。

Terminalを起動します。
![4_Terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/a638e3fe-1b03-407a-a064-494afccb9bad.png)

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

```bash:ssh
ssh <接続するNASのユーザー名>@<接続するNASのIPアドレス>
```


NASのパスワードを入力します。
![5_SSHLogin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/c0d39b0c-bca6-796c-eaf9-677cef481aa3.png)

セッションが確立されたことを確認します。
![6_SSHConnect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/b240e08d-4c32-be80-9721-756d56691582.png)

切断は以下コマンドを実行します。

```bash:exit
exit
```

## Dockerのインストール
### Dockerバイナリのダウンロード
今回インストール対象のNASのアーキテクチャは**aarch64**でした。
以下からDockerのバイナリを確認します。
(必要に応じて、最新版を選択してください。)
[Index of linux/static/stable/aarch64/](https://download.docker.com/linux/static/stable/aarch64)
アーキテクチャはNASにSSH接続し、以下コマンドで確認ができます。

```bash:uname
uname -m
# aarch64
```


NASにSSH接続し、以下コマンドを実行します。

```bash:curl
sudo mkdir -p /usr/local/temp
sudo curl -L <上記で確認したBinaryのURL> -o /usr/local/temp/docker
```


### Dockerバイナリの配置
アーカイブファイルを/usr/local/bin配下に解凍します。
※私は/usr/bin配下に解凍してしまいました。。。本来なら/usr/local/binのほうが好ましいかと思いますので、ここでは/usr/local/binで記載いたします。不具合があれば、ご報告いただけると助かります。

```bash:tar
sudo tar xzvf /usr/local/temp/docker -C /usr/local/bin
```


### Dockerの構成
Dockerデーモンの構成ファイルをJSON形式で作成します。
以下のコマンドで構成ファイルを手動で作成します。

```bash:vi
sudo mkdir /etc/docker
sudo vi /etc/docker/daemon.json
```


構成ファイルは以下の通りの内容を記述します。

```json:daemon.json
{
    "data-root": "/docker",
    "storage-driver": "vfs",
    "iptables": false,
    "bridge": "none"
}
```


Dockerのルートディレクトリを作成しておきます。

```bash:mkdir
sudo mkdir -p /volume1/@Docker/lib
sudo mkdir /docker
```

### Dockerデーモンの起動設定
Dockerデーモンの起動設定を行います。

SSH接続を有効化と同じ手順で、WebブラウザにてNASへ接続します。
![7_NASWeb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/d9e500ce-28ae-310a-e5a4-fb5293ad218b.png)

コントロールパネルを開き、「タスク スケジューラー」を選択します。
![8_ControlPanel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/f0405a39-f1bc-fd5f-0b83-80ed38b3341f.png)

「作成」→「トリガーされたタスク」→「ユーザー指定のスクリプト」を選択します。
![9_TaskScheduler.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/72445940-d1b4-dd79-3a8d-37f990381122.png)

『全般』タブは以下のような要領で入力します。
![10_TaskConfig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/ca8a5224-76e9-b250-dd15-f03e2fcbfff9.png)
タスク：なんでもOK
ユーザー：root
イベント：ブートアップ
プリタスク：指定なし
有効：非アクティブ（起動できなくなる恐れもあると思った為、動作確認に問題がなければ有効に切り替えます）

『タスク設定』タブは以下のような要領で入力し、「OK」を押します。
![11_TaskConfig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/ab36f508-ca41-bc5c-2777-d7678c701d74.png)
通知：お好みで設定してください
コマンドを実行：以下のコマンドを指定

```bash:dockerd
mount -o bind "/volume1/@Docker/lib" /docker
dockerd
```


「実行」を選択し、「はい」を選択します。
![12_TaskRun.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/1068311c-f470-899f-ccf0-804d9823cb93.png)

NASへSSH接続されたTerminalから以下コマンドを実行し、エラーなく出力されることを確認します。

```bash:docker
docker run hello-world
```

![13_HelloWorld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/393c2b03-7f9b-904f-6204-92e378d6fb67.png)

## 動作確認
WebブラウザにてNASへ接続し、タスクスケジューラーにて先程作成したタスクを有効化します。
![14_TaskEnabled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/27211b17-bac4-c4a5-d878-175843350d39.png)

NASを再起動します。
![15_reboot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/a78959cf-3924-478c-6d8d-566b3dcf02de.png)

再起動完了後、TerminalからNASへSSH接続し、以下コマンドを実行し、エラーなく出力されることを確認します。

```bash:docker
docker run hello-world
```

![13_HelloWorld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/393c2b03-7f9b-904f-6204-92e378d6fb67.png)

以下コマンドを実行し、/dockerディレクトリ内が空でないか確認します。

```bash:ls
sudo ls /docker
```

![16_Exist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1564963/18a2bc48-e50d-ec5f-9761-78f9396a8f1f.png)

以上で完了です。
お疲れさまでした。