まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

2021/03

ラズベリーパイに Raspberry Pi OS をインストールする場合、多くのケースで Lite 版以外のデスクトップ版やサードパーティアプリまで含まれた拡張デスクトップ版を使うと思っています。この2つであれば初期セットアップの段階からデスクトップ GUI による操作が可能となり、無線LANの設定含めて便利に環境構築ができます。逆に Lite 版を選んだ場合は初期段階では CUI による操作が必要になり、ある程度まではキーボードによるコマンド実行や環境構築が必要になります(正しいキーボード設定をするまではキーボードレイアウトも合っていない可能性もあります)。慣れないと不便ですが、一方で余計なものが含まれていない状態であるとも言え、非常に軽量で動作する環境でもあります。特にラズベリーパイゼロ(以降「ラズパイゼロ」)のようにリソースの限られたハードウェアを使おうとすると、デスクトップ版だと起動の時点でリソースの多くが使われてしまい、初期セットアップ作業もかなり時間をかけて行う必要がでてきてしまいます。そんなラズパイゼロでは作業効率を考えると Lite 版で初期セットアップを行い、必要に応じて後からデスクトップ環境も導入する、という使い方も考慮する必要があります。

さて、この面倒な状況をなんとかならんか・・・と考え、短絡的に「デスクトップ環境をもっと軽量にできないか?」と試みることにしました。自分は 30 年近く UNIX を使っていて、自分が使い始めた当初は "X Window" なるウィンドウシステムが(正確には X11 が)使われ始めていた、という時期でもありました。当時の自分は今ほど CUI に理解はなく(苦笑)、GUI オペレーションが可能な X Window を使いたくて個人の環境でも試行錯誤していた時期でした。

※より正確には当時の Linux(Slackware) でもインストール時に X Window を含める選択をすることは可能でした。が、標準機能で導入される X Window は twm(Tab Window manager) と呼ばれる、見た目も操作感もイマイチ・・・な GUI で、「これじゃなくて大学の研究室で使ってるやつを使いたい」と試行錯誤していたのでした。その「大学の研究室で使ってるやつ」は現在ではオープン化された mwm(Motif Window Manager) で、当時は無料ではなかったと記憶しています。事実、僕はこれを買ってまで使っていました(メディアもまだ持ってます)。思い入れのあるウィンドウマネージャーです:
IMG_3176


話を戻すと、要は「ラズパイ(ゼロ)でも X Window だけを入れれば軽量 GUI が実現できるのではないか?」&「今なら mwm も無料で使えるので(折角なので) mwm で使いたい」と考えて、「ラズパイで X Window + mwm を使う方法」を調べたのでこのブログで共有します。なお以下の内容はラズパイゼロでも使えることを確認していますが、普通のラズパイでも動く内容です(普通のラズパイなら普通のデスクトップでもそんなに苦労はしないと思うけど)。


【ラズパイ(ゼロ)に X Window と mwm をインストールする】
まずラズパイ(ゼロ)を Raspberry Pi OSLite 版でセットアップします。ある意味、ここが一番大変だと思ってます。ここに書かれた内容を参照するなどして初期セットアップまでを終えておいてください(以下の手順では SSH 接続やシリアルコンソール接続は必須ではありません):
Raspbian Liteの初期設定 令和2年(2020年)3月版

改めて X Window と mwm を利用する上で必要なツール類を追加インストールします。必須ではありませんが、せっかく GUI を使うならウェブブラウザくらいは・・と思って最後に Chromium(chromium-browser) も含めていますが、不要であれば指定しなくても構いません:
$ sudo apt-get install libxm4 mwm xserver-xorg xinit x11-xserver-utils xterm x11-apps chromium-browser

ツール類のインストールが完了したらホームディレクトリに .xinitrc という名前のファイルを作成します。X Window 起動時の各種設定をするファイルで自分はとりあえず以下の内容にしました(上記のツール類をすべて導入していれば起動エラーは起こらないと思います):
#!/bin/sh

