LoginSignup
1
2

More than 3 years have passed since last update.

QNAPのContainer Station用private registryとimage作成

Posted at

QNAP上でちょっとした個人的なDockerコンテナを動かしたいなと思ったので、それらの記録です。
あまりDockerに詳しくはないので、もっと良いやり方があるかもしれません。

目標

  • QNAP上で独自にbuildしたコンテナを動かす
  • イメージは公開しない状態で使えるようにする
    • QNAP上にprivate registryを立てて、そこにイメージを置く

前提

使用した機器はTS-231Pです。もうちょっと新しい良いものが欲しかったのですが、予算の都合的に。
また、ひとまず動作させるまでの記録なので、細かいセキュリティ的な設定等については触れません。

private registryの稼働

QNAPのContainer Station自体の設定については他にも書かれている方がいますので、特に触れません。
Container Stationを開いて、「作成」ページから "registry" で検索すればDocker Hub公式のイメージが見つかると思います。
今回は特にこだわりとかもないので、これを単純な形で使います。検索したところはこんな感じですね。
01.PNG

このイメージをインストールして起動すると、こんな感じで「概要」ページに表示されます。
02.PNG

上のスクリーンショットで黄色でマークしてあるコンテナ名をクリックすると、private registryのURLとポートが表示されます。
後ほど開発環境で作成したイメージをここにpushすることになります。
03.PNG

独自イメージの作成

さて、次に独自のイメージを開発環境で作成します。
これもまた、基本的にはコードを書いたりエントリポイントを用意して、Dockerfileからbuildするという基本的な所は他にも書かれてる方が沢山いるので割愛。

ARM版のイメージ作成

今回使用した機器のCPUは、cortex-a15です。要は32bitのARMアーキテクチャですね。
開発機にはx86_64を使っている人が大半でしょうから、先に作ったDockerfileでbuildしたイメージは普通に考えたらQNAP上に持っていっても動かないわけです。
ということで、ARMアーキテクチャベースのイメージを元に、イメージを作り直します。

この辺りについてはこちらの記事を参考にさせていただきました。"binfmt_misc のセットアップ" の所と "build" の箇所ですね。

1. ベースイメージの選択

上記の記事と基本的に同じ内容になってしまうのですが、見やすさの為に記述しておきます。

multiarchというリポジトリで、qemu-user-staticが組み込み済みのイメージを色々と公開されています。
今回自分はalpineを選択したので、そちらのディレクトリを開きます。

2. binfmt-supportの設定

Usageに書いてありますが、まずはbinfmt-supportの設定をdocker hostにするため、コマンドを実行。

$ docker run --rm --privileged multiarch/qemu-user-static:register --reset

3. build

続いて、同様にこちらで公開されいてるARM用のイメージを元にbuildします。このbuildについてはUsageには載っていませんが、先に触れた参考にさせてもらったblogでその様な事をしてますね。
DockerfileのFROMをこんな感じで書き換えてやります

- FROM python:3.8.2-alpine
+ FROM multiarch/alpine:armhf-edge

この例だと、とりあえず諸々Dockerfileを作り込む時は python:3.8.2-alpine で作っておいて、ARM版イメージを作るときは multiarch/alpine:mrmhf-edge に置き換えたということですね。
まあ、この例だと後者にpython周りをインストールするための設定が追加で必要になりますが。

ともあれ、buildします。

$ docker build . -f Dockerfile --tag 192.xxx.yyy.zzz:nnnn/my-private-image

tagには (private registryのホスト:port)/(イメージ名) の形で設定します。イメージ名はお好きなように。
これが無事に完了すればQNAP上で動くイメージの完成です。

4. insecure_registry

最初の方で見たとおり、private registryのURLはhttpとなってますので、pushする前にinsecure_registryの設定をします。
/etc/docker/daemon.json に下記のような設定を加えます。

{
  "insecure-registries": ["192.xxx.yyy.zzz:nnnn"]
}

既に他の設定のオブジェクトがある場合は、そのオブジェクト内に追加してやる形で大丈夫です。

5. push for private registry

諸々準備ができたので、作成したイメージをprivate registryにpushします。

$ docker push 192.xxx.yyy.zzz:nnnn/my-private-image

こんな感じですね。

作成したコンテナの起動

1. pull

QNAPのContainer Stationに戻りまして左のメニューから「画像」を開きます。これは「image」を訳した結果、そうなってしまったんでしょうね…。要はイメージの管理ページがここです。
右上にある「プル」を開きます。
04.PNG

pullしてくる対象のレジストリを選択出来るようになっているので、ここでprivate registryを追加します
05.PNG

名前とURLを記入します。ユーザー名とパスワードについては特に認証とかつけてないので、今回は不要です。
06.PNG

追加したら、レジストリをprivate registryに設定し、画像名(イメージ名)を入力します。先の例でいくと、 my-private-image ですね。
09.PNG

右上のバックグラウンドタスクが終われば、pullは完了です。
07.PNG

2. コンテナの作成

メニューの「作成」から検索しても出来ますが、よりお手軽な方法として、pullしたイメージのアクション列にある「+」ボタンからもコンテナを作成できます。
08.PNG

ホストとボリュームを共有したい場合などの設定は、詳細設定からできるようになっています。

概要ページに戻って、無事に起動されていれば完了です。

今後の課題

とりあえず最初の要件は満たせましたので、次はホストとコンテナとの共有フォルダをどうにかしてNASユーザーのディレクトリにすることですかね。
あと、もっとスマートな方法があればそちらに切り替えるとか。
ひとまずはこれで好き勝手出来そうなので、色々動かしてみようかと。

binfmt_misc辺りがちゃんとわかってないので、そこら辺を理解しておく。

後記

書き終わってから気づいたんですが、無理にx86_64の開発環境でbuildしなくても、QNAPにsshでログインして、そこでbuildすれば普通にARM環境でそのままbuild出来たんじゃないだろうか。dockerも既に入っている訳だし。
多分、これが今回の目的では一番楽な方法だった気がする。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2