Docker コンテナで実行されている Web アプリケーションへのアクセス方法

DockerDockerBeginner
オンラインで実践に進む

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このチュートリアルでは、Docker コンテナ内で動作する Web アプリケーションへのアクセス方法を説明します。Docker コンテナの基本を学び、シンプルな Web アプリケーションをデプロイし、ホストマシンからアクセスする方法を習得します。この知識は、Docker を使用して Web アプリケーションを開発およびテストするために不可欠です。

Docker の理解とテストコンテナの実行

Docker は、コンテナ化を使用してアプリケーションとその依存関係をまとめてパッケージ化するプラットフォームです。これにより、アプリケーションはさまざまな環境で一貫して実行できます。

Docker のインストール確認

まず、Docker がシステムに正しくインストールされているか確認しましょう。

docker --version

Docker のバージョンを示す、次のような出力が表示されるはずです。

Docker version 20.10.21, build baeda1f

Docker イメージとコンテナの理解

Docker の用語では、

  • Docker イメージは、アプリケーションコード、ライブラリ、および依存関係を含むテンプレートです。
  • Docker コンテナは、イメージの実行中のインスタンスです。

Docker イメージを青写真、Docker コンテナをその青写真から作成された建物と考えてください。

最初の Docker コンテナの実行

Docker が正しく動作していることを確認するために、シンプルなコンテナを実行してみましょう。

docker run hello-world

次のような出力が表示されるはずです。

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
...

これにより、Docker がシステム上で正しく動作していることが確認できます。

基本的な Docker コマンド

知っておくべき基本的な Docker コマンドをいくつか紹介します。

  1. 実行中のすべてのコンテナを一覧表示するには:
docker ps
  1. すべてのコンテナ(停止したものも含む)を一覧表示するには:
docker ps -a
  1. システム上のすべての Docker イメージを一覧表示するには:
docker images

これらのコマンドを試して、出力を確認してください。 hello-worldコンテナを実行した後、docker ps -aを実行すると、それが一覧表示されるはずです(ただし、メッセージを表示した直後に終了するため、docker psには表示されません)。

シンプルな Web アプリケーションの作成

このステップでは、Docker コンテナにデプロイできる Python と Flask を使用して、シンプルな Web アプリケーションを作成します。

アプリケーションファイルのセットアップ

まず、Web アプリケーション用の新しいディレクトリを作成しましょう。

mkdir -p ~/project/my-web-app
cd ~/project/my-web-app

次に、シンプルな Flask アプリケーションを作成しましょう。nano エディタを使用して、app.pyというファイルを作成します。

nano app.py

ファイルに次の Python コードを追加します。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "<h1>Hello from Docker!</h1><p>This is a simple web application running in a Docker container.</p>"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Ctrl+Oを押して Enter キーを押し、ファイルを保存し、次にCtrl+Xを押して nano を終了します。

次に、アプリケーションの依存関係を指定するrequirements.txtファイルを作成します。

nano requirements.txt

ファイルに次の行を追加します。

flask==2.0.1

Ctrl+Oを押して Enter キーを押し、ファイルを保存し、次にCtrl+Xを押して nano を終了します。

Dockerfile の作成

次に、アプリケーションをどのようにコンテナ化するかを定義する Dockerfile を作成しましょう。

nano Dockerfile

ファイルに次の内容を追加します。

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]

この Dockerfile は、次のことを行います。

  1. 軽量な Python 3.9 イメージをベースとして使用します。
  2. 作業ディレクトリを/appに設定します。
  3. requirements ファイルをコピーし、依存関係をインストールします。
  4. アプリケーションコードをコピーします。
  5. ポート 5000 をインバウンド接続用に公開します。
  6. コンテナの起動時に実行するコマンドを指定します。

Ctrl+Oを押して Enter キーを押し、ファイルを保存し、次にCtrl+Xを押して nano を終了します。

Docker イメージのビルド

次に、Dockerfile から Docker イメージをビルドしましょう。

