昔、構築したMovable Type Open Source (MTOS)の環境を Docker を使って再構築してみました。
現在、MTOS は 2016 年 1 月 に MT5 の EOL に伴ってプロジェクトは終了され、現在は脆弱性等の修正も行われない状態になっていますので MTOS がインストールされたサーバ自体を外部に晒すことはできません。
このため、現在 MTOS を復活させる意味はないように思えますが、僕は MTOS を純粋な静的サイトジェネレーターとして使っていて、生成された HTML ファイルだけを別のウェブサーバにコピーして運用しています。本当はもっと新しい静的サイトジェネレータに移行すべきなんでしょうが、大したサイトでもないのでHTML 生成が必要になった時だけ使えるローカルサーバが欲しくなったというのが構築の理由です。
† 先人の知恵を使わせていただく
今回はapricoton/docker-movabletype-psgi をベースに、以下で紹介されているパッチを自動的に取り込むようにしてみました。
需要はないと思いますが、作成した環境は以下にアップロードしておきます。
WSL2 に Docker をインストールしてみたのでメモ。
Windows であれば Docker Desktop がありますが、やっぱり Linux のコマンドラインで全て済ませたいんですよね。
WSL2 の Ubuntu 22.04 にインストールする場合、基本的には 公式のドキュメントに従うだけですんなりインストールできます。
今回は以下のような感じでインストールしてみました。
すぐに使えるwordpress + mariadb + nginx + Let's Encrypt 環境が欲しかったので、docker compose
を使ってdocker compose
で構成を作ってみました。
Let's Encrypt のためのリバースプロキシはSteveLTN/https-portalを組み込んでいます。
以下のコマンドですぐに使い始めることができます。
注意点は以下の 2 点です。
docker-compose.yml
内のwww.example.com
は実際に使うホスト名に合わせてください。docker-compose.yml
内の#STAGE: production
はテスト用の HTTPS 証明書が正常に発行されることを確認してからコメントアウトを外すようにすると安全です(Let's Encrypt のレートリミットに引っかかるのを防ぐため)Azure Storage API 互換のサーバがないかと思って調べていたら、GitHub でAzurite というソフトウェアを見つけました。
内容をよく見てみると、これ、なんと MS 謹製の Azure Storage Emulator でした*1。
docker-compose を使うと開発環境用のサーバを一撃で作ることができます。
docker-compose.yml
サーバが起動したら通常の Azure Storage と同じようにAzure Storage Explorer で中身を弄ることができます。
docker-compose.yml
内でcifs (smb) のボリュームをマウントしてみました。
手順は「SMB/CIFS volume in Docker-compose on Windows - Stack Overflow」が参考になりました。
こんな感じで書けばいけるようです。
ユーザー名とパスワードが yml に直接書いてあるのは気持ち悪いので、これはあとでなんとかしようと思います。
docker-compose.yml ファイル内に$
があると勝手に変数展開されてしまうのでエスケープ方法を調べてみました。
結論から述べると、$
は$$
とエスケープすることができます。
† ランダムなパスワードをつけようと思ったので・・・
これまで$
を文字列中に使う必要がなかったのでエスケープが必要なことに気づいていなかったのですが、今回、MySQL のイメージにに以下のような$
が含まれたランダムなパスワードを付けようとしてハマってしまいました。
調べてみると全く同じパターンでハマっている人*1がいて助かりました。
上記の.yml
は以下のように書き換えると動くようになります。
すぐに使える HTTP の Forward Proxy が欲しかったので、簡単にセットアップできるTinyProxy*1 で作ってみました。
ネットに公開されているサーバに入れるときには Open Proxy にならないように Allow の部分の設定に注意が必要です。
docker-compose.yml
tinyproxy.conf
とある docker のコンテナの中身を眺めていたら、DJB daemontools と同じような設定ファイルで動いているs6-svscan
やs6-supervise
が気になったのでちょっと調べてみました。
公式ページを見てみると daemontools にも参考としてリンクが貼られていて、アーキテクチャや設定ファイルも似ていますが、コードは全て独自に書き直されているとのこと。ソースをざっと読んでみてもmemcpy()
を使っていたりする普通のコードです。(そもそも DJB のオリジナルの daemontools のコードはstring.h
が使われていません。)
Docker のイメージと組み合わせるならば以下の s6-overlay というパッケージを使うのが良さそうです。
これを使うと docker のイメージ上で複数のプロセスを起動したり、respawn するように簡単にできます。
Docker のコンテナをウェブから管理する方法がないかと思って調べてみたらPortainer というものがあることが分かったのでメモ。
Portainer CE という無料版があり、インストールも Docker イメージでできるようになっています。
起動オプションを忘れてしまいそうなので、docker-compose up -d
で起動できるようにするとこんな感じでしょうか。
docker-compose.yml
docker-compose で使っている Dokcer のイメージがアップデートされた場合に、ローカルのイメージをアップデートする方法が分からずに困ってしまったので、忘れないうちにやり方をメモ。--build
だけでなく--force-recreate
もつけないとダメみたいです。