MariaDBのホスティング実践ガイド

はじめに

少しだけ実験を行った結果、最新の安定版MariaDBをContainerStation上で稼働させることに成功し、学んだことを共有したいと思います。導入が正常に完了したことを確認するため、このプロセスでは以下のことも行いました:-

  • 専用サービスユーザー「backup」を作成し、その役割に応じて権限を制限
  • PHPMyAdminを使ったリモート接続の確立
  • テスト用データベースの作成とテストバックアップの実施
  • テスト用データベースからレコードを削除し、テストリストアの実施
  • データベースバックアップを自動化するためのスクリプトの作成とテスト
  • スクリプトをQTS標準のスケジューラー(crontab)に登録し、完全自動化

この最初の投稿に続いて、プロセスを段階的に解説する「返信」シリーズを掲載します。

読む前に重要な免責事項です:私はQNAPやMariaDBの社員ではなく、プロのDBAでもありません。SSHを使った(Linux)コマンドライン作業や実験に慣れている、そこそこ技術に自信のある一般人です。これから説明する要素の専門家ではありませんが、十分に試行錯誤してすべて動作させることができました。このガイドを読む際はその点をご理解ください。そして、もし誤りや改善点を見つけたらぜひ返信してください。また、以下の内容は事実として間違っていません(ここで説明する通りに動作させたため)**ですが、このガイドが最善の方法を定義するものではありません。これはあくまで出発点、または足がかりとして、概要を把握し、今後どこをどう探求するか考えるためのものです。インターネット上の投稿者からアドバイスを受ける場合は、必ず情報源を考慮してください。

さて、楽しい作業に入る前に、重要な3つの質問を問う必要があります。まず1つ目は:QNAPはすでにQTS上でネイティブアプリケーションとしてMariaDBを提供しているのに、なぜContainerStation内にインストールする必要があるのでしょうか?それは不要なオーバーヘッドでは?

これは重要な疑問であり、正当な理由がある場合のみ先に進むべきです。要点として、この疑問に対する肯定的な回答は主に以下の3つです:-

  • インストール時点で、近い将来MariaDBインスタンスを他のハードウェアプラットフォームに移動する必要があると分かっている場合—コンテナをエクスポートして別の場所に持っていき、インポートする方が、複数回インストールしたり、複数のデータベースをアーカイブ・リストアするよりはるかに簡単です…
  • MariaDB上で展開したいアプリケーションが、QNAP/QTSネイティブ版のAppでは利用できない機能を必要とする場合。(私の場合がこれに該当—BookStackを使い始めたのですが、utf8mb4文字セットを使いたい。しかしQNAPが現在サポートしているMariaDBのバージョン[執筆時点では10.5.8]では利用できませんでした)。
  • NASが本番やミッションクリティカルな用途で稼働しておらず、実験しても安全な場合—または、関係する管理者から許可を得ているか、自分にその権限がある場合。[これから行うこと自体は危険ではありませんが、念のため安全を期しましょう]。

2つ目の質問は:ContainerStation以外にどんな選択肢があるのか?

調べたところ、主な選択肢は2つ:MariaDBを他のホストで稼働させる、またはContainerStationの代わりにQNAPのVirtualizationStationを使うことです。本題から逸れるのは避けたいですが、この2つの選択肢についても触れておきます:-

  • 私は、データ保護(RAID-6ボリューム、強力なUPSで稼働)を重視してQNAP NAS上でMariaDBをホストし続けることを選びました。どんな「第2の」ホストであっても、ハードウェアやOS・スタックの管理が増え、電力消費も増えるからです。
  • VirtualizationStationも試してみましたが、とても興味深く、今後さらに実験する予定です。メリットとしては、オーバーヘッドなしで別ハードウェアのように運用でき、MariaDBのバックアップや管理が簡単になり、脆弱性管理やアップデートも効率化できます…デメリットとしては、脆弱性については他の方法でも対応可能…そしてVSContainerStationよりNASリソースをかなり消費します。

あなたのユースケースはほぼ確実に異なる—おそらく唯一無二—なので、ここで紹介する方法を導入する前に、本当に自分に合っているか確認してください。特に、ContainerStationで稼働するコードのパッチ適用の複雑さについても考えてください。あなたの環境が高リスクなら、その点を慎重に検討してください。

それでは、ここまでで気持ちが折れていなければ…始めましょう!

詳細なご共有、本当にありがとうございます!私たちのコミュニティには、このような役立つ貢献がもっと必要です。

また、社内チームにもあなたの設定をもとに構成をテストするよう依頼します。

改めて、あなたのご尽力とご貢献に心より感謝いたします!

00a. 始める前に – 準備と警告

まずは警告から始めましょう:

ここにはドラゴンがいます。

このガイドを完全に実装するには、QNAP NASにSSHでアクセスすること(ウェブ管理インターフェースも使用)、ローカルインフラの編集(具体的にはcrontab、場合によってはローカル共有)、さらにNASにソフトウェアを展開・設定する必要があります。

これらすべての作業に完全に自信がない場合は、ここで止めてください*.*

このガイドに記載した手順はすべて私自身の環境でテスト済みです…そして私の環境では問題なく動作しています。念のため、私がこのノートを作成する際に使用した構成要素を明記しておきます:-

  • QNAP NAS – 私の場合はTVS-672XTの一台を使用、QTS 5.2.7.3256を実行中

  • デスクトップワークステーション – 私の場合は自作PCでMint Linux 21.3を実行

  • PHPMyAdmin 5.2.1 のコピー – 私の場合はRaspberry Pi (4B)上で稼働
    \[もちろん、PHPMyAdminの代わりにMySQL Workbenchなどを使っても問題ありません – 基本的にはテスト用DBを作成し、テーブルとダミーレコードをいくつか追加できるクライアントが必要なだけです\]

  • QNAP NAS上の非“Admin”アカウント。QNAPの基本的な管理作業には専用のアカウントを使っていますよね?まさか工場出荷時の“Admin”アカウントをすべてに使っていて…何か予期せぬトラブルが起きたときにNASにアクセスできなくなるリスクを負っていませんよね…?念のため確認です…

  • 固定IPアドレス。MariaDBコンテナに専用(固定)のIPアドレスを割り当てます。これはDHCPリースが切れて異なるIPアドレスが割り当てられた場合にクライアントマシンの再設定を避けるため、そしてもちろんMariaDBへネットワーク上の他のホストからもアクセスしたいからです(QNAP NAS自身からだけでなく)。

00b. 始める前に – データ収集の要件

重要な質問をしましょう。コンテナベースの技術のポイントは、コンテナイメージが自己完結型であり、プログラムを実行するために必要なものがすべて含まれていることです。そして、その結果としてコンテナの境界は越えられないように設計されていますが、MariaDBのデータを正確にどのようにバックアップするのでしょうか? 今のところ、この質問に対する答えは3つ見つかりました:-

  • コンテナ全体を停止し、それをエクスポートしてtarファイルにする——そして、そのtarイメージを従来型(例:HBS3)のバックアップソリューションに登録するか、別のNASや外付けドライブなどの別の場所にコピーします。これは完全に信頼できますが、バックアップ処理中は実行中のすべてのデータベースにアクセスできなくなるということです——データベースが多いほど、データセットが大きいほど、そのダウンタイムは長くなります。

  • 実行中のデータベースに対してmariadb-dumpコマンドを実行(これにより時間が短縮され、ファイルサイズも小さくなります)、その後「docker cp」コマンドを使って抽出ファイルをコンテナの境界を越えてネイティブなQTSファイルシステムにコピーします。これも同じくらい信頼でき、場合によっては少しだけ速いですが、データベースごとの「.sql」ダンプファイルで節約されたディスク容量の一部は、2つのバックアップファイル(MariaDBコンテナの抽出ファイルと、MariaDBコンテナの抽出ファイル)ができてしまうため、追加の整理作業をしない限り失われるかもしれません。

  • 最後に、コンテナを作成する時点でその時だけ、コンテナのファイルシステムとネイティブQTS(NAS)ファイルシステムの間に論理的かつ恒久的なブリッジを作成することができます。これにより、2番目の方法と同様のmariadb-dumpコマンドを実行できますが、出力ファイルをコンテナ内にローカルコピーを作成し「docker cp」でファイルをコンテナ境界を越えてコピーする必要なく、直接ネイティブQTSファイルシステムに書き込むことができます。要するに、技術的には最もシンプルな解決策ですが、2つのファイルシステム間に恒久的な「ブリッジ」が作成されます。

もちろん、この決断をあなたの代わりに下すことはできません。しかし、もし3番目の選択肢——私の個人的な選択——を取りたい場合は、インストール済みのMariaDBコンテナ内の実際のファイルシステムについて情報を得る必要があります。そうすれば、ファイルシステム「ブリッジ」のリンクポイントが分かり、MariaDBコンテナを作成する前にその情報が必要です!しかし、そのためには、公式のMariaDBコンテナの「内部」を見る必要があります——そして、これを実現する可能性のある2つの方法を見つけましたが、実際に動作したのは1つだけでした。