docker build -t my-flask-app .

-tフラグは、イメージにmy-flask-appという名前のタグを付けます。末尾の.は、Dockerfile が現在のディレクトリにあることを指定します。

次のような出力が表示されるはずです。

Sending build context to Docker daemon  x.xxxkB
Step 1/6 : FROM python:3.9-slim
 ---> xxxxxxxxxx
Step 2/6 : WORKDIR /app
 ---> Using cache
 ---> xxxxxxxxxx
...
Successfully built xxxxxxxxxx
Successfully tagged my-flask-app:latest

次に、イメージが作成されたことを確認します。

docker images | grep my-flask-app

新しく作成されたイメージがリストに表示されるはずです。

Docker コンテナでの Web アプリケーションの実行

Docker イメージをビルドしたので、コンテナとして実行し、Web アプリケーションにアクセスしてみましょう。

コンテナの実行

コンテナを実行し、Web アプリケーションにアクセスできるようにポートをマッピングするには、次のコマンドを使用します。

docker run -d -p 5000:5000 --name my-web-container my-flask-app

このコマンドは、次のことを行います。

  • -d: コンテナをデタッチモード(バックグラウンド)で実行します。
  • -p 5000:5000: コンテナのポート 5000 をホストのポート 5000 にマッピングします。
  • --name my-web-container: コンテナに名前を割り当てます。
  • my-flask-app: 使用するイメージを指定します。

コンテナが実行されていることの確認

コンテナが実行されていることを確認しましょう。

docker ps

次のような出力が表示されるはずです。

CONTAINER ID   IMAGE          COMMAND           CREATED          STATUS          PORTS                    NAMES
xxxxxxxxxxxx   my-flask-app   "python app.py"   xx seconds ago   Up xx seconds   0.0.0.0:5000->5000/tcp   my-web-container

Web アプリケーションへのアクセス

次に、次の 2 つの方法で Web アプリケーションにアクセスできます。

  1. コマンドラインから curl を使用する:
curl http://localhost:5000

HTML レスポンスが表示されるはずです。

<h1>Hello from Docker!</h1><p>This is a simple web application running in a Docker container.</p>
  1. Web ブラウザを使用する:
    • デスクトップ環境で Web ブラウザのアイコンをクリックします。
    • アドレスバーにhttp://localhost:5000と入力します。
    • "Hello from Docker!"に続いて説明テキストが表示されるはずです。

ポートマッピングの理解

-p 5000:5000を使用してコンテナを実行すると、次の間のマッピングが作成されます。

  • ホストポート(最初の数字):5000
  • コンテナポート(2 番目の数字):5000

これは、ホストマシン上のポート 5000 に送信されたすべてのトラフィックが、コンテナ内のポート 5000 に転送されることを意味します。

異なるポート番号を使用することもできます。たとえば、-p 8080:5000は、ホストポート 8080 をコンテナポート 5000 にマッピングし、http://localhost:8080でアプリケーションにアクセスできるようにします。

コンテナログの検査

コンテナからのログを表示する必要がある場合(デバッグに役立ちます)、次を使用します。

docker logs my-web-container

Flask アプリケーションの起動メッセージが表示されるはずです。

コンテナの停止と削除

コンテナを停止するには、次を使用します。

docker stop my-web-container

停止したコンテナを削除するには、次を使用します。

docker rm my-web-container

単一のコマンドでコンテナを停止して削除することもできます。

docker rm -f my-web-container

これは、開発中にコンテナをすばやく再構築して再実行する場合に役立ちます。

高度な Docker コンテナ管理

Web アプリケーションを Docker コンテナで正常に実行できたので、Docker コンテナを管理するための追加の機能とテクニックをいくつか見ていきましょう。

複数のインスタンスの実行

Web アプリケーションの複数のインスタンスを異なるポートで実行できます。これは、テストや、アプリケーションの異なるバージョンを同時に実行する場合に役立ちます。

まず、以前のコンテナを停止して削除しましょう。

docker rm -f my-web-container