xset s off
xset -dpms
xset s noblank

xsetroot -solid darkslateblue

xeyes -geometry 70x70+5+5 &
xclock -geometry 70x70+105+5 &
xterm -geometry 80x20+100+100 &
exec mwm

これで準備は完了。最後に以下のコマンドを実行して X Window を起動します:
$ startx

成功するとこのような画面が表示されます(この画面で「懐かしい!」と感じる人はアラフィフ以上のオッサンだと思います(笑))。普段見慣れた GUI と比べるとかなりシンプルに感じますが、xterm のタイトル部分でラズパイ環境であることもわかります:
1

※x11-apps パッケージを導入しているので、xeyes や xclocks 以外に以下のページで紹介されているアプリも使えます:
https://packages.debian.org/stretch/x11-apps


せっかくなので導入した Chromium も起動してみます。xterm の画面から起動コマンドを最後に & を付けるのを忘れずに実行すると、指定したアプリが  X Window 内で起動し、xterm も(実行したままにならず)プロンプトが戻って続けてコマンドを実行できる状態になります:
$ chromium-browser &

2


自分の感想ですが、ラズパイゼロだと Chromium を起動すると「さすがにちと厳しいかも・・」という印象の操作感になります(現実的には日本語フォントなども追加でインストールすべきだし・・)。ただ通常のデスクトップ GUI で起動した時と比べると全体的にまだ全然軽いですね。


ちなみに X Window を終了するには背景部分を右クリックして、ポップアップメニューから "Quit" を選択、です。
3


4


昔はこの mwm って有料だったんだよなあ。その頃を知っているので、オープン化されて無料で使えるようになった mwm が簡単に使えるようになったのは改めて感慨深いものがあります。

また、.xinitrc ファイルの最後の "exec mwm" 部分で、(足りない場合は apt-get で導入してから)mwm 以外の別のウィンドウマネージャーを指定することもできます。有名どころはデフォルトだった twm や fvwm2 あたりでしょうかね。まあ使い慣れたものがあったら、それを使うのがいいと思っていますが、僕は「買ってでも欲しかった」mwm 一択です。



まず、今回紹介するのは Node.js + Express で作った API を CORS 対応にする、という、これ自体はシンプルな内容なのですが、この話を考えるに至った経緯を最初にまとめておきます。


【背景】
普段からウェブアプリケーション・サービスを開発しています。詳しいアーキテクチャはともかく、ユーザーのアクセス先となるフロントエンドのアプリケーション・サーバーとバックエンド(データベースなど)があって、クラウドっぽくバックエンドには API サーバー経由でアクセスする、という形態を多く採用しています。

この形態を採用している時に限らない話ですが、「サービスの安定運用」を考えると「いかにフロントエンドを安定させるか」を考慮する必要があります。ネットワークやバックエンド含めたサービス全体のどこかに不具合が生じた場合であっても、ユーザーが最初にアクセスするフロントエンドが動いていれば「画面に障害発生メッセージを出す」ことができるようになります。逆にフロントエンドにアクセス過多を含めた不具合が発生してしまうと、「メッセージで利用者に不具合が発生していることを知らせる」ことすらもできなくなってしまいます。

このフロントエンドサーバーを安定稼働させるための技術として、最近は(docker などの)コンテナ技術であったり、(k8s や OpenShift などの)コンテナのオーケストレーション技術が流行っています。ここまでは「いわゆる一般論」的な話です。

一般論を理解した所で、技術者としての「一般論ではない話」も考えます。自分は業務でもプログラミングや作ったりサービスの運用を行ったりしていますが、業務外でも(つまり個人でも)プログラミングしたり、作ったサービスを公開して運用したりします。2つの異なる立場を持っているわけです(決して珍しくないと思ってます)。前者ではある程度の予算の中でクラウドのサービスを契約したりして、必要であればベンダーが提供するコンテナやコンテナ・オーケストレーションも使って構築することになります。 一方後者では、これらのインフラ構築部分も自腹になるわけです。まあ「これも授業代」と太っ腹に考える人は立派だと思いますが、コンテナ・オーケストレーションまで使おうとするとそれなりに懐も痛む価格だったりします。


