QNAP TS-228A で Docker Registry をつくる

QNAP
この記事は約10分で読めます。

QNAP TS-228A のコンテナ機能を使用して、 Docker Registry をつくる手順を記載しています。

どうも、ごえごえです。我が家のデータのほとんどは数年前に購入した QNAP の TS-228A という NAS に保存してます。ここから写真やビデオのバックアップを Amazon Photos だったり、Google フォトにバックアップしたりしています。昔と比べて動画をストリーミングで見ることが多くなったためか、数TB 単位で容量が余っているので、 NAS をなんとか(諸事情もあり)有効活用できないか考えていました。

もんちゃん
もんちゃん

ふーーん、あんなに必要だといって 3TB 買ったのに余ってるのね

ごえごえ
ごえごえ

ただちに有効活用します!

なんと、QNAP TS-228A は Container Station というアプリケーションを使用することで LXC や Docker を使うことができます。

ただし、TS-228A はエントリーモデル。搭載メモリは 1GB で CPU が ARM なんです。気軽に Docker 使うにはどうしても微妙で、これまで何度も Docker で何か起動してはメモリが足りなくなり停止していてイマイチ活用できてません。

そこで、今回はそれほど負荷がかからずにストレージとしての役割も果たせそうで、なにより Docker Hub だと Private Repository が 1つまでという制限も回避できるだろう。

ということで、QNAP にプライベートレジストリ環境として Docker Registry を作ってみました。

QNAP ファームウェアバージョン

QTS は バージョン 4.4.1.1216(2020/02/14) で記載してます。

スポンサーリンク

Docker Registry のインストール

Docker Registry 用ディレクトリの作成

Docker Registry で使用するディレクトリを「FileStation」を起動して作成します。ここでは例として「DataVol1/Container/docker-registry」というディレクトリを作成してます。

Container Station の起動

QNAP の Web GUI にログインしてデスクトップの Container Station を起動します。

もしも、インストールされていない場合は、App Center の「ユーティリティ」からインストールしてください。

registry のインストール

Container Station が起動したら、「作成」をクリックし検索スペースに「registry」と入力します。

検索結果で Docker 公式の 「registry」が表示されると思いますので、「インストール」をクリックします。

「バージョン」で「latest」を選択するとARMが選択されます。

免責が表示されるので確認して「OK」をクリックします。

「コンテナの作成」で「名称」や「メモリー制限」を任意で設定後、「詳細設定」をクリックします。

名称やメモリー制限を設定(ここでは256MBに設定)

「ネットワーク」で「ネットワークモード」を自身の環境に適切な設定にします。よくわからなければ一旦は「NAT(bridge)」を選択でいいと思います。ホスト側のポートも任意です。

ホストのポートを設定する(ここでは5555を設定している)
ポートフォワーディング設定でホストのポート

QNAP で既に使われているポートを指定した場合、自動で別のポートに変更されます。QNAP に ssh で接続して netstat -na | grep [自身が使用したいポート] など確認しておくとポートが重複せず、予期しないポートに設定されることを防ぐことができます。

「共有フォルダ」で「ホストからのボリューム」に事前に作成していたディレクトリを指定します。「マウントポイント」は /var/lib/registry を設定します。

「詳細設定」をクリックして「コンテナの作成」画面に戻り「作成」をクリックします。サマリが表示されるので内容を確認して「OK」をクリックします。

「Container Station」に戻り、左ペインの「コンテナ」でインストール後の状態を確認することができます。ポート番号や起動状態などを確認しておくといいです。

Docker イメージの作成

Docker イメージのダウンロード

実際に Docker Registry が使用できるのか確認するため、Docker がインストールされた端末で Docker イメージを作成します。今回は ubuntu 18.04 を pull して Docker イメージを作成しています。

Docker 実行環境情報
  • MacOS 10.15.3
  • Docker Desktop 2.2.0.3 (42716)
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
423ae2b273f4: Pull complete
de83a2304fa1: Pull complete
f9a83bce3af0: Pull complete
b6b53be908de: Pull complete
Digest: sha256:04d48df82c938587820d7b6006f5071dbbffceb7ca01d2814f81857c631d44df
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               72300a873c2c        2 weeks ago         64.2MB

Docker イメージの起動とアプリケーションのインストール

ダウンロードしたイメージを起動して、apt-get update を実行します。その後で今回は iproute 2 をインストールしてみます。

$ docker run -it ubuntu:18.04 /bin/bash

$ apt-get update

$ apt install iproute2

$ exit

Docker イメージの作成

docker commit コマンドで個別にアプリケーションをインストールした Docker イメージを作成します。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
07c5fd4dae88        ubuntu:18.04        "/bin/bash"         5 minutes ago       Exited (0) 48 seconds ago                       nifty_beaver

$ docker commit 07c5f iproute2
sha256:4c0aab89bb6c154c35553379ddd

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
iproute2            latest              4c0aab89bb6c        25 seconds ago      95.7MB
ubuntu              18.04               72300a873c2c        2 weeks ago         64.2MB

作成したイメージを起動して確認

新しく作成したイメージを起動して iproute2 のインストールがされていることを確認します。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
iproute2            latest              4c0aab89bb6c        25 seconds ago      95.7MB
ubuntu              18.04               72300a873c2c        2 weeks ago         64.2MB

$ docker run -it iproute2:latest /bin/bash

root@79b94b270f6e:/# ss   ← 実行ができることの確認
Netid              State                Recv-Q                Send-Q                                Local Address:Port                               Peer Address:Port

$ exit

Docker イメージにタグ付け

Docker イメージに以下の手順でタグ付けします

$ docker tag iproute2 192.168.1.200:5555/ubuntu-iproute2

$ docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
192.168.1.200:5555/ubuntu-iproute2   latest              4c0aab89bb6c        19 minutes ago      95.7MB
iproute2                             latest              4c0aab89bb6c        19 minutes ago      95.7MB
ubuntu                               18.04               72300a873c2c        2 weeks ago         64.2MB

Docker Registry へアップロード

作成した Docker Registry へアップロードします。

$ docker push 192.168.1.200:5555/ubuntu-iproute2
The push refers to repository [192.168.1.200:5555/ubuntu-iproute2]
6a2f5d2f78a7: Pushed
1852b2300972: Pushed
03c9b9f537a4: Pushed
8c98131d2d1d: Pushed
cc4590d6a718: Pushed
latest: digest: sha256:aaab1eab88e550d9e637b0473cc346095c89dcb08e5b1f9bd4f2743129dd6615 size: 1364
push 時にエラーが出る場合

push 時に 「http: server gave HTTP response to HTTPS client」といったエラーが発生する場合があります。MacOSの場合は「~/.docker/daemon.json」に以下のような記述を行い docker の再起動を行うと push が可能になります。

$ cat ~/.docker/daemon.json
{
  "debug" : true,
  "insecure-registries" : ["Docker RegistryのIP:ポート番号"],
  "experimental" : false
}
Docker の再起動