動作しなかった方法(ご自由に試してみてください)は、Docker APIを実装したスクリプトを使い、それでイメージを抽出することです。こちらが私が試して動かなかったものへのリンクです。これはDocker APIを使ってDockerイメージをローカルファイルシステムにダウンロードしますが、docker自体をインストールする必要はありません。もしかしたら、あなたは私よりもうまくいくかもしれません…

私の解決策はもう少し手順が多いですが、シンプルで信頼できます:dockerからMariaDBのパイロットインストールを行い、インストールされたイメージを調べて必要な情報を取得し、その後イメージをアンインストールして、今度は作成時に必要なパラメータを含めてクリーンインストールします。

正直なところ、3rdパーティスクリプトソリューションの初期トラブルを乗り越えるくらいなら、Docker Hubから直接「パイロット」デプロイを行ったほうが良いかもしれません。ご自身のやり方でどうぞ。

ContainerStationでコンテナを作成した後は、3番目のオプションへの切り替えや、そこからの変更は、そのコンテナを削除して再作成するしかありません。ですので、ぜひ慎重に判断してください…

このガイドの残りの部分では、3つの選択肢すべてについて説明しますので、それぞれの説明部分には特に注意して読んでください。

01. 正しいMariaDBコンテナの選択

MariaDBチームがサポートされているすべてのバージョンごとに1つのコンテナイメージファイルを用意していることは、驚くことではないでしょう。これにより、作業を始める前に答えるべき重要な3つの質問が生まれます。

  • インストールしたいMariaDBのDockerイメージが公式のファイルであり、悪意を持って改ざんされたコピーではないことをどうやって確認できますか?

  • 実際にインストールする必要があるMariaDBの特定バージョンはありますか?

  • インストールしたいMariaDBのバージョンが決まったら、ContainerStationにどのバージョンを指定すれば、正しいものがデプロイされるのでしょうか?

最初の質問は最も簡単です。ContainerStationは、すべてのDockerイメージファイルを「hub.docker.com」(公式Dockerリポジトリ)から直接取得するようにハードコーディングされています。ContainerStationがそれを確実に行うことを信頼できない場合は、恐縮ですがここで読むのをやめることをお勧めします。その懸念に対応することは本ガイドの範囲外だからです。

2つ目の質問については、あなたの利用ケースによって答えが異なるため、私から明確な答えはできません。しかし、いくつかのヒントを共有できます。これから見ていくように、MariaDBイメージファイルの管理者は、特別な名前を持つ2つのイメージ「mariadb-latest」と「mariadb-lts」を用意しています。「lts」は「Long Term Support(長期サポート)」を意味します。もし最新の安定リリースや長期サポート版が必要な場合は、これら2つのイメージから選択してください。

特定の(しかも公式!)MariaDBイメージの入手可能性を確認するには、まずブラウザで新しいタブを開き、「https://hub.docker.com/」にアクセスします。もしこの文の直前のURLがアクティブなハイパーリンクになっている場合は、必ずブラウザのロケーションバーとサイト証明書を確認し、公式Dockerサイトであることを確かめてください。そこに到着したら、目的のデータにたどり着く方法は2つあります。

1つ目は、ホームページの左側のガター部分を見ることです。「Trusted content」というセクションに「Docker Official Images」というタイトルのリンクがあるはずです。私が2025年11月にそのリンクをたどると、「1 – 30 of 178 available results」から始まる「検索結果」ページに移動し、MariaDBイメージは6行目に表示されます。あるいは、ウェブサイトの検索バー(上部の水平メニュー/ナビゲーションバー)を使い、「MariaDB」と入力して検索することもできます。

実際には、Docker Hubには複数のMariaDBパッケージ(例:「mariadb」、「mariadb/maxscale」など)が提供されています。選択すべきは最初の「mariadb」です。ロゴのアザラシが茶色で、名前「mariadb」の右側に青緑色のロゼットと「Docker Official Images」というラベルが付いているのが目印です。執筆時点で、このアイテムの最初のメタデータ(「Pulls」)には10億回以上ダウンロードされたと表示されています。これが必要なパッケージです。

名前をクリックすると、この「メイン」のMariaDBイメージのさまざまなリリースバージョンに関する詳細情報ページに移動します。ページ見出しのすぐ下に「Overview」と「Tags」の2つのタブがあります。

デフォルトで選択されていなければ「Overview」をクリックし、「Supported tags and respective Dockerfile links」という60以上のハイパーリンクのブロックに注目してください。よく見ると、この表のエントリの1つは必ず「latest」、もう1つは必ず「lts」(Long Term Support)となっています。「LTS」バリアントを探している場合、このページには「lts」が名前の一部として含まれるバージョンが3~4つあるかもしれません。「lts」だけの名前のファイルは1つだけなので、「Ctrl-F」で検索する場合は正しいバージョンにたどり着くまで「次へ」を押し続けてください。要件に応じて、このページのいずれかのリンクを選択してクリックします。必ずしも「latest」や「lts」である必要はなく、特定バージョンが必要な場合はそのバージョンを選んでください。リストは最新/先端バージョンが最初に表示され、年代順に古いものが逆順で並んでいます。(ちなみに、QNAPがサポートする「現行」バージョン10.5.8はこのリストの下の方に消えています… だからこそDockerが選択肢としてあるのは良いことですね!)

執筆時点で「latest」をクリックすると、ブラウザはGitHubページにリダイレクトされ、そのイメージの生のDocker設定/マニフェストファイルが表示されます。そこで「version」を検索語としてテキスト検索(ブラウザでCtrl-F)できます。うまくいけば、「# OCI annotations to image」という見出しのブロック内でカーソルがハイライトされるはずです。このブロック内に、次のような値を持つパラメータがあります。

org.opencontainers.image.version=“12.0.2” \\

これにより、「mariadb:latest」を指定すると現在はデータベースのバージョン12.0.2がインストールされることがわかります。これをメモしておきましょう。後で期待通り動作するか確認できます。もちろん、他のバージョンが必要な場合は、DockerHubの前述の「Overview」ページで明示的な「バージョン付き」パッケージから選び、上記の検証手順で選択したパッケージのマニフェストが必要なバージョンと一致するか確認できます。また、インターネット上には他にもDockerリポジトリがあり、ContainerStationはローカルにダウンロードしてキャッシュしたコンテナのインポートも可能ですが、最初に挙げた質問の1つは、正規のコードをダウンロードしマルウェアを避ける方法についてでした。

この質問への答えはこうです:ContainerStationのインポート機能(これはDockerHubに“ハードコーディング”されています)を使い、公式MariaDBイメージをリポジトリから取得することを確認しています。

重要なポイントは、前述のページに記載されている「タグ」の**正確な**テキストこそが、ContainerStationにインストールしたいMariaDBのバージョンを指定する際に必要な要素であるということです。これがどのように機能するかは、次のセクションで説明します。

02. QNAP App StoreからContainerStationをインストールする

Web管理画面からQNAP NASにアクセスします。認証が完了したら、「App Center」アプリケーションを探してください。これはデスクトップにピン留めされているか、「メインメニュー」からアクセスできます。QTS 5.2.7の場合、Web管理画面の左上にアイコン(横三本線)が表示されています。

「AppCenter」を開いたら、左側のメニューから「ユーティリティ」をクリックし、「Container Station」を検索します(デフォルトでは、各カテゴリ内のアプリはアルファベット順で並んでいます)。

青地に白の「インストール」ボタンをクリックします。

簡単です。

ネットワーク速度にもよりますが、コードのダウンロードとインストールには数分かかる場合があります。インストールが完了すると、アクティベーションボタンが青地に白の「インストール」から白地に青の「開く」に切り替わります。

03. ContainerStationの初回起動とデータボリュームの選択

免責事項 – ここでは明確な手順を示すことはできません。なぜなら、あなたがContainerStationをインストールするQNAP NASの基本的な構成や、ボリューム、LUN(論理ユニット)などの設定方法によって、取るべき具体的な手順が異なるためです。

重要: NASの構成がよく分からない場合は、先に「コントロールパネル」に進み、「システム」グループ内にある「ストレージ & スナップショット」というアプレットを探してください。ここで、ドライブが初めて追加され、初期設定された際に指定されたNASの低レベル構成の概要が確認できるはずです。私の場合は「DataVol1」と名付けた単一のボリュームがあり、これは6台のWD Red 12TbドライブによるRAID6アレイです。「ストレージ & スナップショット」で単一ボリューム以外が表示された場合は、NASを構成した方に「/Container」フォルダーをどこに保存するのが望ましいか、強く確認することをおすすめします。特に、今後データベースエンジンをインストールする予定があるため、ストレージの使用量が大きくなる可能性を考慮する必要があります。この段階を進む前に、「/Container」をどこにインストールすべきかを必ず確認してください。

