はじめに
このチュートリアルでは、Docker コンテナ内で動作する Web アプリケーションへのアクセス方法を説明します。Docker コンテナの基本を学び、シンプルな Web アプリケーションをデプロイし、ホストマシンからアクセスする方法を習得します。この知識は、Docker を使用して Web アプリケーションを開発およびテストするために不可欠です。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
このチュートリアルでは、Docker コンテナ内で動作する Web アプリケーションへのアクセス方法を説明します。Docker コンテナの基本を学び、シンプルな Web アプリケーションをデプロイし、ホストマシンからアクセスする方法を習得します。この知識は、Docker を使用して Web アプリケーションを開発およびテストするために不可欠です。
Docker は、コンテナ化を使用してアプリケーションとその依存関係をまとめてパッケージ化するプラットフォームです。これにより、アプリケーションはさまざまな環境で一貫して実行できます。
まず、Docker がシステムに正しくインストールされているか確認しましょう。
docker --version
Docker のバージョンを示す、次のような出力が表示されるはずです。
Docker version 20.10.21, build baeda1f
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 ps
docker ps -a
docker images
これらのコマンドを試して、出力を確認してください。 hello-world
コンテナを実行した後、docker ps -a
を実行すると、それが一覧表示されるはずです(ただし、メッセージを表示した直後に終了するため、docker ps
には表示されません)。
このステップでは、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 を作成しましょう。
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 は、次のことを行います。
/app
に設定します。Ctrl+O
を押して Enter キーを押し、ファイルを保存し、次にCtrl+X
を押して nano を終了します。
次に、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 アプリケーションにアクセスしてみましょう。
コンテナを実行し、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
次に、次の 2 つの方法で Web アプリケーションにアクセスできます。
curl http://localhost:5000
HTML レスポンスが表示されるはずです。
<h1>Hello from Docker!</h1><p>This is a simple web application running in a Docker container.</p>
http://localhost:5000
と入力します。-p 5000: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
これは、開発中にコンテナをすばやく再構築して再実行する場合に役立ちます。
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
このコマンドは、次のコンテナを作成します。
コンテナが実行されていることを確認します。
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 を使用して Web アプリケーションを効率的にデプロイおよびテストするのに役立ちます。