要するに「個人開発者としての自分はケチ」なわけで(繰り返しますが、決して珍しくないと思ってますw)、「ケチはケチなりに知恵と作業でなんとかしたい」と考えるわけです。コンテナ技術やコンテナ・オーケストレーション技術を否定するつもりは全くありませんが、「より安価」に「フロントエンドを安定稼働」させる方法はないものか、と:
2021032001


#「コンテナ・オーケストレーションまで自分で構築すればいい」と考える人もいると思うので一応コメントを。技術的にはそのとおりなんですが、目的はあくまで「安価なフロントエンドの安定稼働」です。そう考えると例えば1ノードで構築した場合に目的を達成しているといえるか・・・ では複数ノードを構築する場合、今度は安価といえるのか・・・ となってしまうと考えました。


そんな自分にひらめいた1つの案が「フロントエンドを GitHub Pages にする」方法です。GitHub Pages は GitHub の無料アカウントがあれば使うことのできる「静的ウェブコンテンツの公開サービス」です。GitHub の一部として考えると、容量は(ほぼ)無制限で、アップロード直後にバックアップされ、世界中のウェブサービスの中でも指折りの安定稼働を誇っています。「フロントエンドを安定させたい」という目的だけを考えると、「かなり使える案」だと思っています:
2021032002
(↑フロントエンドを GitHub Pages にして、バックエンドを IBM Cloud にする場合)


もちろんこの方法は万能ではありません。まず GitHub Pages で公開できるコンテンツはウェブアプリケーションではなく「静的ページ」、つまり HTML ページに限られます(この時点で i18n などを考慮するアプリケーションページの公開は難しくなります)。表示データは REST API で取得すれば良いのですが、フロントエンドが静的ページである以上、通信は AJAX に限られてしまいます。その結果、API 側は(クロスオリジン通信をすることになるため)CORS を考慮した設計が必須となります:
2021032003


フロントエンドはウェブアプリケーションではないので、ウェブページをテンプレートから作る、といった便利な手法が使えず、AJAX を駆使したレンダリングを実装しないといけないことも不利な点となりますが、バックエンド側も考慮点の影響が大きな方法ではあると思っています。ただ「安価にフロントエンドを安定稼働」させる面ではイケそうな方法にも感じています。


・・・といった背景がありました。この前提だと REST API 部分も便利なサービスを有償契約して使うのではなく、安価なアプリケーション・サーバーを使って、自前で API サーバーを構築する必要があります(最悪、ここにトラブルがあってもフロントエンド側ではその旨を伝えることができる構成)。というわけで、無料のライトプランが使える IBM Cloud で「Node.js + Express で作った API を CORS 対応にする」ための方法を理解しておく必要がありました。


【Node.js + Express の REST API を CORS 対応する】
こちらはサンプルを用意しておきました:
https://github.com/dotnsf/express-cors


まず settings.js の exports.cors 配列変数内にクロスオリジン通信を許可するオリジン(ドメイン)を登録しておきます。デフォルトでは以下のようになっていて、'http://localhost:8080' と 'https://dotnsf.github.io' からの AJAX 通信を許可するよう設定しています。前者はローカルでの動作確認用ですが、実際に Github Pages で運用を始めた後は削除しておくべきです。後者は僕の Github Pages のドメインです。実際にみなさんが Github Pages でこの API を使う場合は自分自身の Github Pages ドメインに変更してください:
//. settings for CORS
exports.cors = [ 'http://localhost:8080', 'https://dotnsf.github.io' ];