ContainerStationのアイコンをクリックして起動します。「ようこそ」バナーが表示され、その下に次のようなテキストが表示されます:-

Container Stationへようこそ

Container Stationは、すべてのイメージとコンテナをデフォルトで保存するために、File Stationに「Container」という共有フォルダーを作成します。

このテキストの下に、初期値が「/Container」に設定されたコンボ[ドロップダウン]ボックスが表示され、その下に「開始」ボタンがあります。私のNASは単一ボリューム構成なので、これが表示されます[他に選択肢がないため]。前述の通り、NASに複数のボリュームが設定されている場合は、ここで異なる選択肢が表示されるはずです。該当する場合は申し訳ありませんが、この部分はご自身で確認してください。共有フォルダーの正しい場所を特定し設定したら、「開始」をクリックし、スクリプトを最後まで実行してください。

私の場合、選択したボリュームがNASの主データボリュームなので、ContainerStationは必要に応じてサイズを拡張できる状態です。これは良いことかもしれませんし、リスクになる可能性もあります。例えば、ホストするコンテナ内のコードの信頼性や、ログファイルが自動的にクリーンアップされずに大量に書き込まれる可能性など、ディスクスペースを大量消費するリスクを考慮する必要があります。用途をよく考えた上で「/Container」共有フォルダーの配置場所を決めてください。

私の場合、ContainerStationのセットアップ時に、使用状況データの収集とQNAPへの送信に同意するかどうか尋ねられました。これは技術的な質問ではないので、私からは回答できません。ただし、QNAPが雇用主の所有物である場合は、あなた自身で決定できない可能性があることにご注意ください。

さて、この時点でContainerStationはインストールされ、設定され、ですが利用可能な状態です。起動すると、デフォルトで「概要」というホームページが表示され、コンテナ、アプリケーション、NASリソース(CPU、メモリ、「CPU使用率上位5位」のコンテナ)の内訳が確認できます。現時点では、すべて静かな状態になっているはずです。

04. MariaDBコンテナの作成

ここまで来たら、MariaDBコンテナの作成に直接進みたいと思うかもしれません…が、その前にいくつか質問があるかもしれません。

  • ちょっと待って – なぜ コンテナを作成 する必要があるの? そもそもここでやりたいのは、あらかじめ構築されたMariaDBのインスタンスを実行することじゃないの?

    いい質問です。Dockerの詳細な仕組みに関しては専門家ではありませんが、私の基本的な理解では、ローカル(空)のコンテナを作成し、そこに公式のMariaDBイメージを公式Docker Hubからダウンロードして投入するという流れです。

  • ちょっと待って – {お好みの技術系ニュースサイト}で、公開されているDockerライブラリの最大20%がマルウェア(例えばビットコインマイナーなど)に汚染されているという記事を読んだことがあるよ。あなたが今から案内しようとしているのが、あなた自身がアップロードしたマルウェア入りのイメージじゃないって、どうやって分かるの?

    さらに良い質問です。セキュリティを意識した考え方をしている証拠ですね。答えはとてもシンプルです – 私たちはContainerStationに取得したいイメージファイルの名前を伝えますが、イメージのURLを指定するのではなく、デフォルトのDockerリポジトリから直接取得します。 この仕組みによって、正規のイメージをダウンロードしているという安心感が得られるはずです。

ContainerStationウィンドウの右上には、青地に白字で「Explore」と表示されたコンボボックス風のウィジェットがあるはずです。下向き矢印をクリックしてドロップダウンを展開し、メニューから最初のオプション「Create Container(コンテナの作成)」を選択します。

「Create Container(コンテナの作成)」というタイトルのポップアップウィンドウが表示され、タブ1/3が「Select Image(イメージの選択)」としてマークされています。最初のタブのメインパネルには3つのコントロールがあります – BasicとAdvancedモードを切り替えるラジオボタンのペア、「Registry」とラベル付けされたコンボボックス、「Image」と名付けられたテキストボックスです。

まず、モードを**Advanced(詳細)**に変更します。MariaDBを起動する際にランタイムパラメータを渡す必要があるため、Advanced設定を使う必要があります。変更すると、「Registry」コンボボックスが「Docker image」と「LXD image」という2つのラジオボタンに置き換わります。ここは「Docker image」のままにしておきます(Docker形式のファイルをデプロイするため)。「Image」ボックス内のグレーのテキストには「registry/image:version」と書かれており、この「:version」部分が非常に重要です。

「Docker image」ラジオボタンは、スクリプトにイメージファイルの取得元としてDocker Hubを使うよう指示し、「Image」テキストボックスは、インストーラスクリプトにどのパッケージのどのバージョンをインストールするかを指定するためのパラメータです。

ここで、Docker Hubで検索して特定した該当イメージファイル名を指定します。例えば、私の場合「Image」フィールドに入力した値はmariadb:latestでした。

ただし、特定のリリースバージョンが必要なアプリケーションを実行している場合は、ここで希望するエディションを指定します。例えば、執筆時点でWebアプリケーションNextCloudはリリース31.0.10をサポートしており、その内部インフラ検証チェックでは「MariaDB >=10.6 かつ <=11.4」で最適に動作すると案内されています。したがって、NextCloudをホストしたい場合は「mariadb:11.4」や「mariadb:11.4.9」などの値を使います。

必要なバージョンを指定したら、ウィンドウ右下の「Next(次へ)」をクリックします。するとインストーラが「retrieving information(情報取得中)」というポップアップバナーを一瞬表示します – これは、指定したイメージがDockerHubに存在するかどうかを検証しています。

ウィンドウが「1. Select Image(イメージの選択)」から「2. Configure Container(コンテナの設定)」に進み、新たに入力すべき項目が多数表示されるはずです。

最初の項目は**「Name(名前)」**です。これは、新しくインストールしたローカル「ContainerStation」環境で、このコンテナに付ける人間が判読できる名前です。この名前は少し考えて付ける必要があります – 「Xb17-123f」のような名前ではあまり役に立たないでしょう。もしこれが最初のコンテナで、今後複数作成する可能性があるなら、命名規則を決めておくことをお勧めします。以下は、構造化された命名フォーマットに含めると良い要素の例です:

  • コンテナの内容 – 複数のソフトウェアスタック(MariaDB、OpenLDAP、Jupyter、Plex、RStudioなど)を実行する場合は、名前に「MariaDB」など内容を含めると良いでしょう。

  • コンテナの用途 – これはプログラマー向けの[開発]用コンテナか、プレプロダクション検証やユーザーテスト用の[テスト]コンテナか、本番環境用か、あるいは緊急時用の[バックアップ]インスタンスか? 1文字のラベルを付けると一目で分かります。

  • 内容のバージョン – このガイドに従ってQTSにバンドルされているより新しいMariaDBを使いたい場合は、MariaDB_P12-0-2のように名前を調整するのも良いでしょう。

  • 特定のアプリケーション専用のコンテナをデプロイする場合もあります – その場合はMariaDB_NextCloudやMDB_NCのように、アプリ名を含めると良いでしょう。

  • 最後に、どんな名前を選んでも、「docker」コマンドをシェルプロンプトで入力する際にこの文字列を正確にタイプする必要があることを覚えておいてください。あまり複雑にしすぎると、何度も入力することになるので大変です。

ことわざにもある通り「あなたはあなたらしく」で構いませんが、少しだけ考えてみてください。

次は**「Restart Policy(再起動ポリシー)」**です。オプションは「None(なし)」「Always(常時)」「On Failure(失敗時)」「Unless Stopped(停止するまで)」があり、デフォルトは「Unless Stopped」です。オプションの意味はほぼ自明でしょう。私はデフォルトのままにしました。公式Dockerドキュメントへのリンクも貼っておきますので、詳しく知りたい場合はご覧ください。

次は「Network Configuration(ネットワーク設定)」です。これは混乱しやすい重要な設定なので、少し掘り下げて説明します。画面上、「Exposed」ポートのフィールドが「3306/tcp」にプリセットされてグレーアウトしている可能性が高いです。ページ下部には「Container Port(コンテナポート)」を指定するオプションもあり、こちらもデフォルトで3306(MariaDB/MySQLの標準TCPポート)になっています。

ここで注意点… MariaDBの標準でないポートに変更した場合、コンテナを起動することはできますが、ネットワーク越しにデータベースへ接続できなくなる可能性が非常に高いです。これは、実際のMariaDBバイナリが他の設定ファイル(コンテナイメージ内に埋め込まれている)を使っており、ここで設定した値を反映しない場合があるためです。[免責 – 私の場合は反映されませんでした!] この値を変更する際は注意してください。実際にどのポートでMariaDBバイナリがリッスンしているかを確認する方法については後述します。専用のIPアドレスをコンテナに割り当てている限り、MariaDBのデフォルトポート3306を使うのが問題ないでしょう。

まだ「Next」をクリックしないでください – まだやることがあります…

05. Advanced Container Settings

