サーバー・サーバーレス・コンテナの違い — アプリケーションサーバー層

この記事は、プログラミングやバイブコーディングをする上で最低限身につけたほうがよい IT の実践的な知識を 1 から身につける「IT 基礎知識講座の一部」です。
違いは、処理のプログラムが動いている時間です。起動したまま待つ形、要求のときだけ動く形、1 つの OS の上で実行環境ごと動くコンテナを、図解で見分けられるようにします。

この記事は、アプリケーションサーバー層を動かす 3 つの形を扱います。

1 台のサーバーを起動したままにする常時稼働、要求が届いたときだけ動かすサーバーレス、そしてコンテナです。

違いは、処理のプログラムが動いている時間です。

動いている時間が違うので、要求が増えたときの増やし方も、自分で用意するものも変わります。

動かし方は、動いている時間で 3 つに分かれる
アプリケーションサーバー層を動かす要求がない時間にも動かしておく要求が来たときだけ動かす常時稼働のサーバーコンテナサーバーレス
左の 1 つから、要求がない時間にも動いている必要があるかどうかで上下に分かれます。上は起動したまま、下は呼ばれたときだけ動きます。

常時稼働のサーバーは、起動したまま要求を待ち続ける

リクエストはいつ届くか分からないので、server.js を先に動かし、プロセス(process。起動して動いている状態のプログラム 1 つ分)として待たせておきます。

このプロセスを終了させずに置いておく形が常時稼働(always-on。プログラムを起動したままにして、要求をいつでも受け付けられる状態を保つこと)です。

Server listening on port 3000
Press Ctrl+C to stop

1 行目は、決めたポート番号で要求を待ち受けている状態を示します。

2 行目のとおり、止める操作をするまでプロセスは終わりません。

その時刻に届いたものserver.js のプロセスWeb サーバー層に返る文字
9:00 起動の操作立ち上がって待ち受けに入るまだ何も返らない
9:05 /reservations の要求そのまま受け取り予約を調べる予約 3 件
9:06 何も届かない終わらずに待ち続ける何も返らない
起動したままのサーバーの中にあるもの
動かし続けるコンピュータ
node のプロセス(node server.js で立ち上がる)
  • ポート 3000 で要求を待ち受ける
  • 止める操作をするまで終わらない
server.js — 予約アプリの処理を書いたファイル
  • /reservations に届いた要求の処理を書いてある
  • データベース層に予約の件数を問い合わせる
OS と、自分で入れた node
  • node は公式サイトから入れておく
  • OS の更新も自分で行う
外枠が動かし続けるコンピュータ。その中で node のプロセスが待ち受け、さらにその中で自分の書いた server.js が読まれている。

自分で用意するのは、いちばん内側の server.js だけではありません。

動かし続けるコンピュータも、その上の OS も node も自分で用意します。

ここが、次に見るサーバーレスとの大きな違いです。

囲みの中が、自分で用意して動かし続ける 1 台です。

プロセスは要求が来ていない時間も終了せず、ポートを開けたまま待っています。

常時稼働は、止めるまで動いたまま

常時稼働のサーバーとは、先に動かしておいて、要求が来るのをずっと待たせておく形です。

動かし始めるのが node server.js で、止める操作をするまでプロセスは終わらず、動かし続けるコンピュータも OS も node も自分で用意します。

サーバーレスは、要求が届いたときだけ処理を動かす

サーバーレス(serverless。要求が届いたときだけ処理のプログラムが動き、処理が終わると止まる形)では、待ち受けるプロセスを自分では動かしません。

登録するのは handler.js のような 1 つのファイルで、登録の単位を「関数」と呼びます

サーバーレスで、事業者が用意する範囲と自分が置くもの
クラウド事業者の仕組み
要求を受け取って呼び出す部分
  • 届いた要求を受け取る
  • 同時に動かす数を決める
要求のたびに用意される実行環境
  • OS と node は事業者が用意する
  • 処理が終わると止まる
handler.js — 予約アプリの処理を置いたファイル
  • /reservations に届いた 1 回分だけを処理する
  • 動ける時間には上限がある