本体とも言える app.js の内部は以下です:
//. app.js
var express = require( 'express' ),
    app = express();

var settings = require( './settings' );

app.use( express.static( __dirname + '/public' ) );

//. CORS
if( settings && settings.cors && settings.cors.length && settings.cors[0] ){
  var cors = require( 'cors' );
  var option = {
    origin: settings.cors,
    optionSuccessStatus: 200
  };
  app.use( cors( option ) );
}

app.get( '/ping', function( req, res ){
  res.contentType( 'application/json; charset=utf-8' );
  res.write( JSON.stringify( { status: 'OK' } ) );
  res.end();
});


var port = process.env.PORT || 8080;
app.listen( port );
console.log( "server starting on " + port + " ..." );

赤字以外の部分はごく普通の Node.js + Express を使った REST API アプリケーションです。この例では GET /ping という動作確認用のシンプルな API を1つだけ定義しています(サーバー側に障害等が起きていなければ、返り値は常に { status: 'OK' } という JSON です)。

肝心の CORS の対応をしているのが赤字部分です。settings.js の内容を確認し、exports.cors 配列に有効な値が1つでも含まれていると判断した場合は、cors ライブラリを使って設定されているオリジンを対象に CORS を有効にします。ちなみに settings.js の exports.cors が例えば null とか [](空配列)とかに設定されている場合は CORS の処理が行われないので、CORS の処理としてはデフォルトの「全てのクロスオリジンからの AJAX アクセスを許可しない(同一オリジンからの AJAX アクセスのみ許可する)」ことになります。

あとは必要に応じてベーシック認証を加えるとか、トークン認証を加えるとか(フロントエンドが静的コンテンツだとトークンの管理が面倒そうだけど)するなどして CORS 対応の REST API を構築することができます。ここは手順がわかってしまえば簡単そうですね。


【運用時】
こんな感じでデータベースへの読み書き検索などが REST API 化され、CORS 対応までできていれば Github Pages の HTML からも利用できるので、かなり安定したフロントエンドコンテンツを実現できそうです。この形で REST API が実現できていると、例えばウェブアプリを作るハンズオンでもあらかじめ用意した REST API を Github Pages から呼び出す形で実現できるので、フロントエンドの運用サーバーは無料で(しかもかなり安定したものを)用意できます。更にフロントエンド部分の開発時にはこんなフォルダ構成の Node.js + Express のアプリケーションにしておくと docs/ 以下の静的コンテンツを対象に作って、ローカルで動作確認もして、コードごと Github にあげて docs/ 以下を Github Pages で公開する、といった便利な開発・運用も可能になります:
//. app.js
var express = require( 'express' ),
    app = express();

app.use( express.static( __dirname + '/docs' ) );

var port = process.env.PORT || 8080;
app.listen( port );
console.log( "server starting on " + port + " ..." );
(↑メインファイル。静的コンテンツのフォルダを /docs に指定している以外はごく普通のシンプルな Express アプリ)


2021032004
(↑このプロジェクトを Github に上げる)


2021032005
(↑Github Pages の設定で /docs フォルダ以下を公開するよう指定する)


フロントエンドコンテンツは全て AJAX 対応させる必要があり、昨今の流行りとは違う形での実装は必要になります。それはそれで大変だし、普通のウェブアプリケーションで使える便利な技術も使えなくて不便な面も出てくるのですが、"Poorman's stable web contents" みたいに割り切って使うネタを準備しています。まだアイデア先行な面もあって実証実験が必要な段階だと思っていますが、運用していて気づくことがあったらまたこのページに追記します。


Github の認証をスマホアプリを使った2段階認証にするための手順を紹介します。対応したスマホアプリはいくつか存在しますが、このブログエントリでは IBM Security Verify アプリを使った設定手順を紹介します。

