コンテナーとは?
説明
今あなたは 3 つのコンポーネントから構成される優れたウェブアプリを開発しているとします。 その 3 つのコンポーネントとは React フロントエンド、Python API、PostgreSQL データベースです。 このプロジェクトで働きたいなら、自分のマシンに Node、Python、PostgreSQL をインストールしなければなりません。
では同じチーム内の別の開発者のものと比較して、同じバージョンのソフトウェアが入っていることを、どうやって確認しますか? あるいはあなたの利用する CI/CD システムは他の人と同じですか? 本番環境にて用いられているバージョンと違うかどうかはどう確認しますか?
ではそのアプリケーションが必要としている Python (あるいは Node、あるいはデータベース) のバージョンが、すでにあなたのマシンに入っているものには全く影響を与えないことは、どうやったら分かりますか? 潜在的に競合するかもしれない状況をどのように管理しますか?
だったらコンテナーにしましょう!
コンテナーとは何なのか? 単純に言ってコンテナーとは、アプリの各コンポーネントごとに用意される独立したプロセスのことです。 各コンポーネント、つまりフロントエンドの React アプリ、Python API エンジン、データベース、これらがそれぞれに独立した環境において動きます。 それはマシン上で動作するあらゆるものから完全に独立しています。
コンテナーは実に優れたものであり、以下のような特徴があります。
- 自己完結しています (self-contained)。 各コンテナーはその動作に必要な機能をすべて持っています。 ですからホストマシン上にインストールされているパッケージには一切依存しません。
- 独立しています (isolated)。 コンテナーは独立して動作します。 したがってホストマシンや他のコンテナーへの影響は最小限で済み、その分だけアプリケーションのセキュリティは向上します。
- 他のものに依存しません (independent)。 各コンテナーはどこにも依存することなく管理されています。 一つのコンテナーを削除したからといって、他のコンテナーには影響がありません。
- 可搬性に優れます (portable)。 コンテナーはどこでも動かすことができます! 手元の開発マシン上で動作させているコンテナーは、まったく同様にしてデータセンター上でもクラウド上でも動作させることができます。
コンテナー vs. 仮想マシン
細かく言うまでもなく VM というものはオペレーティングシステムそのものであり、そのマシンに応じたカーネル、ハードウェアドライバー、アプリケーションを有しています。 ですからただ一つのアプリケーションを独立して稼働させるためだけに VM を起動するのであれば、それはオーバーヘッドとなります。
コンテナーは単に独立したプロセスに過ぎず、実行に必要なファイルを利用するだけです。 複数のコンテナーを実行しているなら、そのコンテナーはすべて同一のカーネルを用います。 つまりアプリケーションはより多く動作させることができ、それに比べてインフラは少なくて済みます。
VM とコンテナーの同時利用
コンテナーと VM を同時に利用している例はよく見かけます。 たとえばクラウド環境において暫定的に用意されるマシンといえば、通常は VM です。 ただし単に一つのアプリケーションを暫定的なマシン上で動作させるよりも、コンテナーランタイムを有する VM を使って複数のコンテナー化アプリケーションを実行することの方が、リソース利用率が向上し、かつコストは削減できます。
試してみよう
このチュートリアルでは Docker Desktop の GUI を使って Docker コンテナーを起動する方法について示していきます。
以下の手順によりコンテナーを起動します。
Docker Desktop を開いて、最上段のナビゲーションバーにある Search (検索) 欄を選びます。
検索語として
welcome-to-docker
を入力し Pull ボタンをクリックします。イメージが正常にプルできたら Run (実行) ボタンをクリックします。
Optional settings (任意の設定) を展開します。
Container name (コンテナー名) 欄に
welcome-to-docker
と入力します。Host port (ホストポート) 欄に
8080
と入力します。Run (実行) をクリックしてコンテナーを起動させます。
おめでとうございます! 初めてのコンテナー起動を行いました! 🎉
コンテナーの確認
コンテナーを確認するには Docker Desktop Dashboard の Containers (コンテナー) 画面を表示します。.
このコンテナーはウェブサーバーを起動するものであって、単純なウェブサイトを表示します。 これよりも複雑なプロジェクトで作業する場合には、さまざまなコンテナー内のさまざまな機能を実行することになります。 たとえばフロントエンド、バックエンド、データベースといった用途でコンテナーを動作させることも出てくることでしょう。
フロントエンドへのアクセス
コンテナーを起動した際に、コンテナー内のポートをホストマシンに向けて公開していました。 それができるということは、つまり独立したコンテナー環境に対して接続を行う設定ができるということです。
このコンテナーはフロントエンドとしてポート 8080
によりアクセスできます。
ウェブサイトを開くには、このコンテナーの Port(s) (ポート) カラムに表示されているリンクをクリックするか、あるいはウェブブラウザーから
http://localhost:8080 にアクセスします。
コンテナーの詳細確認
Docker Desktop を使うと、コンテナーのさまざまな情報について確認したり設定を行ったりすることができます。 実際に操作してみます。
Docker Desktop Dashboard の Containers (コンテナー) 画面を開きます。
目的のコンテナーを選択します。
Files (ファイル) タブを選ぶと、そのコンテナー内にて独立するファイルシステムを確認することができます。
コンテナーの停止
起動している docker/welcome-to-docker
コンテナーは、停止することで止まります。
Docker Desktop Dashboard の Containers (コンテナー) 画面を開きます。
停止したいコンテナーを選びます。
Actions (動作) カラムから Stop (停止) アクションを選びます。
CLI を用いる場合は、以下の手順に従ってコンテナーを起動します。
CLI 端末を開き、
docker run
コマンドの実行によってコンテナーを起動させます。$ docker run -d -p 8080:80 docker/welcome-to-docker
コマンドの出力結果にはコンテナーのフル ID が示されます。
おめでとうございます! 初めてのコンテナー起動を行いました! 🎉
起動中コンテナーの確認
コンテナーが起動中であることは
docker ps
コマンドを使って確認することができます。
docker ps
出力結果は以下のようなものとなります。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1f7a4bb3a27 docker/welcome-to-docker "/docker-entrypoint.…" 11 seconds ago Up 11 seconds 0.0.0.0:8080->80/tcp gracious_keldysh
このコンテナーはウェブサーバーを起動するものであって、単純なウェブサイトを表示します。 これよりも複雑なプロジェクトで作業する場合には、さまざまなコンテナー内のさまざまな機能を実行することになります。 たとえばフロントエンド、バックエンド、データベースといった用途でコンテナーを動作させることも出てくることでしょう。
情報
docker ps
コマンドが表示するのは実行中のコンテナー のみ です。 停止中のコンテナーも含めて確認するには-a
フラグを使ってdocker ps -a
とします。 これにより全コンテナーの一覧が得られます。
フロントエンドへのアクセス
コンテナーを起動した際に、コンテナー内のポートをホストマシンに向けて公開していました。 それができるということは、つまり独立したコンテナー環境に対して接続を行う設定ができるということです。
このコンテナーはフロントエンドとしてポート 8080
によりアクセスできます。
ウェブサイトを開くには、このコンテナーの Port(s) (ポート) カラムに表示されているリンクをクリックするか、あるいはウェブブラウザーから
http://localhost:8080 にアクセスします。
コンテナーの停止
起動している docker/welcome-to-docker
コンテナーは、停止することで止まります。
コンテナーの停止は docker stop
コマンドを使います。
docker ps
を実行して目的とするコンテナーの ID を得ます。docker stop
コマンドに対して、コンテナーの ID かあるいは名前を指定します。docker stop <the-container-id>
情報
コンテナー ID を用いるにあたっては ID をフルで指定する必要はありません。 コンテナー ID が唯一のものとして特定できる桁数だけ与えれば充分です。 たとえば上のコンテナーを停止させるには、おそらく以下のコマンドを使って実現できます。
docker stop a1f
さらなる情報
以下に示すリンクでは、コンテナーに関してのガイドとなる情報が示されています。
次のステップ
ここまでに Docker コンテナーの基本について学びました。 次は Docker イメージについて学びましょう。