外枠がクラウド事業者の仕組み。上の枠は要求を受け取る部分で、常に動いている。下の枠が要求のたびに用意される実行環境で、その中にあるのが自分の handler.js。

自分が触るのは、いちばん内側の handler.js だけです。

その外側の枠は事業者が用意し、OS や node の更新も事業者が行います。

誰がどこまで用意するかは「オンプレ・レンタルサーバー・クラウド」の記事で扱います。

要求が届いていない間、handler.js は動いていません。

実行環境は要求のたびに用意され、返し終わると止まります。

ここが、止めるまで動いたままの常時稼働との違いです。

サーバーレスは、呼ばれたときだけ動く

サーバーレスとは、要求が届いてから処理を動かし、返し終わったら止める形です。

自分が置くのは handler.js だけで、それを動かす実行環境は要求のたびに事業者が用意します。

同時の要求が増えたときの、増やし方が違う

同時に届くリクエストの数は、時間帯によって変わります。

これに合わせて行うのがスケーリング(scaling。要求の量に合わせて、処理する側の数を増やしたり減らしたりすること)です。

サーバーレスに 3 件が同時に届いた形から見ます。

3 件が同時に届くと、実行環境も 3 つ立ち上がる
A さんの/reservations 要求B さんの/reservations 要求C さんの/reservations 要求要求を受け取る部分事業者の仕組み実行環境 1handler.js が動く実行環境 2handler.js が動く実行環境 3handler.js が動く
左の 3 件は、どれも同じ /reservations への要求。真ん中でいったん受け取ったあと、要求 1 件につき 1 つずつ実行環境が用意される。

事業者が決めた同時に動かせる数までは、待たされる要求はありません。

増やす操作も自分ではしません。

常時稼働のサーバーでも同じ役割は要りますが、行う相手が変わります。

常時稼働とサーバーレスで、同じ役割を持つもの
===要求を待ち受けるnode のプロセスがポート 3000 で待つ事業者の受け取る部分処理を動かす同じプロセスの中でserver.js を実行実行環境を用意してhandler.js を実行数を増やす自分でプロセスや台数を増やす事業者の仕組みが同時に増やす
左列が役割、中列が常時稼働のサーバー、右列がサーバーレス。二重線で結んだ 2 つは、やっていることが同じで、行う相手だけが違います。

変わるのは、増やす判断を自分でするか、事業者の仕組みに任せるかです。

増えたあとは同じ人の要求が毎回同じ相手に届くとは限らないので、ステートレス(stateless。1 回の処理が、前の処理で覚えた値を持たないこと)が求められます。

1 回目で覚えた値を 2 回目で読めるかは、その値をどこに置いたかで変わります。

次の要求でも使う値は、データベース層に保存して読み出します。

常時稼働のサーバーでも同じで、プロセスを増やすと別のプロセスには残りません。

増やし方と、値の置き場所

同時の要求が増えたとき、常時稼働では自分で数を増やし、サーバーレスでは事業者の仕組みが増やします。

増えたあとは同じ人の 2 回の要求に同じ相手が答えるとは限らないので、次も使いたい値はその場のメモリではなく、データベース層に保存します。

コンテナは 1 つの OS の上で動き、常時稼働が要るかで 3 つから選ぶ

3 つ目のコンテナ(container。アプリと実行環境と必要なファイルを 1 つにまとめ、同じ構成のまま別のコンピュータで動かす形式)は、動いている時間は常時稼働のサーバーと同じです。

違うのは、実行環境をコンピュータに入れるのではなく、アプリと一緒に包んでしまうところです。

同じ 3 つのアプリを、3 台で動かす場合と 1 台のコンテナで動かす場合
アプリごとに 1 台ずつ用意する
用意するもの
  • コンピュータ 3 台
  • OS 3 つ
  • Node.js 18 / Python 3.11 / Node.js 20 を別々の台に入れる
1 台をコンテナで分け合う
コンピュータ 1 台・OS 1 つ — 3 つのコンテナがこの上で動く
コンテナ 1
  • プロセス 1 つ
  • Node.js 18
  • server.js
コンテナ 2
  • プロセス 1 つ
  • Python 3.11
  • batch.py
コンテナ 3
  • プロセス 1 つ
  • Node.js 20
  • admin.js
