はじめに
このチュートリアルでは、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 コマンドをいくつか紹介します。
- 実行中のすべてのコンテナを一覧表示するには:
docker ps
- すべてのコンテナ(停止したものも含む)を一覧表示するには:
docker ps -a
- システム上のすべての 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 は、次のことを行います。
- 軽量な Python 3.9 イメージをベースとして使用します。
- 作業ディレクトリを
/appに設定します。 - requirements ファイルをコピーし、依存関係をインストールします。
- アプリケーションコードをコピーします。
- ポート 5000 をインバウンド接続用に公開します。
- コンテナの起動時に実行するコマンドを指定します。
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 アプリケーションにアクセスできます。
- コマンドラインから curl を使用する:
curl http://localhost:5000
HTML レスポンスが表示されるはずです。
<h1>Hello from Docker!</h1><p>This is a simple web application running in a Docker container.</p>
- 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 つの異なるポートでアクセスできます。
コンテナのリソース制限
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 アプリケーションを効率的にデプロイおよびテストするのに役立ちます。