Before we leave this page, we need to dig a bit deeper. Click on “Advanced Settings”, which you will find below the “Network Configuration”.

In this lowest level of detail, you should find a page broken down in to 7 vertically stacked tabs, named: Commands, Networks, Environments, Labels, Storage, Runtime and Resources.

Let’s now work through each of these in turn:-

Commands
Leave the “Command” and “Entrypoint” text boxes in their “default” settings, and make sure that the “Allocate interactive processes (-i) for the container” and “Allocate TTY prcoesses (-t) for the container” are both set to active. We are going to rely on these two parameters being set ‘on’ when we come to set up and manage the container once it’s running.

Networks - IMPORTANT
In my case I wanted to access this container via the default [10Gb] network port on my NAS… but if you have a model with multiple network ports and connections, this is where you can specify which of the network ports on your NAS that your Docker container should be visible to your network.

The “Preparation and Warning” notes at the beginning of this guide included a requirement for a static IP address, valid on the local network – and this is where that value will be used.

Change the ‘Network Mode’ radio button selector from “Default (NAT)” to “Custom”. Allow the drop-down Combo Box to remain in “bridge”, then scroll the window down to reveal a couple of additional parameters tucked away at the bottom.

One of these is a check-box with the label, ‘Use a static IP address’. Activate that check-box and the installation window will change to give a 3-row data box with ‘IP address’, ‘Subnet mask’ and ‘Gateway’ as labels for the 3 rows. You will hopefully find that the Subnet mask and Gateway are pre-populated and greyed out – this data is sourced from the main network configuration parameters of your NAS. You should also find out that some of the 4 digits of your IP address – specifically the network address portion are also pre-defined and greyed out. In my case I am using a Class B network with network address 172.16.0.0, so I have just 2 parameters to fill in. Update the values in the “IP address:” parameter to match the address you previously obtained.

{{ Edit to Notes - Added April 3rd, 2026 }}

There’s a non-obvious but critical consequence of the decision you make here regarding whether to explicitly identify IP Addresses for DNS Servers or whether you are happy to allow the container to simply adopt the default DNS values set at your NAS/host level.

Suppose there is a future time where you need to make changes to your local DNS infrastructure and further suppose that those changes require you to amend the IP addresses for your DNS Servers on your network. If you create a new container with the DNS Server IP addresses set to “NAS Values”, then when you need to come to change to a new DNS host IP address, the only way you can do this is at the Host NAS Level. Under the hood, Docker provides a DNS proxy service to running containers. It uses a hidden IP address (127.0.0.11) and the DNS resolver details in containers will be set to this value.

The consequence here is that if you use “host based DNS” in this way, then when you come to change your DNS host value, you have given yourself no option except to migrate ALL your containers at the same time.

Conversely, if you explicitly set your DNS Server IP Addresses manually at this step in the process, then you grant yourself the ability to migrate “one container at a time” to a different IP address, and/or set different containers to use different DNS Servers [should you have that requirement].

The catch here - something that is not obvious at container creation time, is that once you create your container, your DNS decisions are “hard-coded” and cannot be changed.

Does this matter? Well, only you can answer that question. But if, say, you have a mix of “Production” and “Test” containers running in a single Docker instance [which, if you’re limited with respect to hardware, is a perfectly reasonable approach], then you’re going to be forced to migrate both test and production environments at the same time. That seems a bit counter-intuitive.

Take a moment to ensure that you have this configured in a way that is appropriate for your environment and make sure to document what you have done and why.

{{ End of Edit }}

Environments – CRITICAL
You can think of this element as for the specification of environment [run time] variables that the container is going to pass to MariaDB as/when MariaDB starts up. The values of these variables are essentially secure – as they are only visible here and inside the container itself, but they are critical.

