Docker Compose を使えば、複数のコンテナを簡単に管理できると聞いて、公式ドキュメントの「Docker Compose をはじめよう」にチャレンジしてみました。
今回は、Python(Flask)と Redis を使った簡単なウェブアプリを構築してみたので、その手順と初心者目線での気づきをまとめました!
前提条件
以下のソフトウェアがインストールされていることを確認してください:
- Docker Engine
- Docker Compose
PythonやRedisはDockerイメージとして提供されるため、事前のインストールは不要です。
Docker Compose を試してみた手順
プロジェクトの準備
まずは作業用ディレクトリを作成し、必要なファイルを用意しました。
ディレクトリの作成と移動
mkdir composetest
cd composetest
Pythonのコード(app.py)を作成
以下のコードを app.py に書き込みました。アクセスするたびにカウンターを増やす機能が入っています。
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
ポイント:
Redisとは、インメモリ型のデータストア(Key-Valueデータベース)の一種。
Flask(フラスク)とは、Pythonで作られた軽量なWebアプリケーションフレームワーク
app.pyの説明
- get_hit_count()関数
アクセスカウンターを管理します。 - 詳細な処理:
cache.incr('hits'):- Redis のキー
hitsの値を 1 増加させます。 - 初回アクセスの場合、キーが作成され初期値 0 から増加します。
- Redis のキー
- リトライ機能:
- Redis サーバーが利用できない場合、5回リトライします。
- リトライごとに0.5秒待機 (
time.sleep(0.5)) します。
- 例外処理:
- 5回リトライしても接続できない場合は、例外を投げます。
@app.route('/')/(ルートURL、トップページ)にアクセスしたときに、関数hello()が実行されます。
必要なライブラリをリスト化(requirements.txt)
依存関係を記載するファイルを作成しました。
flask
redis
初心者メモ:
requirements.txt は Python パッケージをリスト化したファイルで、環境構築を楽にしてくれるんですね。
初心者メモ:
Redis(Remote Dictionary Server)は、高速なデータアクセスを実現するオープンソースのインメモリ型データストアです。
主にキャッシュ、セッション管理、リアルタイム分析などに利用され、データをキーと値の形式で保存します。
Dockerfile を作成
次にアプリケーションをコンテナ化するための Dockerfile を作成しました。
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
ポイント:
FROM python:3.7-alpineで軽量なPythonイメージを指定。- Flask アプリを動かす準備をこのファイルにすべて記載しました。
初心者メモ:
Dockerfileは、イメージを作るための「レシピ」みたいなものでした。
Docker Compose ファイルを作成
Docker Compose でサービス全体を定義するため、docker-compose.yml を作りました。
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
構成のポイント:
web: Flask アプリ用のサービス。redis: Redis データベース用のサービス。
初心者メモ: 8000:5000 という書き方で、ホストのポート8000をコンテナのポート5000に紐付けることができるんですね!
composetest ディレクトリ内ファイル構成
composetest/
├── Dockerfile # Flask アプリをコンテナ化するための設定ファイル
├── docker-compose.yml # Docker Compose 設定ファイル
├── app.py # Flask アプリケーションのメインスクリプト
├── requirements.txt # Flask アプリケーションの依存パッケージリスト
コンテナ構成図

実行してみた!
準備が整ったので、いよいよ実行です。
コンテナのビルドと起動
以下のコマンドでアプリを立ち上げました。
docker-compose up
実行すると、いろいろなログが表示されて、コンテナが起動。ドキドキしながらブラウザで http://localhost:8000 にアクセスすると…
Hello World! I have been seen 1 times.

ちゃんと表示されました!さらにページをリロードするとカウントが増えていきます。

Redis がちゃんとデータを保持しているのが確認できました。
サービスの停止とクリーンアップ
アプリを終了するには以下のコマンドを実行します。
docker-compose down
これでコンテナが停止し、ネットワークも削除されました。
初心者が試してみて感じたこと
- 意外と簡単!
初めての Docker Compose でしたが、公式ドキュメントに従って進めれば迷わずにできました。 - Docker Compose の便利さを実感
docker-compose.ymlに必要な構成を書くだけで、複数のコンテナが連携するアプリを簡単に管理できるのは感動ものです。 - トラブルシューティングがカギ
最初、redisが動かず、コンテナのログを確認する必要がありました。docker-compose logsコマンドで原因を追えたので、基本操作を覚えるのが大切だと感じました。
まとめ
Docker Compose を使うことで、複数のコンテナが必要なアプリケーションも簡単に構築できることが分かりました。
公式ドキュメント「Docker Compose をはじめよう」は初心者にも分かりやすい内容なので、これから Docker を学びたい方にもおすすめです!
出典情報
本記事の内容は以下のページを参考にしています:
- Docker Compose をはじめよう
公式ドキュメントの翻訳をもとに、初心者の視点でまとめています。

