素人がゼロからWebサービスを作るノウハウ!⑥Dockerを使おう

素人がゼロからWebサービスを作るノウハウ!⑥Dockerを使おう

前回は、開発環境もEC2について解説いたしました。
今回はDockerの活用について解説いたします。

Docker(ドッカー)の詳細は他のサイトにお任せするとして、私は素人こそDockerを使うのが良いと思っています。

Dockerを理解するのに最初は時間はかかりましたが、慣れてしまえばとても便利ですし、全体像を把握しやすくなるので気持ちよくシステムを運用できます。Dockerを理解するのにかけた時間はすぐに回収できると思います。

Dockerのロゴ
ホストコンピュータ(クジラ)の上にコンテナがのってるイメージ?

Dockerについての詳細は他のサイトを見ていただきたいですが、簡単に説明すると、コンテナ型の仮想化という技術により必要な機能(例えばデータベースサーバーだったりWebサーバーだったりWordPressだったり)をホストOS内に独立したコンテナという形で複数立ち上げることがで来ます。独立して立ちあがっているので、他のコンテナやホストOSに影響を及ぼすことがありません。
そして、必要な機能が組み込まれた形でイメージが無料で配布されて、それをダウンロードする事で気軽に使うことができます。

結局私のような素人だと、AmazlonLinuxの設定や環境をいじったり、ソフトをインストールするのを最小限にしたいと思うと思います。

なぜなら、設定する内容がどんどん増えていって、意味も分からず設定をいじったり、何をどこまで変更したのか把握しきれなくなったりして気持ち悪い状態に陥ってしまうからです。

そこで、行き着いた答えが、管理しやすい単位まで全体を分解してそれぞれのシステムを独立したDockerコンテナとして立ち上げて、それらを連携させて動かす。

そして、ホストOSの設定は最低限にする。です。

Dockerでシステムを構成するイメージ

EC2 AmazonLinux2に最低限の設定と、Docker+Docker-composeをインストールして、必要な機能をDockerコンテナとして立ち上げます。

リバースプロキシサーバを使い二つのコンテンツ(Webサービス1とブログ)を運用する例

 各コンテナは立ち上げ時に必要な設定情報をもとに立ち上がります。Webサービスで実行するプログラムのソースコードはWebサービス1コンテナとAmaazonLinux2間で共有したディレクトリ内に保存しており、Webサービス1コンテナでソースコードが読み込まれWebサービスが実行されます。(他のコンテナも必要に応じてディレクトリの共有を行い例えばログを保存したり、設定ファイルを読み込んだりします。)

各コンテナ同士の連携は下図のようになります。

リバースプロキシではWebサーバー(Webサービス1とブログ)にアクセスを振り分けるのと、SSL証明書の取得、更新とSSL通信に用いる暗号化通信の暗号化と複合化を担います。Webサーバーはデータベースと連携し、コンテナからのログはログ集約サーバに集約します。リソースモニターはEC2のリソース状態を監視しています。すべてのコンテナはEC2上で動いているので、全コンテナが消費しているリソースが確認できます。参考までに下図にnetdata出の負荷確認をしている画面を貼り付けました。赤枠はコンテナIDになっており個別のDockerコンテナの負荷状況も確認可能です。

netdataでサーバーのリソース状況をモニタリングしている画面

別途『Webサービス2』を追加

Webプロキシサーバーを使い三つのコンテンツを運用する例

各コンテナ間の通信には、Webサービス2が追加される形になります。

Webサービス2を追加するにあたり、EC2 AmazonLinux2での操作はWebサービス2のコンテナを起動するだけです。EC2 AmazonLinux2の設定を変えたりソフトをインストールする必要は全くありません。設定を変えるのは、リバースプロキシサーバーとデータベースサーバーにデータベースを用意する程度です。

各コンテナ間の通信には、Dockerネットワークというネットワークを用いることができますが、私の場合IPアドレスとポート番号で各コンテナを識別して通信させています。理由は、システムの構成を変えた際にネットワークの設定がシンプルになると考えたためです。

コンテナを分散

例えば、今までの構成ではEC2に負荷がかかりすぎているので、下図のようにリバースプロキシをAmazonロードバランサへ、データベースをAmazonRDSへ、EC2を二台構成にして、コンテナを分散させる等の改良が楽にできます。

このような改良を行っても、追加されたEC2用のリソースモニター用コンテナの追加とそのログがログ集約サーバーに送られるだけで、その他コンテナやサーバー間の通信は元のままです。

このように、システムの構成を変えるにあたってもEC2 AmazonLinux2の設定はほぼありません。管理が必要なのは、IPアドレスとポート番号で、全体が連携して動くように、ロードバランサや、データベース、各コンテナの設定を変えるだけで済みます。

