ラズパイのDockerで使うデータベースイメージは何が良いか?🍣🍺

MariaDB
ブログ用のAPIをラズパイで動かしています。メンテが楽なようにDocker上で動くようにしています。いろいろやるには当然データベースを使いたくなります。Dockerの公式イメージにMariaDBがありますが残念ながらARM32ビット用のイメージが無く使うことができません。
代わりは何が良いのか? ラズパイで動くMariaDBのイメージはたくさんあります。
その中で”jsurf/rpi-mariadb”が良さそうです。しばらく悪戦苦闘した結論を書いておきます。


ブログ用のAPIを作って遊んでいます。アクセス数も少ないので自宅のラズパイで余裕の処理・・・悲しい・・・
とはいえ、メンテナンスには気を使います。いつの間にか止まってないか? SDメモリーカードは壊れないか? アップデートは必要か? 小さくともサーバーを動かすと面倒な事が増えます。

メンテナンスを楽にするためにRaspbianの上でそのまま構築するのをやめてDockerを使うようにしました。Docker上でNode-REDを動かしてAPI用インターフェースを作っています。Dockerにすると一つのディレクトリ以下にOS環境、Node-REDなどアプリとアプリ用ファイル、ネットワーク公開設定などをまとめておけます。このディレクトリをバックアップしておけば、ラズパイがトラブってもすぐに以前と同じ状態を復元できます。アプリのアップデートも簡単です。
さらに、ラズパイ3Bからラズパイ4Bへの移行やラズパイ用64bitOSへの移行、行く行くはWindows 10のWSL2への移行もこのディレクトリのファイルを使って簡単にできるでしょう。
関連記事:Docker ComposeでNode-REDとnginxを動かしてみる

しかしながらDockerをラズパイで動かすには問題もあります。DockerはインテルコアシリーズやRyzenなどx86系CPU用として生まれました。ラズパイなど小型組み込み系で使われるARM系32bit CPUでは動かせるDockerイメージが多くありません。
最近は動くDockerイメージも増えてきてほぼ問題なく使えますが、データベース用イメージに何を使うかが一つの問題になります。

データベースを使う場合はほぼMySQL互換のソフトを使うことになるでしょう。そしてDockerの公式イメージにはMariaDBがあります。
mariadb | Docker Hub
MariaDB is a community-developed fork of MySQL intended to remain free under the GNU GPL.
これが使えれば悩むことも少ないのですが、残念ながらARM 32bit用のDockerイメージがありませんのでラズパイで使えません。ラズパイで動く代わりのMariaDBのDockerイメージは他の方たちが公開しています。それを使おうとして少し手こずりました。

MySQLなどデータベースは日本語などマルチバイト文字が苦手です。デフォルトのMySQLはなんちゃってutf-8なのですべての文字を扱えないのです。スマホが普及した今だと絵文字が使えないのです。最近は設定をすれば使えるようになってきたようです。それでも🍣🍺問題など癖を知らないと後々面倒が起きます。新しいMySQLのバージョン8を使うと良いようです。

という事で、MySQLベースのDockerイメージを動かす時に初期設定をどうやってやるかが一つの問題になります。普通はmy.cnfファイルに設定を書けばよいのですが、Dockerだと少し面倒です。初期値のmy.cnfファイルをゲストOSの中に入れるにはDockerイメージに埋め込むDockerfileを作ったり、my.cnfのあるディレクトリをvolumeに指定したりします。完成したmy.cnfが最初からあれば簡単なんですが、試行錯誤で作っていく段階だととてもめんどくさいです。また、後で変更をする時など管理しておくファイルも増えます。1か月後の自分はそんなこと覚えていません!

先に紹介したDocker公式のMariaDBではDocker runコマンドの引数としてmysqldのオプションを記述できます。説明の中ごろに書いてあります。
Configuration without a cnf file
Many configuration options can be passed as flags to mysqld. This will give you the flexibility to customize the container without needing a cnf file.
例には文字コードをutf8mb4にする場合が示されています。これで絵文字が使えるようになります。当然docker-compose.ymlにも記述する事ができます。設定を一つのファイルに書けるので余計な設定ファイルを管理しなくてすみます。utf8mb4にするのを忘れてた!という事も少なくなるでしょう。

最初のうち、このオプション指定方法はMariaDBに共通のものだと勘違いしていました。他のDockerイメージを試すとことごとくエラーでデータベースが動きませんでした。コマンドラインのmysqldのオプション指定を受け付けません。

Docker Hubにはイメージがたくさんあるのですが出自が不明なものが多いので注意して使う必要があります。少なくともそのイメージをどうやってbuildしたかわかるDockerfileが公開されているものを選びたいです。それで作ったイメージの保証はありませんがDockerfileから自分でビルドすることもできます。
また、MariaDBの場合はDocker公式イメージとほぼ同じ作りのイメージが欲しいです。
このような条件で探した結果、今の所”jsurf/rpi-mariadb”が良さそうです。
jsurf/rpi-mariadb | Docker Hub
This is a port of the official mariadb image https://hub.docker.com/_/mariadb/ for raspberry pi/armhf.
Docker公式MariaDBと同じ作りになっています。Dockerfileもありますので自分でイメージをビルドしたり設定ファイルを入れたイメージを作ることもできます。

データベースが必要な時はdocker-compose.ymlファイルには次のようにデータベース用セクションを書いてデータベースを動かします。
db1:
    image: jsurf/rpi-mariadb
    command: >
      --collation-server=utf8mb4_unicode_ci
      --innodb-file-format=Barracuda
      --innodb-file-per-table=true
      --innodb-large-prefix=true
    restart: unless-stopped
    volumes:
      - ./db1:/var/lib/mysql
    environment:
      - TZ=Asia/Tokyo
      - MYSQL_ROOT_PASSWORD=rootpass
      - MYSQL_PASSWORD=pass
      - MYSQL_DATABASE=myDB
      - MYSQL_USER=myName
commandセクションにmysqldのオプションを指定できます。お試しを終えてデータベースの設定が決まったらmy.cnfファイルにすれば良いでしょう。

あとは2台目を作ってサービスの冗長化をしたいですね。








コメント

最近のコメント

Threaded Recent Comments will be here.