なお Github の2段階認証を有効にするには、ここで紹介する手順を実行する前に、Github の認証方法をベーシック認証ではなくパーソナルアクセストークン認証に切り替えておく必要があります。そちらの手順については以前のブログエントリを参照してください:
Github のベーシック認証が利用できなくなる前にパーソナルアクセストークンに対応する


【Github の2段階認証対応】
今回は IBM Security Verify アプリを使った Github の2段階認証対応手順を紹介します。まず iPhone や Android スマホでストアアプリを起動し、"IBM Security Verify" を検索して該当アプリをインストールします(無料です):
2021031307


そして起動します。下図は初回起動直後の画面です。この時点ではまだどのサービスとも連携できていないので、「アカウントの接続」ボタンが表示されます。このボタンをタップします:
IMG_3073


「コンピュータの QR コードをスキャンしてください」というメッセージが表示されます。この後 Github と連携するための QR コード読み取りを行います。スマホアプリ側はいったんこの状態にしたまま続けて Github 側の作業を行います:
IMG_3074


別の PC などで Github にログインし、"Settings" メニューから "Account security" を選択し、2段階認証を有効にするため、画面内の "Enable two-factor authentication" ボタンをタップします:
2021031301


次の画面で "Set up using an app" ボタンを選択します:
2021031302


すると以下のようなリカバリーコードが表示されます。リカバリーコードはアカウントにアクセスできなくなった場合に、再びアクセスできるようにするためのコードです。"Download" ボタンを押して内容を保存してから、"Next" ボタンをクリックして先に進みます:
2021031303


すると以下のように QR コードが表示されます。改めて先程起動したままだったスマホの IBM Security Verify アプリの画面から「QR コードのスキャン」を選択し、起動したカメラでこの QR コードを撮影します:
2021031304

するとアプリ側は「完了しました」と表示されます。"OK" をクリックします:
IMG_3075


Github との接続が完了した様子がわかります。この "Github" 部分をタップします:
IMG_3076


すると以下のような画面が表示されます。モザイクになっている箇所にはアクセスコードと呼ばれる6桁の数字が表示されており、約30秒ごとに異なる値に変更されます:
IMG_3077


この数字が変更になる前に Github 画面内の QR コード下部に6桁の数字を入力して、"Enable" ボタンをクリックします(作業途中で数字が切り替わってしまった場合、その6桁の数字は無効です。改めて有効な数字を入力して、切り替わる前に "Enable" ボタンを押してください):
2021031305


これで IBM Security Verify アプリを使った Github の2段階認証が有効になりました:
2021031306


うまく設定できているか、動作確認をしてみます。この状態で PC の Github からサインアウトし、再びサインインします:
2021031401


するとパスワード入力後に2段階認証のコード入力画面に切り替わります:
2021031402


スマホにインストールした IBM Security Verify アプリを起動して、先程と同様に Github アカウントを選択すると6桁の認証コードが表示されています:
2021031404


入力期限が切れる前にこの6桁の数字を正しく入力して "Verify" ボタンをクリックするとログインできます:
2021031403






 

Github の認証ルールが変わったらしく、最終的には 2021 年 8 月 13 日からベーシック認証を用いた利用ができなくなるようです:
Token authentication requirements for Git operations


普段から Github は頻繁に使っていて、しかも現在はベーシック認証中心に使っていました。突然利用できなくなると困るので、早めの対策を取っておきました。その手順を紹介します。 また合わせて Github の2段階認証を利用すべく、IBM Security Verify アプリを使った2段階認証対応手順を紹介します。

【Github のパーソナルアクセストークン認証】
Github のベーシック認証の利用ができなくなる前にパーソナルアクセストークンと呼ばれるトークンを使った認証に切り替える必要があります。まずはその手順を紹介します。

Github ページにログインし、画面右上のアイコンをクリックして "Settings" を選択します:
2021031301


プロフィールページが表示されるので、画面左のサイドメニューから "Developer settings" を選択します:
2021031302