That’s because you must provide a root password to the docker image of MariaDB as part of the initial configuration. To do this, click the “Add New Variable” button at the top right corner of the page in this tab. The name of the environment variable we have to create is “MARIADB_ROOT_PASSWORD” and the value we select should be something that conforms to conventional password rules. If you miss this step, your Container will not start. [OK, disclaimer. I just exaggerated when I said that you must provide a root password here. That’s not strictly true. One of the other support options is “allow no password”. I chose to write the instructions as I did above because I don’t want to encourage anyone to do anything that is insecure. The right action to take here is to use a generator to produce a secure password and use that. Please take a moment to reflect on the sensitivity of the data your DB will host and the environment in which your NAS operates. As I’ve noted before: “You do you”.

Labels
We’re going to leave the settings of this tab to their default values

Storage – IMPORTANT
In the section of this document with the title, “00b. Before We Get Started – A Data Gathering Requirement”, we considered the question of whether or not we want to create a permanent connection between the container’s internal file system and that of the NAS itself. This is where you get to decide which approach you will take.

If you’re currently performing a “pre-install” for “Option 3”…
– that is to say, deploying the MariaDB container so that you can jump in and have a look around, so that you know where to make a connection to your NAS file system, or if you’ve decided that you want to keep your MariaDB container completely isolated, you can skip Storage and leave it blank – simply jump down these notes to “Runtime” and continue.

If you’re currently performing the “second/full/final install” for “Option 3”…
– and/or you have otherwise determined the location of a folder within the MariaDB container that you wish to permanently “bridge” to the QTS file system, this is where you make that configuration. Please note: you can only make this decision at installation time – once “built” you cannot go back and edit this part of your container’s configuration. Whatever you decide here will be “final” for this particular container.

After selecting the “Storage” tab, click the “down arrow” to the right of the button labelled “Add Volume”. A pop-up window should appear below the button with three options in it – “Add Volume”, “Add Volume from Container” and “Bind Mount Host Path”. Select “Bind Mount Host Path” and note that a second “bind pair” appear in the main section of the window. This one will be differentiated with a small yellow “folder” icon – which signifies that it related to a folder native to QTS on the NAS. Click on the yellow folder icon and use the window which shows a path to actual, existing folders on the host NAS file system. Navigate through the file system until you select the remote endpoint that you want to be able to connect to from within your container. Ideally, you should make sure that the folder you select is part of an existing backup regimen – for example is enrolled within one of your existing HBS3 backups. Of course, you don’t need to have the QTS folder enrolled in an HBS3 backup before you add a MariaDB container, it’s just that if you want your exported .sql files to be archived, including the destination QTS folder in an HBS3 backup is the simplest way to do it.

Click in to the final data field, “Container:” and provide the path name to the location within the container on which we wish to mount the remote file system. (For users familiar with the soft-link operation of Linux, using the command “ln -s”, this is effectively the same thing). In our case, because our future selves were so helpful, we know that the internal folder we want to use is /var/backups. [Warning: if you’re reading this and preparing any version of MariaDB that is not 12.0.2, you really should be ignoring this hint and performing your own pre-install to check. Just saying].

Runtime
This tab controls the way that ContainerStation will spawn threads that execute the code in containers. Because ContainerStation is designed to operate three different types of container, this tab allows an administrator to help ContainerStation better understand how to interact with the executable code within. As we’re using a Docker image, we can let this remain with default values.

Resources
This tab allows you to decide whether you want to apply “upper limits” to the amount of hardware resource you are willing to allow this specific container to consume. It is likely to be very useful on larger NAS units and those with many users, because you probably don’t want one container to draw down all the available performance of the NAS. However, since this is going to be specific to your operating environment, there is no easy or obvious suggestion to make here. MariaDB recommend a minimum of 1Gb of RAM for basic operations. Stipulating CPU limits is going to be much harder, because different NAS models will have different CPUs installed.

If in doubt… either seek advice from an administrator, or try this as a rule-of-thumb… If you switch to “Limited” for any of the 3 options, the range of values will be pre-set based on your local hardware. Have a think about the range of users, workload and other applications running on the NAS in question and think about how much of the available performance you would be comfortable allocating to this one solitary container if it was “working hard”. In my case – a TVS-672XT used as a “home office” hub, I set limits at 25% of available resources across the board – and that has proven to be more than enough. Doing so gives me the confidence that even if my MariaDB container were to “go sideways” with a looping process, it will not kill my entire NAS – and, crucially, it will leave me with enough capacity/bandwidth to get in and figure out what is going wrong.

When you’re ready, click Finish.

In the background, ContainerStation will now download the “Mariadb:Latest” image from Docker Hub and then apply the various configuration parameters that we specified during the “create” process.

If we switch from the “Overview” tab of ContainerStation’s main display to “Containers” [via the left-side gutter margin], we should now see a single row in the main panel of the page, with a “Type” value of “Docker”, a “Name” value that matches the one provided earlier, and additional parameters – “Status”, “Application”, “Image”, “IP Address”, “Created On” and “Actions”.

At the bottom of the display we should also see a pair of tabs, “Logs” and “Status”.

If everything went [reasonably] well, then in the “Status” column of the table of containers, we should see a circular green icon and “Running”. Earlier in these notes, I mentioned that there was a way of checking to find out which TCP port our Docker instance of MariaDB was listening on – and this is it. Click on the “Logs” tabs and you should see a window with a black background and fairly small white text. Directly above the top right corner of this text window, you’ll see a small icon that looks like a square with an arrow pointing out of it towards the top, right corner. Click that arrow and the log window will expand to fill your browser. Unfortunately the content of this window isn’t rendered as HTML, so you can’t use “Ctrl-F” in your browser to search for the active port, but it should not be hard to find. In my case, the log contains the following:-

2025-11-06 7:59:15 0 [Note] Server socket created on IP: ‘0.0.0.0’, port: ‘3306’.
2025-11-06 7:59:15 0 [Note] Server socket created on IP: ‘::’, port: ‘3306’.

As I noted previously, when I tried to change the port via the Container setup options, I found that the value here remained stubbornly at port 3306. Eventually, I decided it wasn’t an issue since I was of course using a dedicated, static IP address and this was the only service the address would be likely to host. But I did say I would show you how to confirm the port that your MariaDB daemon is listening on and, well, this is it.

But: congratulations! You’ve just configured and installed MariaDB in Container station!

And it is currently absolutely useless!

Right now, all we’ve done is get the package downloaded and installed and got the main binary to successfully start executing. However, by default MariaDB won’t allow network connections and is supplied with just a single root/admin user. Now we need to perform a couple of very simple validation tests. The first is a simple network visibility test – just open a command prompt or shell prompt (from your workstation) and then issue the command,

ping {IP address}

where the {IP address} is the one that we applied to the container in the “Networks” tab of “Advanced Settings” and was based on the static IP address we obtained at the start of this guide. If we got our networking setup correct, we should see ICMP Echo packets returned to our workstation.

The second test, which is very helpful if you have the means to run it, is to perform an nmap scan. Nmap is a port scanning utility that can access a remote host and tell you whether or not the host is offering service for particular ports, such as TCP sockets. If your workstation is Windows based, you can download the nmap utility direct from the official Nmap web site . If your workstation is unix based, such as one based on GNU/Linux, you can almost certainly add the nmap utility direct from your local package manager.

Once you have the utility installed, simply check your container’s IP address. For example, I assigned the IP address 172.16.101.201 to my MariaDB container and when I run nmap against that IP address, this is returned:-

$ nmap 172.16.101.201
Starting Nmap 7.80 ( link to official nmap web site normally appears here ) at 2025-11-06 08:25 GMT
Nmap scan report for 172.16.101.201
Host is up (0.00012s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
3306/tcp open mysql
Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds
$

In this case I have only one open/active port at the IP address, but it shows that TCP Port 3306 is open (which means that a listener is monitoring the network stack and will respond to packets with that port ID) and we can also see that the listener is “mysql” – which is what we want.

This gives us a good level of confidence that our MariaDB engine is at least installed and running.

06. SSH経由でDockerにアクセスする

MariaDBに詳しい方ならご存知の通り、MariaDBはセキュア・バイ・デザインの原則に従っており、初回起動時には登録済みのユーザーが1人だけで、リモート(つまりネットワーク)アクセスを許可しません。正しく設定するためにはローカルホスト経由でアクセスする必要があり、さらに Dockerコンテナ内 からアクセスする必要があります。

それでは始めましょう。

まず、NASにSecure Shellセッションで接続します。これには様々な方法があり、例えばWindows(コマンドプロンプト経由)やLinux(ターミナルセッション経由)では、次のコマンドを実行するだけです。

SSH {あなたのNASのIPまたはDNS名}

または、PuTTY のようなクライアントアプリケーションを使うこともできます。PuTTYはWindowsとLinuxで利用できる無料のSSHおよびtelnetクライアントです。お好きな方法でどうぞ。ログインして\[NAS\]のシェルプロンプトに到達したら、次のコマンドを入力します。

docker ps

このコマンドの前に「sudo」を付ける必要は通常ありませんが、NASにアクセスしている非管理者アカウントの権限によっては必要な場合もあります。このコマンドを実行すると、「CONTAINER ID」「IMAGE」「COMMAND」「CREATED」「STATUS」「PORTS」「NAMES」という列見出しの下に、基本的な情報が2行で表示されるはずです。

見出しの下にある1行の詳細は、先ほど作成したコンテナに関するものです。「NAMES」の項目をメモしておきましょう。これは特定のコンテナ名であり、MariaDBインスタンスとやり取りする際に必要になります。これはコンテナ作成時に指定した名前と一致するはずです。

07. MariaDBのファイルシステムにアクセスしてフォルダーリンク用のエンドポイントを特定する
もしMariaDBを初めてインストールし、その目的がコンテナのファイルシステム内で上記のStorage構成のパラメータとして使用できるフォルダノードを特定することであれば、必要な情報を取得するのは非常に簡単です。まず、コンテナに入るためにインタラクティブなbash(シェル)セッションを開始する必要があります。NASへのアクティブなSSHセッション経由でDockerコマンドを入力してください。この方法はDockerとやり取りする一般的な方法なので、コマンドを分解して各要素の意味を理解しましょう。入力する前に説明を読んでください:-

sudo docker exec -it {yourContainerName} /bin/bash

上記のコマンド文字列の意味は以下の通りです:-

sudo - NAS QTSオペレーティングシステムに対して、以下のコマンドをスーパーユーザー権限で実行することを指示します。

docker - sudoに対してdockerコマンドを権限付きで呼び出すことを指示します。

exec - 「Docker Execute」の略で、Dockerに対してコンテナ内で見つかる実行可能プログラムを起動することを指示します。

-it - パラメータフラグで、それぞれインタラクティブモード(i)とテレタイプフォーマット(t)を表します。

{YourContainerName} - このDockerインスタンス内に複数のコンテナが展開されている場合に、どのコンテナを操作するかをDockerハンドラーに伝えるために必要です。

/bin/bash - コンテナ内で起動したい実行可能プログラムへのフルパス名です。unix系オペレーティングシステムに馴染みのない方のために説明すると、「bash」は「Bourne Again Shell」の略で、unixの初期のコマンドライン環境(Bourne Shell)を拡張したものです。

上記のコマンドを実行すると、シェル環境のコマンドプロンプトが変化するのが分かるはずです。例えば:-

root@{12桁の16進数}:/#

この奇妙な12文字の16進値は、もちろん、ContainerStationが作成プロセス中に割り当てたユニークなコンテナIDです。これでMariaDBコンテナの中に入りました。次は、コンテナ内のどこにいるのか、そしてその場所に何があるのかを確認する必要があります。リストコマンドを実行し、すべてのファイル詳細表示(Windows Explorerの「詳細」ビューに相当)を求めるパラメータを使います。慣例として、コンテナ内では常に最上位の「ルート」ディレクトリ(「/」)に到着します。以下のシェルコマンドを実行してください:

ls -al

コンテナのルートフォルダーにはおよそ24個のエントリが表示され、最初の3つは「.」「..」「.dockerenv」となっているはずです。次に、このファイルシステム内でコンテナとNASファイルシステムの橋渡しポイントとして使える場所を探します。

下にスクロールして「var」という名前のフォルダーを見つけてください。この名前はunixの3文字略語で「variable(可変)」を意味し、このフォルダーの内容が時間とともに変化することを示しています。これはデータ保存領域を示すため、今回の用途に最適です。以下のコマンドでフォルダーに入ります:

cd var

ディレクトリをvarに変更する)そして再度リスト表示:

ls -al

この時点で、最初に表示されるフォルダーが「backups」であることが分かります。以下のコマンドでその中に入ります:

cd backups

そして再度リスト表示:

ls -al

中身が空であることが分かるはずです。これは望ましい状態です。まさに探していたものです。このフォルダーをMariaDBデータベースのバックアップ用の橋渡しポイントとして使用します。何も変更する必要はなく、コンテナシェルから以下のコマンドで退出します:

exit

この操作で、コマンドプロンプトがQNAPのデフォルトに戻るはずです。この時点で、ブラウザセッションに戻り、Container Stationにアクセスし、必要に応じて左側のメニューから「Containers」をクリックします。先ほど作成した「MariaDB」コンテナを見つけましょう。「Actions」列の歯車アイコンをクリックするとポップアップウィンドウが表示され、「Stop」または必要に応じて「Force Stop」を選択できます。コンテナが停止したら、ポップアップウィンドウの下部までスクロールして「Remove」を選択し、コンテナを削除します。削除が完了したら、コンテナのファイルシステムとQTSファイルシステムの橋渡しポイントが確定したので、再度プロセスを開始できます。

08. Docker経由でMariaDBのコマンドラインインタプリタにアクセスする

このセクションに到達したということは、必要なフォルダ接続も含めて正しく構成されたコンテナがすでにある前提です。コンテナが「見える」ようになったので、今度はその中のMariaDBにアクセスしましょう。これもDockerコマンドで行いますが、前回同様、何をしているのか、なぜそうするのかを理解できるように分解して説明します。まだ行っていない場合は、次のステップを実行する前に必ず一度「exit」コマンドでコンテナから抜けて、NAS QTSオペレーティングシステムのプロンプトに戻ってください。今回使うコマンドの構文は以下の通りです。

sudo docker exec -it {yourContainerName} mariadb -p{rootPassword}

このコマンドの内訳は以下の通りです。

docker exec - Dockerにコンテナ内で実行可能なバイナリを実行させる

-it - (i)nteractive(対話的)かつ(t)eletypeスタイルのインターフェースで実行する

mariadb - Dockerにこの特定のバイナリをコンテナ内で実行させる

-p{rootPassword} - このパスワードをバイナリに渡す(これは先ほどEnvironment変数で指定したものと同じパスワードです)

このコマンドではUserIDを指定する必要がないことに気づくでしょう。デフォルトで管理者ユーザー「root」となります。

このコマンドを実行するとMariaDB CLI(コマンドラインインタプリタ)にアクセスできるはずです。ここでは新しいMariaDBインスタンスを利用するための詳細な設定方法は説明しません。なぜなら、各自のローカル設定ガイドに従うことになるでしょうし、具体的な内容はMariaDBを何に使うかによって大きく異なるからです。ただし、基本的なポイントは以下の通りです。

  • 「最小権限の原則」を採用しましょう。権限を付与する際にワイルドカードの使用は避けてください。

  • 特に「ネットワークアクセス」を許可する場合、「Host」に「%」だけを指定しないでください(これは**どの**ホストからもアクセスを許可することになります)。代わりに自分のネットワークアドレスと組み合わせてワイルドカードを使い、ローカルアドレス(またはその一部)からのみアクセスできるように制限しましょう。例えば、私のローカルIPネットワークアドレスが172.16.0.0で、マスクが255.255.0.0の場合、「Host」値として172.16.%.%を指定します。これでローカルネットワークからのみMariaDBにアクセスできるようになります。

  • 重要なのは、root以外のMariaDBアカウントを作成し、そのアカウントに(PHPMyAdmin / MySQL Workbench)ホストからデータベースへアクセスできる権限と、新しいデータベースを作成する権限を与えることです。

また、新しいMariaDBインスタンスを設定する際に、どんな場合でも特に推奨したいのは、バックアップ用の特別な読み取り専用アカウントを作成することです。もしこれを行いたい場合は、以下のコマンドで必要な設定ができます。まず、ループバックIPアドレスに紐づくユーザーを作成しましょう。

CREATE USER ‘backup’@’127.0.0.1’ IDENTIFIED BY ‘{securepassword}’;

上記コマンドを入力する際、パスワードはシングルクォートで囲み、波括弧は使いません(パスワードに波括弧を含めたい場合は別ですが)。例えばパスワードが「password」の場合、

IDENTIFIED BY ‘password’;

となります。

次に、そのユーザーに全データベースの「SELECT」権限を与えます。

GRANT SELECT ON . TO ‘backup’@’127.0.0.1’;

これで権限付与の「GRANT」構文が理解できるでしょう。ここで「SELECT」は付与する権限、「ON .」は全ローカルデータベースに対してこの権限を与えることを意味します。これは特別なGRANTで、コマンド実行時点で存在する全データベースだけでなく、今後新たに作成される全データベースにも自動的に権限が付与されます。

バックアップ用ユーザーに必要な権限は「SELECT」だけではありませんので、以下に私が使用した権限リストを示します。これは公式MariaDBドキュメントから引用しています。全リストは以下の通りです。

SELECT, RELOAD, PROCESS, SHOW DATABASES,

LOCK TABLES, SHOW VIEW, EVENT, TRIGGER

「SELECT」権限はすでに付与したので、残りのMariaDBコマンド権限についても同様に「GRANT」文を実行してください。全部で8つあるので、1回の「GRANT」文で1つずつ権限を追加する場合、8回繰り返すことになります。

‘backup’アカウントを@’127.0.0.1’で作成することで、そのアカウントの利用をバックアップスクリプトを実行するサーバー(crontabなどのネイティブタイマーユーティリティを使う)に限定できます。これは基本的なセキュリティ対策です。仮に誰かがそのアカウントのパスワードを知っても、(リモートで)アクセスしてデータを盗むことはできません。

最後に、このセクションを終える前に覚えておくと便利なコマンドライン文を2つ紹介します。

SELECT user,host FROM mysql.user;

および

SHOW GRANTS FOR ‘{user}’@’{context}’;

例えば

SHOW GRANTS FOR ‘backup’@’127.0.0.1’;

このコマンドの構文が示す通り、指定したユーザーに割り当てられている権限の一覧が表示されます。これを使って、バックアップ用ユーザーに必要な権限が付与されているか確認できます。

ご注意: この段階になると、つい

GRANT ALL PRIVILEGES TO . FOR ‘{yourUser}’@’%’;

のようなコマンドを使いたくなるかもしれません(これを実行するとどこからでも何でもできる権限が与えられます)が、それがいかに危険かをよく覚えておいてください。一般的なルールは「必要な権限だけを付与すること」、そして「不要になったら即座に権限を削除すること」です。

とはいえ、全てのコンテンツに広範な権限を持ち、サーバーへリモートアクセスできるインタラクティブユーザーを一時的に作成しておくのも良いアイデアです。これは通常や恒久的な利用のためではなく、「緊急時用」に保管しておき、必要な時だけ使うためです。もしそのようなユーザーを作成する場合は、この後の手順の検証にも利用できます。

09. PHPMyAdminからMariaDBへアクセスする

やや古めかしいインターフェースではあるものの、PHPMyAdminは非常に強力なユーティリティであり、ウェブインターフェースを通じてMariaDBデータベースのリモート管理を十分に行うことができます。その高機能性のおかげで、新しいMariaDBサーバーの詳細を追加する方法も複数存在します。例えば、デフォルトの「config.inc.php」ファイルに詳細を追加することもできますし、個別のMariaDBサーバー専用のセカンド設定ファイルを追加することも可能です。

私の場合は、手っ取り早い方法を選び、既存の設定に2台目のリモートサーバーの詳細を以下のように追加しました(config.inc.phpファイルから抜粋):-

$i = 0;
/

  • 最初のサーバー - TVS-672XT上のMariaDB 5.5.68
    /
    $i++;
    /
    認証タイプ /
    $cfg[‘Servers’][$i][‘auth_type’] = ‘cookie’;
    /
    サーバーパラメータ /
    $cfg[‘Servers’][$i][‘verbose’] = ‘TVS-672XT - MariaDB 10.5.8’;
    $cfg[‘Servers’][$i][‘host’] = ‘172.16.101.2’;
    $cfg[‘Servers’][$i][‘port’] = ‘3307’;
    $cfg[‘Servers’][$i][‘compress’] = false;
    $cfg[‘Servers’][$i][‘AllowNoPassword’] = false;
    *

/

  • 2台目のサーバー – TVS-672XT上のContainerStation経由のMariaDB 12.0.2
    /
    $i++;
    /
    認証タイプ /
    $cfg[‘Servers’][$i][‘auth_type’] = ‘cookie’;
    /
    サーバーパラメータ /
    $cfg[‘Servers’][$i][‘verbose’] = ‘TVS-672XT - MariaDB 12.0.2’;
    $cfg[‘Servers’][$i][‘host’] = ‘172.16.101.201’;
    $cfg[‘Servers’][$i][‘port’] = ‘3306’;
    $cfg[‘Servers’][$i][‘compress’] = false;
    $cfg[‘Servers’][$i][‘AllowNoPassword’] = false;
    *

ご覧の通り、パラメータと値の選択から、私のセットアップではPHPMyAdminにセッションを開くたびに指定したユーザーIDとパスワードで認証する必要があります。その後、ブラウザのクッキーを使ってセッションが維持されます。

鋭い方は、「最初のサーバー」がポート3306ではなく3307を使用していることに気づくかもしれません。これは、MariaDB 10.5.8をインストールした時点で、すでに同じNAS上でMariaDB 5.xが稼働していたため、QTSが自動的にこれを検出し、2つ目のMariaDBデーモンのポート競合を避けるために3306から3307へインクリメントしたためです。

既存のPHPMyAdminインスタンスが稼働している場合は、修正したデフォルト設定ファイルを保存(または2つ目のファイルを追加)した後、ローカル環境に応じて次のコマンドを実行してください:-

sudo systemctl reload apache2

ウェブホスト上でこれを実行することで、新しい設定が有効になり、PHPMyAdminウェブアプリケーションのランタイム設定が更新されます。

ブラウザ(または新しいタブ)を開き、PHPMyAdminインスタンスのURLを入力します。ContainerStationイメージが唯一のリモートサーバーであれば、先ほど作成したユーザーIDとパスワードを入力するだけでアクセスできます。

ContainerStationインスタンスを2台目のリモートサーバーとして追加した場合は、ログイン画面にコンボボックスが表示され、どのリモートサーバーを管理するか選択できるようになります。コンボボックスに表示される説明は、上記の「config.inc.php」スクリプト内の「[‘verbose’]」環境変数で指定した値が使われます。

デフォルトでは、PHPMyAdminは現在選択されているサーバーの「サーバーホームページ」に移動します。画面左側のガター部分には、既存の作成済みデータベースが表示されます。これは新しいMariaDBインスタンスなので、「information_schema」「mysql」「performance_schema」「sys」だけが表示されているはずです。

ここで必ずダブルチェックすべき重要な要素は、ページ右側の「Database server」と題された要素内に「Server version」という属性があることです。

私がデプロイしたDockerイメージで表示される具体的な値は

12.0.2-MariaDB-ubu2404 - mariadb.org binary distribution

です。

私にとって重要なのは「12.0.2」で、これはイメージが自分の望むバージョンのMariaDBで動作していることを確認できるからです。ただし、「mariadb.org」という要素もdockerイメージの出所を示しています。これだけで本物のMariaDBイメージであることを保証するには十分ではありませんが、ここまでの手順で慎重に正規性を確認してきました。

10. テスト用データベースのセットアップ

PHPMyAdmin(または MySQL Workbench、もしくはあなたが使用しているツール)にログインしている間に、データベースを作成し、いくつかのレコードが入ったテーブルでデータを用意します。

どのツールセットを使っているか事前には分からないので、詳細な手順はここには記載しません。代わりに、私の場合はデータベース名を「demo」、テーブル名を「demotable」とし、その中に「demokey」(自動増分の主キー)と「demotext」(シンプルなテキストフィールド)の2つのフィールドを作成しました。あなたのやり方で進めてください。

次に、このテーブルに実際のデータを入力する必要があります。最低でも2件のレコードを作成することが重要です。シンプルなテキストフィールドなので、以下のようなテキストを入力できるはずです。

This is the first test record
This is the second test record

このテーブルを使ってバックアッププロセスのテストを行います。PHPMyAdmin の「閲覧(Browse)」機能を使って、各レコードのテキストがはっきり表示されているか確認しておくのも良いでしょう。

レコードが作成されたことを確認したら(PHPMyAdmin では、テーブルを左側のメニューで選択した後、一番左にある「閲覧(Browse)」タブを使えば確認できます)、問題なければこのデータベースのバックアップ作業に進みましょう…

11. コンテナ化されたMariaDBデータベースのバックアップ

NASに接続したSSHセッションに戻ります。そこから、以下のコマンドのバリエーションを実行できます。これは、設定したデータベース名、出力フォルダ、ユーザー名に合わせて調整してください:-

sudo docker exec -it {YourContainerName} mariadb-dump -h 127.0.0.1 -P3306
-u {yourBackupAccountName} -p{yourBackupAccountPassword}
–databases {yourDatabaseName}
–result-file /var/backups/{yourDatabaseName}.sql

このコマンドで使用されている変数の内訳は以下の通りです:-

-it - コマンドを対話的かつテレタイプ(つまりテキストベース)インターフェースで実行することを指定します

{yourContainerName} - コンテナ作成時に指定した名前です

-h 127.0.0.1 - mariadb-dumpコマンドをループバックホストで実行するよう指示します。さらに重要なのは、これが「backup」ユーザーの作成方法と一致していることです。覚えていますか?「backup@127.0.0.1」として作成しましたよね?これが理由です… 基本的に、このコマンドを自動タイマーで実行できるスクリプトにラップします。そして、このコマンドと、それを実行するユーザーの権限を設定することで、ホストNASから直接しか実行できないようにしています。たとえ誰かが「backup」というIDとそのパスワードを知っていたとしても、この環境のデータベースにその認証情報でアクセスすることはできません。最小権限です…

-P3306 - MariaDBインスタンスが使用しているTCPポートを指定します

-u {yourBackupAccountName}

  • バックアップ目的でターゲットデータベースにアクセスできるように権限を設定したMariaDBアカウント名です。ここでは例として「backup」ユーザー名のみが必要です。

-p{yourAdminPassword}
この値は、そのユーザーアカウント作成時に「IDENTIFIED BY ‘…’;」パラメータで設定したものです。重要:「-u」とユーザーIDの間にスペースを入れても無視されますが、「-p」とパスワードの間にスペースを入れるとそのスペースがパスワードの一部として扱われ、認証に失敗します!

–databases {yourDatabaseName}
[「databases」の前にダブルハイフンがあることに注意!] テスト用にはデータベース名を1つだけ指定します(例:「demo」)。正直なところ、常にこの方法でコマンドを実行することをお勧めします。複数回実行するのは簡単ですし、コマンドをシンプルに保つことでエラーが減ります。

–result-file /var/backups/{yourDatabaseName}.sql

[「result-file」の前にダブルハイフンがあることに注意!] このパラメータ内の「/var/backups/」は、MariaDBコンテナ(v12.0.2)内で確認したフォルダ構造に対応しています。割り当てる名前は、アーカイブするデータベースを意味するものにしてください。

.sqlサフィックスを付けるのは必須ではありませんが、ファイルタイプを名前から識別しやすくする便利な慣習です。

sudoコマンドをNASで実行するためにあなたのアカウントパスワードの入力を求められる場合があります。これはunix系ホストで管理者機能を使う際の標準的な手順です。入力後、すべての手順を正確に実行していれば、エラーなくシェルプロンプトが返ってくるはずです。通常通り、もしエラーが出た場合は、もう一度慎重に手順を見直してください。

バックアップが期待通りに実行されたか確認する必要があります。もしこのガイドで説明したファイルシステムブリッジを作成していれば、以下のようにMariaDBコンテナに再度入る必要はありません:-

sudo docker exec -it {YourMariaDBContainerName} /bin/bash

なぜなら、作成したファイルは指定した出力先フォルダに表示されるはずだからです。ブリッジを作成しなかった場合は、上記の通りコンテナに再度入り、出力ディレクトリに移動します:-

cd /var/backups

そして、フォルダの内容をリスト表示します:-

ls -al

すべてが計画通りなら、直近のタイムスタンプが付いたファイルが{yourDatabaseName}.sqlという名前で存在するはずです。

もしそうなら、おめでとうございます!そうでなければ、前の手順を慎重に見直して再試行してください。

最後に、バックアップファイルがあるフォルダ内で(コンテナ内でもNASへのSecure Shellセッション経由でも)次のコマンドを実行します:-

cat {yourDatabaseName}.sql

これでファイルの内容が画面に表示され、「demo」データベースの内容(作成したテーブルと2行のテキスト)が確認できるはずです。このファイルに2件のレコードが確実に含まれていることを確認するのが重要です。 なぜなら、この後すぐに1件を削除し、このバックアップを使ってデータをリストアするからです…

11a. コンテナの壁を越えてバックアップファイルをエクスポートする

Storageパラメータを使ったフォルダブリッジ方式で、コンテナがNASファイルシステムにアクセスできるようにしている場合は、準備ができているので次のステップに進んでください。しかし、接続を作成していない場合は、リストア処理で使用するために、.sqlバックアップファイルをコンテナの外部にコピーする必要があります。

良いニュースは、非常に簡単で、コマンドを1つ実行するだけで済むことです。

NASのSecure Shellプロンプトで、以下のコマンドの自分用に調整したバージョンを入力してください。

sudo docker cp {YourMariaDBContainerName}:var/backups/{yourDatabaseName}.sql /share/NFSv=4/Public/Backup/

「.sql」と「/share/NFS」—またはQNAP NASの該当するローカルパス—の間には半角スペースが1つ必要です。また、「/Public/Backup」は、ファイルを配置したい場所を特定できるよう、該当する共有名やフォルダ名に置き換えてください。

このコマンドが手動で行うのは、エクスポート/ダンプファイルのコピーを作成し、そのコピーを自分自身やHBS3バックアップから見えるNASファイルシステムの一部に配置することです。

注意: これにより、データベースのコピーが3つ—元のものと2つのダンプファイル—存在することになります。小規模なデータベースでは問題ありませんが、非常に大きなデータ構造を管理している場合は煩わしくなるかもしれません。

この時点で達成できたのは、十分なバックアップ結果を得るために必要な3段階のうち2段階を完了したことです。最終段階はもちろん、宛先フォルダ(「/Public/Backup」)をQTS標準ユーティリティHBS3などの正式なデータ管理プロセスに登録することです。

また、データベースファイルが大きく、「ファイルコピー」プロセスで.sqlエクスポートをMariaDBコンテナの外部に配置している場合は、追加でいくつかのステップを検討してください。最終的なバックアップジョブが実行された後、MariaDBコンテナ内の/var/backupsに配置した.sqlファイルの中間コピーを削除するための別のジョブを設定するべきです。バックアップ機構としてHBS3を使用している場合、このユーティリティには追加コマンドの実行や外部バッチジョブのトリガー機能はありません。

私が考えた方法は、HBS3をタイマーで実行するよう設定し、その後十分に時間をおいてcrontabで定期的なシェルスクリプトを実行するというものです。ただし、これは完全に安全ではありません—「整理」スクリプトはHBS3ジョブが失敗しても実行されてしまうためです…

12. MariaDBリストアの検証

私たちは今、「demo」MariaDBデータベースのフルバックアップを正常に作成しました。もし出力先がMariaDBコンテナ内であれば、続けて2つ目のコマンドを使い、MariaDBコンテナ内からバックアップを取り出し、より堅牢なバックアップ機構で保護できる場所に配置しました。

しかし、そのバックアップは本当に機能するのでしょうか?!

確かめてみましょう。

まず、ブラウザを使ってPHPMyAdminセッションに戻ります(タイムアウトしている場合は再認証が必要かもしれません)。そして、Browseモードでdemoテーブルにアクセスします。ダミーレコードが2件存在していることを確認してください。

どちらのレコードを選んでも構いませんが、1件を削除します。これはPHPMyAdminから簡単に行えます—削除したいレコードの行にある「Delete」テキストをクリックするだけです。「Confirm」というポップアップウィンドウが表示され、その後レコードが削除されたことの確認メッセージが表示され、ページがリフレッシュされて1件だけレコードが残っていることが分かります。

次に、PHPMyAdminの左側のガター(余白)に表示されているデータベース名(「demo」)をクリックして、demoデータベースの「database」ページに戻ります。メインウィンドウが「demotable」を表示し、「Rows」ステータスフィールドで1件のレコードが残っていることが確認できるはずです。

ウィンドウ上部には「Structure」や「SQL」などのコマンドタブが並んでいます。その中から「Import」というタブを選択します。「Import」ウィンドウの最初の部分は「File to import:」です。「No file selected」と表示されているテキストボックスの横にある「Browse」をクリックし、ファイルシステムから先ほど書き出した、またはコピーした.sqlファイルの場所まで移動します。正しいファイルを選択してください。

インポートのデフォルトパラメータは変更する必要はありませんので、そのままページの一番下までスクロールして「Import」ボタンをクリックします。息を止めて、指を交差して、などなど。お好きなように。

インポートが完了したら、上部メニューに戻り再度「Browse」タブを選択します。画面の中央あたりに、テーブル内の両方のレコードが表示され、先ほど削除したレコードもインポートプロセスによって無事に復元されているはずです。

おめでとうございます!

これで、Container MariaDB Serverからローカルファイルシステムへのバックアップを手動で実行するプロセスを正常に完了しました。もし今後、定期的なバックアップから「本当に」データを復元する必要が生じた場合—つまり、どうしてもデータを回復しなければならない場合—は、このプロセスを使ってください。

もう少しで完了です!!!

13. バックアッププロセスの自動化

=== 重要な更新 - 2026年5月20日 ===

このガイドおよび特にこのステップに戻り、下記のサンプルスクリプトに重要な変更を加えました。元のバージョン(下記はすでに編集済み)では、「docker -it exec」から始まるコマンドを含めていましたが、下記をご覧いただくとわかる通り、

  1. 「-it」パラメータを削除しました。
  2. 「docker」コマンドは docker バイナリへのフルパスを先頭につけて実行すべきことを明確にしました。これは、NAS にSSH接続してコマンドプロンプトで「which docker」と入力すると取得できます。

「-it」パラメータを削除した理由は、これらが docker にコマンドをインタラクティブ(I)テレタイプ(T) モードで実行するよう指示するものですが、バッチモードでの実行には適さないからです。これらのパラメータは手動テスト時の名残で、うっかりそのままにしてしまっていました。QTS 5.2.9.3451(2026年4月末頃リリース)より前では、これらが入っていても影響ありませんでしたが、そのアップデート以降は「the input device is not a TTY」というエラーでコマンドが失敗するようになりました。

もしすでにここで紹介しているソリューションを実装されている場合は、バックアップスクリプト内のすべての docker コマンドから「-it」パラメータを削除する必要があります。

=== 更新ここまで ===

これらの手順は手作業でも便利ですが、毎回手でやるのは面倒ですよね。そこで、QNAP NAS と QTS オペレーティングシステムで提供されている cron ユーティリティを使って自動化しましょう。(ちなみに「cron」は「chronological(時間順)」が語源で、時刻ベースで処理をコントロールする仕組みです)

まず、バックアップ手順を自動で実行するシェルスクリプトを書きます。このスクリプトは、NAS 管理者には見えますが通常ユーザーからは保護された場所に置きます。専用の「Admin Share」を使うか、「Public」共有を使ってスクリプトフォルダへのアクセスをフォルダパーミッションで制限することもできます。また、選んだ場所も HBS3 バックアップに含まれているべきです。

ファイルには以下の例と同等の記述をする必要があります。環境に合わせてカスタマイズしてください:

#!/bin/bash
#

{docker バイナリのパス}/docker exec {YourContainerName} mariadb-dump -h 127.0.0.1 -P3306
-u {yourBackupAccountName} -p{yourBackupAccountPassword}
–databases {yourDatabaseName}
–result-file /var/backups/{yourDatabaseName}.sql

MariaDB コンテナから NAS ファイルシステムへの「ブリッジ」フォルダを作成してある場合は、以下の行は不要です:

docker cp {YourContainerName}:var/backups/{yourDatabaseName}.sql /share/NFSv=4/Public/Backup/

その場合、「–result-file」のパラメータを、NAS の「Public」共有の所定ディレクトリに変更します。

2つ目のコマンド「docker cp」は「Docker Copy」の意味で、その名の通りバックアップをコンテナからへコピーします。こうして通常のバックアップに組み込めるようになります。

「–databases」と「–result-file」のハイフンは2つです。シングルハイフンではありません … スクリプト版では「sudo」も不要です。cron が root 権限でスクリプトを実行します。

サンプルとして、上記スクリプトを次の場所に保存したとします:

/share/NFSv=4/Public/Software/QNAP/scripts/DockerMariaDBbackup.sh

スクリプトのあるフォルダに移動し、コマンドを実行します:

ls -al

パーミッションを確認してください。-rwxrwxr-x のようになっていればOKです。

パーミッションについては各3桁に「x」が入っていれば十分です。これはオーナー・グループ・他ユーザーが eXecute(実行)できることを示しています。

SSHでNASに接続し、以下のコマンドで実際にスクリプトが動くかどうかテストしましょう:

sudo /share/NFSv=4/Public/Software/QNAP/scripts/DockerMariaDBbackup.sh

ご自身のスクリプト保存場所とファイル名で入力し直してください。

「sudo」をつけて実行するのでパスワード入力を求められます。入力後、スクリプトが正常に動けばOKです。作成されたバックアップファイルの日付をワークステーションのファイルマネージャで「/Backup/」フォルダ内で確認しましょう。

さて、最後に残るのはバックアップジョブのスケジューリング自動化です。

まずは QNAP の公式ドキュメント こちら をよく読み、crontab の編集方法を確認してください。通常の「crontab -e」は使わず、所定のファイルを手で編集する必要がある点に注意しましょう。

次は https://crontab.guru/ にブラウザでアクセスし、cron ジョブを実行したい日時指定のための「crontab 文字列」を作成しましょう。

crontab guru で構文ができたら、上記の QNAP 公式ドキュメントの説明通り、該当する crontab ファイルに追加・保存します。

一例を挙げると、私は毎朝01:45にバックアップを動かしているので、crontab の記述は以下の通りです:

45 1 * * * /share/NFSv=4/Public/Software/QNAP/scripts/DockerMariaDBbackup.sh 2>/dev/null

実はこの「2>/dev/null」は、スクリプトがエラーを出したらその出力を cron が捨てるように指示しています。なぜか?それはスクリプトはシンプルで十分テスト済みだからですし、少なくとも週に一度は出力結果もチェックしているからです。

また、crontab ファイルのこの記述についてですが … QTSのアップデートを行うたびに、crontab 内のエントリの順序が入れ替わることがあります。完全にランダムだとは言いませんが、理由は私にはまだわかりません。後で crontab を確認して、追加した行が最後じゃなくなっていても心配しないでください。リスト全体を見れば、追加した行がきっとあるはずです。

14. 拍手喝采をどうぞ

本当に。MariaDBをContainerStationで無事にセットアップし、バックアップの構成とテストを行い、自動バックアップスケジュールまで設定できたことに対してではありません。このガイドの最後まで読み進める根気に、心からお祝いを言いたいのです!

感心しました!

最後に、私から小さなお願いが2つだけあります。まず、改善点や明確化、簡略化、修正すべき点などがあれば、ぜひコメントで教えてください。または直接メッセージを送ってください。

そしてもう一つ、このガイドが役に立った場合は、ぜひ「恩送り」をご検討ください。QNAP NASやMariaDB、その他何かを自分で解決できたら、関連するフォーラムでそのことを書いてみてください。自分だけでなく、みんなの助けになります。

ありがとうございました。