1. システムとオフィスの融合|株式会社QES
  2. media
  3. セキュリティ Docker
  4. Dockerコンテナを使って、古いシステムのお守りをしよう

QESブログ

Dockerコンテナを使って、古いシステムのお守りをしよう

  • LINEで送る
  • このエントリーをはてなブックマークに追加


こんにちは。システムソリューション営業本部の吾妻です。


システムソリューション営業本部では、月に1,2回ずつ、部員の技術力向上を目的とした社内講習会を(業務時間内に)開催しており、
講習会を録画したものは、社内向けにMicrosoft Streamで配信しています。

本記事は、そうした社内講習会のうち、先月開催した「社内Docker講習会」の内容の一部を抜粋して再編集したものです。

今回とりあげているネタ的に、(新卒採用に関連して検索してここに辿り着いた方など)あまり若い方だと今一つピンと来ないかもしれないので、
まわりのちょっと年上のおじさんに「あの頃の思い出」を聞いてみるなどして、雰囲気を感じてみてください。





先日、とあるWebマガジンを読んでいた際に、「個人サイト」を令和のいま、再現するといった記事を見かけました。
個人サイトとは、2000年頃までインターネット上に溢れていた、HTMLを手打ちして作られていたホームページ(×Webページ)で、
SNSやCMSで情報発信することがほとんどになってしまった最近では、目にする機会もだいぶ少なくなった気がします。
こうした個人サイトには、「アクセスカウンター」や「掲示板」が併設されていて、最近のSNSとは一味違った交流がなされていました。

今回は、この「掲示板」を、Dockerコンテナ上で実行させて、あの頃の懐かしさを体感しよう、というのがサブテーマです。

***