また、各コンテナの設定は基本的に起動時やビルド時に初期化されます。そのため、起動やBuildされる際に、どのような設定を行うかや、どのようなコマンドを実行するかをファイル(Dockerfileやdocker-compose.ymlや別途用意した設定用ファイル)に書き込んでおき、それを読み込みます。
ファイルに設定や実行するコマンドを書き込んでいるので、コンテナに対しての操作がすべてファイルに記載されており、コンテナの状態もすっきり把握することができるようになります。下図は、Webサービス1のディレクトリのイメージです。

そして、このディレクトリーはDocker+Docker-composeがインストールされているコンピュータならどのコンピュータでも同じように動いてくれます。

Dockerを使う前の経験談

てるてる坊主が稼働しているサーバーにWordPress(ブログのシステム)も追加しようと考えました。

WordPressを使うにはデータベースサーバーとWebサーバーとPHPが必要です。データベースサーバーとWebサーバーはてるてる坊主で使っていたので、残りのPHPをAmazonLinuxにインストールしました。

そして、既存のWebServerやMySQLサーバーの設定をしたりユーザーを追加したりして、稼働できる状態に持っていきました。そこで、WordPressにアクセスすると、PHPのバージョンが古いので更新を検討するように表示されていました。PHPをバージョンアップしようとすると、なかなかうまくインストールできずに、既存のPHPを削除しようとしたり、設定を変えたり、ファイルをいじったり、よくわからないコマンドを打ち始めて、全体の状況が全く把握できなくなっていきました。結局PHPのバージョンを上げられず元のバージョンで運用する羽目になってしまったのですが、Amazlonlinuxの設定をわけもわからずいじっており、とても気持ち悪い状況に陥ります。

てるてる坊主はPythonで稼働しているので影響はなかったのですが、PHPで動いていたらさらに複雑になりわけがわからなくなっていたと思います。たぶん、私のような素人はソフトのインストールやバージョンアップなどで、はまることが多いと思います。そしてはまった時に設定関係を変更しては戻し、戻し忘れたり、意味ないところを変更したり、理解できていないコマンドを打つ羽目になり、OSがカオスな状況になっていくと思います。

ですが、Dockerがあるととてもすっきりします。

Docker-compose.ymlというファイルに、使用するWordPressのバージョンと公開するポート番号、使用するデータベースへの接続情報を記載して(データベースの用意がなかったら一緒にデータベースサーバーも立ち上げる設定を書いて)実行してしまえばそれで完了です。ホストOS側にWebサーバーをインストールする必要もPHPをインストールする必要もありません。

体験談では、WordPressに使うPHPのバージョンアップの話を出しましたが、それ以外にも同じような事は沢山ありました。例えば

GeoTalkで位置情報を扱うためMySQLサーバーのバージョンを8に上げたいが上手くいかずにカオス状態・・・
・Python2.6が入っているOSにPython3.6で作ったプログラムを実装しようとして、Python2.6と3.6の共存が上手くいかずにカオス状態に・・・
・EC2のリソース状況をリアルタイムで監視できる様にnetdataというソフトをインストールしたが、いつの間にかに使えなくなっていて(他のことをやっている間に変な設定をしたのが原因)結局復旧できず・・・

バージョンアップやトラブルシュートは玄人には簡単なんでしょうが、私の様な素人には、とても難解でした。問題が解決しても、『よくわかっていないけど、なんか動いているから良しとするか・・・』というパターンも多かったです。結果的にソフトのバージョンアップや、新しいソフトのインストールを躊躇するようになってしまいました。その点Dockerは気軽に試せるし、各コンテナが独立しているので、気軽にバージョンアップも行えます。

まとめ

Dockerには様々なメリットがありますが、素人的にうれしいのは下記の三点です。

  • ホストOSの設定を最小限にできる
  • コンテナの設定が分散せずコンテナ自体の動きも把握しやすい
  • だめだと思ったらすぐにコンテナを捨てられる(なかったことにできる)

Webサービスを立ち上げるうえで、Dockerを覚えるというひと手間がかかってしまいます。ですが、素人がシステムの状況をきちんと把握して環境の構築を行っていくにはDockerは大変強力なツールです!ぜひ、習得してカオスな状態から抜け出しましょう!

連載記事一覧

素人がゼロからWebサービスを作るノウハウ!①最初にやること
素人がゼロからWebサービスを作るノウハウ!②Pythonにする理由
素人がゼロからWebサービスを作るノウハウ!③学習はpaizaにする理由
素人がゼロからWebサービスを作るノウハウ!④サーバーをAWS.EC2.t2.microにした理由
素人がゼロからWebサービスを作るノウハウ!⑤開発環境もEC2
素人がゼロからWebサービスを作るノウハウ!⑥Dockerを使おう