上はアプリごとに 1 台ずつ用意する形で、機器も OS も 3 つ分いる。下は 1 台の OS の上で 3 つのコンテナがそれぞれ 1 つのプロセスとして動く形で、機器も OS も 1 つで足りる。

OS は 1 つで、コンテナはその上でそれぞれ 1 つのプロセスとして動きます。

実行環境はコンテナの中に別々に入っているので、隣が何を使っていても影響を受けません。

CPU やメモリのような、動かすために使う機器の分がリソース(resource)です。

上は OS を 3 つ動かしますが、下は 1 つの OS を分け合うので、同じ機器により多くのアプリを載せられます。

同じ台数でより多く動かせて、動かし続ける費用も少なく済みます。

OS を新しく起動しないので、動かし始めるまでの時間も短くなります。

同じ 1 台で 2 つ動かすとき、実行環境をどこに入れるかで結果が変わる
同じ 1 台でNode 18 と Node 20 を動かしたい実行環境をOS に入れる1 台に入る node は1 つだけどちらかに合わせるしかない実行環境ごとコンテナにまとめるコンテナごとに自分の node を持つ2 つをそのまま並べて動かせる
左が動かしたいことです。上の道は実行環境をコンピュータに入れる場合、下の道はコンテナにまとめる場合。同じ 1 台でも、置き場所が違うと結果が変わります。

1 台の OS に入れられる node は 1 つですが、コンテナなら別々の node を持ったまま並べられます。

アプリごとに実行環境が分かれているので、片方のバージョンを上げても、もう片方は動いたままです。

まとめたファイル一式がコンテナイメージ(container image。アプリ・実行環境・必要なファイルを 1 つにまとめたもの)で、それを作って動かす代表的なソフトウェアが Docker です。

動かす側は、このイメージを受け取って起動するだけです。

同じ 1 つのイメージが、どこで動かしても同じ構成になる
アプリ・実行環境・必要なファイル1 つにまとめたコンテナイメージ手元のパソコン公開サーバー同僚のパソコン
左の 3 つを 1 つにまとめたものがコンテナイメージ。右の 3 か所は、そのイメージをそのまま起動するので、実行環境を入れ直す作業がいりません。

動かす場所が変わっても、起動するのは同じ 1 つのイメージです。

公開サーバーで実行環境を入れ直す作業がいらないので、手元で動いた構成のまま公開できます。

選ぶときの分かれ目は、要求がない時間にも動いている必要があるかどうかです。

もう 1 つの分かれ目が、1 台の機器にどれだけ載せられるかです。

常時稼働が要るかで、3 つの動かし方に分かれる
動かしたい処理要求がない時間にも動く必要がある実行環境はコンピュータに入れる常時稼働のサーバー実行環境ごと1 つにまとめるコンテナリクエストに答えるだけでよい呼ばれたときだけ動かすサーバーレス
左の 1 つから、要求がない時間にも動く必要があるかどうかで分かれます。上の 2 本は起動したまま動かし続け、下の 1 本は要求が届いてから動き出します。

上の 2 本は、要求がない時間もプロセスが動いたままです。

その 2 本は、実行環境をコンピュータに入れるか、実行環境ごと 1 つにまとめるかで分かれます。

起動したまま動かす 2 つは、要求がない時間の分も動かし続けることになります。

サーバーレスで数えられるのは、動いた時間と呼ばれた回数だけです。

要求がまばらなうちは、この違いがそのまま差になります。

動いている時間で選ぶ

要求がない時間にも動いている必要があるかどうかで、まず 2 つに分かれます。

必要がないならサーバーレス、必要があるなら常時稼働のサーバーかコンテナです。

コンテナは 1 つの OS をアプリどうしで分け合うので、同じ機器に何本も載せられ、動かし続ける費用を抑えられます。

手元と公開先で構成をそろえたいときも、コンテナを選びます。

QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1常時稼働のサーバーとサーバーレスで、処理のプログラムが動いている時間はどう違いますか。

Q2コンテナを使うのは、どういうときですか。

Q3処理の途中でメモリに置いた値を、次の要求でも使いたいときはどうしますか。