ところで、システム開発を行っていると、大昔に開発したシステムについて、機能や挙動に関するお問い合わせや、機能改修のお話をいただくことがあります。
最近では、システムソリューション営業本部で開発するシステムは、.NETアプリケーション(特にC#)が主流になっていますが、
大昔に開発されたシステムなので、Perl言語で開発されたWebアプリケーションであったり、フレームワークが利用されていないPHPアプリケーションであったりします。

そのような状況においては、「開発環境」や「検証環境」の存在が重要になってきますが、即座に完全に動作する状態でこれらの環境が残っていることは少なく、外部メディアにバックアップされていたり、ソースコードしか残っていなかったり、場合によっては(担当者が異動していたり定年退職していたりして、)どこに存在するかわからないこともあります。

従来、「開発環境」や「検証環境」を用意するためには、VMware vSphereのような仮想化ソフトウェアを利用して、仮想マシンを1台または複数台用意して、本番環境で動いているシステムと同じように動作する環境を用意する方法が取られてきました。

しかし、仮想マシンを使用した検証環境構築では、OSから上を仮想化するためリソースの消費量が多めであったり(そのため、利用し終わった段階で削除されてしまうこともある)、同じシステムの同じ仮想マシンのように見えるものの、微妙に内容の異なる仮想マシンが乱立するうえに、差分を確認することが困難といった問題が発生することがあります。

このような課題点を解決するために、Dockerコンテナを利用して、開発/検証環境を用意・運用していく方法について、
「古いシステム」の題材として、冒頭でお話しした「掲示板」を例に挙げて、ご紹介していきたいと思います。


コンテナの構成

今回用意するDockerコンテナの構成図を示します。

Docker コンテナを複数個起動したり、ボリューム(ファイルを共有する領域)やネットワークを管理して各々のコンテナ同士が連係して動作できるように制御したりしなければならないことから、 Docker Compose を利用して、 docker-compose.yml に定義した内容を基にして、 Docker コンテナやネットワークをセットアップしていきます。


作成するコンテナを、プロキシコンテナ、SSL証明書取得用コンテナ、Webコンテナと呼ぶことにします。
docker-perl-containers.png

図に記載しているコンテナは3つですが、実際には(内容の異なる)Webコンテナを複数立ち上げることもできるので、合計4つ以上のコンテナが実行される場合もあります。

それぞれのコンテナの処理内容は、以下のようになります。
  • プロキシコンテナ …同じネットワークの中でWebコンテナが起動されたり停止されたタイミングを監視しており、ユーザーからのHTTPリクエストを受け付けて、条件に合致したWebコンテナに転送する
  • SSL証明書取得用コンテナ …「フリーな SSL/TLS 証明書」を発行するLet's Encryptに対して証明書の発行を依頼したり、発行された証明書を管理する
  • Webコンテナ …Webサーバーが動作しており、リクエストに応じたコンテンツを返す。「掲示板」のCGIスクリプトはここで実行される。複数のWebコンテナを立ち上げる場合は、サブドメインを区別してプロキシコンテナにアクセスすることで、希望するWebコンテナにアクセスすることができる
前2つのコンテナに関しては、Docker Hubで公開されているイメージを利用することにします。
プロキシコンテナとして🐋jwilder/nginx-proxyを、SSL証明書取得用コンテナとして🐋jrcs/letsencrypt-nginx-proxy-companionを利用します。


実装

以下のようなファイル・フォルダ構成ができあがる予定です。これら必要なファイルはGitHub上で公開しています。

docker-perl-dir.png

まずdocker-compose.ymlを用意します。①プロキシコンテナ、②SSL証明書取得用コンテナと、Webコンテナとして「③静的なHTMLページのみを返すNginxコンテナ」、「④掲示板のCGIスクリプトを実行して結果を返すNginxコンテナ」の合計4つのコンテナを定義します。

docker-compose.yml の定義内容として、全てのコンテナが同一のネットワーク内で起動される設定になっていること、サンプルファイルで「example.com」と定義されているドメイン名が適切に(qes.co.jpのような、実在していてご自身で所有しているドメインに)修正されていることの2点を確認してください。


次に、掲示板のCGIスクリプトを実行して結果を返す方のWebコンテナについて、Dockerfileを書いて定義していきます。
 ※HTMLページのみの方のWebコンテナについては、Nginx公式イメージをそのまま起動するのでDockerfileを作る必要がありません。

コンテナ内で実行する掲示板のCGIスクリプトとして、今回はKENT-WEBさんで公開されているYY-BOARDを利用することにします(商用利用も可とのことですが、条件などは予めご確認ください)。
そこで、Dockerfileには、(1)Perl実行環境の準備、(2)CGIスクリプトが入ったzipファイルのダウンロード、(3)zipファイルの展開、(4)スクリプトの修正、の4つの処理を定義していく必要があります。特に(4)スクリプトの修正では、改行コードの変換(昔FTPでアスキーモードで転送した状況の再現)・shebangの変更・パーミッションの変更の処理を行うことがポイントです。

続いて、Dockerfileと同じフォルダに、Nginxの設定ファイルdefault.confを定義していきます。
ここでは、ファイル名が指定されずにアクセスされた場合に、index.htmlやindex.cgiではなくyybbs.cgiを返すようにindex設定を変更します。

最後に、「③静的なHTMLページのみを返すNginxコンテナ」で利用するHTMLファイルを用意しておきます。
このコンテナはあくまでも動作確認用のものなので、HTMLファイルの内容もHello, world程度の簡単な内容で構いません。


DNS設定

複数のWebコンテナを立ち上げる場合はサブドメインを各々に割り当てることになるのですが、この際に、DNSサーバー側でワイルドカード設定を行っておかないと上手く転送されないため、DNSサーバーのレコード設定を確認しておきます。ドメインを購入した事業者のDNSレコード設定画面で、以下の図のように、ルートドメインとサブドメイン(*.~~~)で同じIPアドレス(VALUE)に転送されるようになっていれば問題ありません。
docker-perl-dns.png


ファイアウォール設定

ユーザーからのリクエストはHTTPSで飛んでくるため、443ポートを開放するのは勿論ですが、Let's Encryptの証明書取得処理の中で、Let's Encrypt側の認証用サーバーとACMEクライアントとの間でHTTP通信をする必要もあるため、80ポートも開放する必要があります。80ポートが開放されていれば、外部から見て http://<ドメイン名>/.well-known/acme-challenge/ にあたるパスにファイルが自動的に生成され、そこに対してLet's Encrypt側の認証用サーバーからリクエストが飛んでくることが( docker-compose logs コマンドで)確認できます。


コンテナの起動

Docker Composeでコンテナ群・ネットワークを構築・起動するために、以下のコマンドを実行します。

 docker-compose up -d 

コンテナが起動したのちに、docker-compose.yml内でbbsサービスのVIRTUAL_HOST環境変数に指定したサブドメインにアクセスして、掲示板の画面が表示されればOKです。

docker-perl-yybbs.png

このように、数キロバイト程度のテキストファイルさえ用意すれば、Dockerコンテナによって即座に開発・検証環境を実行できることから、冒頭に挙げたような仮想マシンによる環境整備での、リソースが足りなくなって古いものが消されてしまう運用であったり、差分比較が困難だったりといった課題を解決するうえで非常に有用だと言えます。


まとめ


今回は、開発・検証環境整備におけるDockerコンテナの活用について簡単にご紹介しました。
本記事の基になっている、社内Docker講習会も継続して実施しているので、同様にブログの記事としてご紹介していければと考えています。
次回の記事では、本番運用におけるDockerコンテナの活用やクラウドへの展開についてご紹介する予定です。


ちなみにQESではクラウドエンジニアを募集中です。
今回の記事でご紹介したようなDockerについて、また、Kubernetesや
それらのクラウド展開といったテーマにご興味のある方はこちらもご覧ください。








関連記事はこちら







このブログで参照されている、 YY-BOARD は、 KENT-WEB さんで公開されているフリーソフトです(利用規定)。



このブログで参照されている、 Let's Encrypt は、米国およびその他の国における Internet Security Research Group (ISRG) の商標または登録商標です。

このブログで参照されている、 Git は、米国およびその他の国における Software Freedom Conservancy, Inc. の商標または登録商標です。

このブログで参照されている、 GitHub は、米国およびその他の国における GitHub Inc. の商標または登録商標です。

このブログで参照されている、DockerおよびDocker Composeは、米国およびその他の国における Docker Inc. の商標または登録商標です。

このブログで参照されている、Microsoft、Windows、その他のマイクロソフト製品およびサービスは、米国およびその他の国におけるマイクロソフトの商標または登録商標です。
  • LINEで送る
  • このエントリーをはてなブックマークに追加

お気軽にお問い合わせください。

ページのトップへ