開発者向け設定ページが表示されます。ここでも画面左のサイドメニューから "Personal access tokens" を選択します:
2021031303


設定済みのパーソナルアクセストークン一覧画面が表示されます。新しいパーソナルアクセストークンを作成するために "Generate new token" を選択します:
2021031304


新たに作成するパーソナルアクセストークンの説明(名前)を Note に入力し、スコープは全てにチェックを入れます:
2021031305


最後に "Generate token" ボタンをクリックしてパーソナルアクセストークンを作成します:
2021031306


新しいパーソナルアクセストークンが生成されました。このトークン文字列はこの作成直後のタイミングのみ表示されます(別のページに推移したら2度と表示できません)。このタイミングでコピーするなどして値を保存しておくことを推奨します:
2021031307


これでパーソナルアクセストークンを生成することができました。これ以降で git push するなど認証が必要になった場合は、ID としてユーザー名、パスワードとして(これまでのログインパスワードではなく)パーソナルアクセストークン文字列を指定して認証することができるようになります。また 2021 年 8 月 13 日以降は(ベーシック認証が利用できなくなるため)このパーソナルアクセストークン文字列を使った認証のみがサポートされるようになります:
2021031308


【Github の2段階認証】
記事を分けて紹介することにしました。こちらを参照ください:
IBM Security Verify アプリを使って Github の2段階認証を設定する


docker を使って複数の WordPress 環境を立ち上げる手順をスクリプト化してみました。

普通に1つの WordPress 環境を作るだけであれば(特に docker-compose を使えば、yaml ファイルを1つ用意するだけで)簡単に作れます。詳しくはここでは紹介しませんが、"docker WordPress" などでググると多くの紹介ページが見つかります。

ただ今回自分が作りたかった環境はこれらとは少し異なり、1つのホスト内に複数の独立した WordPress 環境を作る、というものでした。具体的には MySQL サーバーは1つだけ用意した上で、ポート番号で分離して1つ目の環境は localhost:8081 で、2つ目の環境は localhost:8082 で、・・・といった具合に、それも簡単に後から WordPress 環境を追加/削除できるよう考慮してスクリプト化して公開しました:
https://github.com/dotnsf/docker-wordpress

2021030700


※ここで方法で作成した WordPress 環境を実際にインターネットに公開する場合は DNS と連動したポートフォワーディングができる環境があれば、全ての WordPress 環境に 80 番ポート(http)や 443 番ポート(https)でアクセスできるようになると思っています。が、そちらについては環境依存になるので本ブログでは触れません。


利用方法については README.md で紹介していますが、一応ここでも説明します:

まず前提条件として docker が導入された環境が必要です(docker-compose は使わないので導入する必要はありません)。また用意したシェルスクリプトは Linux などの bash などで動かすことを想定しています。ただ docker コマンドが使える環境下であれば、(例えば Windows であれば、シェルスクリプトファイルの拡張子を .sh から .bat などに変更するだけで)使えるはずです。 なお、以下の内容については Windows10 の WSL2(Ubuntu 18.04) 環境で動作を確認しています。


docker 導入済みのシステムで docker を起動後、最初に MySQL イメージと WordPress イメージをダウンロードしておきます。実際には後述のシェルスクリプト実行時にダウンロードされていないと判断されれば docker が自動で最新イメージをダウンロードした上で実行してくれるので、この手順は必須ではありません。ただ最初に1回実行しておくことで後述のスクリプトが軽快に動くようになるので特に理由がなければこのタイミングでダウンロードしておくことを推奨します:
$ docker pull mysql

$ docker pull wordpress

次に今回の作業用に用意したシェルスクリプトをダウンロードして、実行可能な状態に設定します:
$ git clone https://github.com/dotnsf/docker-wordpress

$ cd docker-wordpress

(UNIX 環境の場合)
$ chmod 755 *.sh

(Windows 環境の場合 以下、拡張子を .sh から .bat に変更して実行)
> ren *.sh *.bat