次に、Web アプリケーションの 2 つのインスタンスを異なるポートで実行しましょう。

docker run -d -p 5000:5000 --name web-app-1 my-flask-app
docker run -d -p 5001:5000 --name web-app-2 my-flask-app

両方のコンテナが実行されていることを確認します。

docker ps

2 つのコンテナが実行されているはずです。

CONTAINER ID   IMAGE          COMMAND           CREATED          STATUS          PORTS                    NAMES
xxxxxxxxxxxx   my-flask-app   "python app.py"   xx seconds ago   Up xx seconds   0.0.0.0:5001->5000/tcp   web-app-2
xxxxxxxxxxxx   my-flask-app   "python app.py"   xx seconds ago   Up xx seconds   0.0.0.0:5000->5000/tcp   web-app-1

これで、同じアプリケーションに 2 つの異なるポートでアクセスできます。

  • http://localhost:5000
  • http://localhost:5001

コンテナのリソース制限

Docker では、コンテナのリソース制限を設定できます。これは、コンテナが過剰なシステムリソースを消費するのを防ぐのに役立ちます。

以前のコンテナを停止して削除しましょう。

docker rm -f web-app-1 web-app-2

次に、メモリと CPU の制限を設定してコンテナを実行しましょう。

docker run -d -p 5000:5000 --name limited-container --memory=512m --cpus=0.5 my-flask-app

このコマンドは、次のコンテナを作成します。

  • 最大 512MB のメモリ
  • 最大 0.5 CPU コア

コンテナが実行されていることを確認します。

docker ps

コンテナの環境変数

環境変数は、Docker コンテナでアプリケーションを構成するための一般的な方法です。環境変数を使用するように Flask アプリケーションを変更しましょう。

docker rm -f limited-container

app.py ファイルの新しいバージョンを作成します。

cd ~/project/my-web-app
nano app_env.py

次のコードを追加します。

import os
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    app_name = os.environ.get('APP_NAME', 'Default App')
    return f"<h1>Hello from {app_name}!</h1><p>This is a simple web application running in a Docker container.</p>"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Ctrl+Oを押して Enter キーを押し、ファイルを保存し、次にCtrl+Xを押して nano を終了します。

新しい Dockerfile を作成します。

nano Dockerfile-env

次の内容を追加します。

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app_env.py ./app.py
EXPOSE 5000
CMD ["python", "app.py"]

Ctrl+Oを押して Enter キーを押し、ファイルを保存し、次にCtrl+Xを押して nano を終了します。

新しいイメージをビルドします。

docker build -t my-flask-app-env -f Dockerfile-env .

次に、環境変数を使用してコンテナを実行します。

docker run -d -p 5000:5000 --name env-container -e APP_NAME="Customized App" my-flask-app-env

Web アプリケーションにアクセスします。

curl http://localhost:5000

次のように表示されるはずです。

<h1>Hello from Customized App!</h1><p>This is a simple web application running in a Docker container.</p>

これは、環境変数を使用してコンテナ化されたアプリケーションに構成を渡す方法を示しています。

まとめ

この Lab では、Docker コンテナで実行されている Web アプリケーションにアクセスする方法を学びました。簡単な Flask Web アプリケーションを作成し、Docker を使用してコンテナ化し、ポートマッピングを使用してホストマシンからアクセスしました。

カバーされた主な概念:

  • Docker イメージとコンテナの理解
  • Flask を使用したシンプルな Web アプリケーションの作成
  • Dockerfile を使用した Docker イメージのビルド
  • コンテナ化された Web アプリケーションの実行とアクセス
  • さまざまなコマンドによる Docker コンテナの管理
  • 異なるポートでの複数のコンテナインスタンスの実行
  • コンテナのリソース制限の設定
  • コンテナ構成のための環境変数の使用

これらのスキルは、コンテナ化されたアプリケーションを扱うための強固な基盤を提供し、Docker を使用して Web アプリケーションを効率的にデプロイおよびテストするのに役立ちます。