まず docker 環境でデータベースである MySQL サーバーを起動します(以下のコマンドで 3306 番ポートで MySQL サーバーが起動します):
$ ./docker_run_mysql.sh

なお、この MySQL コンテナに接続してコンテナの中身を確認する場合は、以下のコマンドでターミナルにアタッチ可能です(exit で元のホストに戻ります):
$ docker exec -it mysql /bin/bash

そして docker 環境内に WordPress サーバーを起動します。この際に「何番目の WordPress 環境か」を意味するインデックス番号をパラメータとして指定します(以下の例では 1 を指定しています):
$ ./docker_run_wordpress.sh 1

このコマンドが成功すると、8081 番ポートで wordpress1 という名前の docker コンテナが起動します。ウェブブラウザで http://localhost:8081/ にアクセスすると、WordPress の初期設定画面に遷移して、サイト名やログイン設定などを指定して利用を開始できます:

2021030701


2021030702


2021030703


2021030704


2021030705


2021030706


とりあえず1つ目の WordPress 環境はこれだけで作れました。次の環境を作ることもできますが、この1つ目の WordPress 環境に関する操作を一通り説明しておきます。

この WordPress コンテナに接続してコンテナの中身を確認する場合は、以下のコマンドでターミナルにアタッチ可能です(exit で元のホストに戻ります):
$ docker exec -it wordpress1 /bin/bash

コンテナを停止する場合は以下のコマンドを実行します:
$ docker stop wordpress1

停止したコンテナを再起動する場合は以下のコマンドを実行します:
$ docker start wordpress1

停止したコンテナを削除する場合は以下のコマンドを実行します(コンテナを削除し、MySQL データベースも drop してデータごと削除します):
$ ./docker_rm_wordpress.sh 1


では1つ目の WordPress 環境を起動したまま、2つ目の WordPress を追加で起動してみます。以下のコマンドを実行します:
$ ./docker_run_wordpress.sh 2

このコマンドが成功すると、8082 番ポートで wordpress2 という名前の新しい docker コンテナが起動します。ウェブブラウザで http://localhost:8082/ にアクセスすると、新しい WordPress の初期設定画面に遷移し、同様にサイト名やログイン設定などを指定して利用を開始できます(それぞれが独立した環境なので起動済みの WordPress1 側には変化や影響はありません):

2021030707


2021030708


2021030709


wordpress2 のコンテナについても wordpress1 環境同様に docker コマンドで操作可能です。

後は必要なだけこの操作を繰り返すことで、WordPress 環境をコマンド1回ずつ追加していくことができます。ポート番号が利用中でなければ、おそらく好きなだけ起動できるはず(ポート番号が 8081 から始まるルールを変更したい場合は docker_run_wordpress.sh スクリプト内で適当な値に変更してください)。


そこそこのスペックを持った docker 導入済みのサーバーが1台インターネット上にあれば、DNS やポートフォワーディングなどと組み合わせることで複数の WordPress 環境を好きなタイミングで好きなだけ簡単に構築することができるようになると思っています。docker 環境なのでコンテナごと消してしまえば元のホスト環境を汚すこともなく元に戻せます(開発環境だと大事!)。

なお Github 上に公開したシェルスクリプトはそのまま利用することができますが、特にインターネットに公開する WordPress の場合、セキュリティの観点からパスワード類は変更してから利用することを推奨します。その場合は以下の部分を(すべて同じ文字列に)変更してください:
(docker_run_mysql.sh ファイル内)
- docker コマンド実行時の環境変数 MYSQL_ROOT_PASSWORD の値

(docker_run_wordpress.sh ファイル内)
- docker コマンド実行時の環境変数 WORDPRESS_DB_PASSWORD の値

(docker_rm_wordpress.sh ファイル内)
- docker コマンド実行時のパラメータ -p に続いて指定されている文字列

このページのトップヘ