どうも、ケニー(tsujikenzo)です。このシリーズでは、Docker入門をお届けしています。
前回は「Dockerfile編」で、Pythonアプリを動かすイメージを作りました。
今回は、複数のコンテナをまとめて起動できる「Docker Compose 前編」をお届けします。
Docker Composeとは
Docker Composeは、複数コンテナをまとめて管理・起動するための仕組みです。
1つのYAMLファイルに構成を書いて、まとめて起動できます。
なぜComposeが必要なのか
アプリが本格的になると、Webアプリ本体だけでなく、DBやキャッシュなど複数のサービスが必要になります。
Composeを使うと、毎回たくさんの docker run を打たなくても、1コマンドでまとめて起動できます。
今回のハンズオンの構成
スクレイピングでは「同じURLを何度も取りに行ってしまう」という問題がよく起こります。
この重複アクセスを減らすには、「取得済みURLを覚えておく仕組み」が必要です。
そこで「Redis(レディス)」を使います。
Redisは、データを管理するオープンソースのデータベースで、メモリ上で動作する高速なKVS(キーと値のペアで保存する仕組み)です。
データベース管理ソフトウェアといえば、MySQLやPostgreSQLのような「ディスクに保存するDB」が有名です。一方でRedisは、速さ重視で短期的なデータ保存に向いています。
今回のハンズオンでは、以下の流れを体験します。
- Python+Dockerだけでスクレイピングする
- RedisをDockerで動かしてみる(ポートを解放した状態を作る)
- PythonアプリとRedisを連携させて、スクレイピングを効率よく行う
スクレイピングの対象サイトは、以下です。
https://books.toscrape.com/まずはPythonだけで動かす
復習です。DockerfileとPythonアプリを準備して、配布できるスクレイピングアプリを作成しましょう。
scraper.py
まずは、アプリを作成します。
# scraper.py
import requests
from bs4 import BeautifulSoup
# 過去のことは一切気にしない!
def dumb_scraper():
# 毎回トップページを取りに行く
response = requests.get("https://books.toscrape.com/")
soup = BeautifulSoup(response.text, 'html.parser')
books = soup.find_all('article', class_='product_pod')
for book in books:
# 【問題点】
# すでに保存済みか確認する術がないので、
# 毎回、詳細情報を取得するためにリクエストを飛ばしてしまう
title = book.h3.a['title']
print(f"毎回必ずアクセスして取得中...: {title}")
# 毎回ファイルに追記(同じデータがどんどん溜まる)
with open("results.csv", "a") as f:
f.write(f"{title}\n")
if __name__ == "__main__":
dumb_scraper()Dockerfile
Dockerfileを作成します。
FROM python:3.13-slim
WORKDIR /app
COPY scraper.py .
CMD ["python", "scraper.py"]Dockerで実行
Dockerコマンドを実行します。
docker run --rm -v "${PWD}:/app" -w /app python:3.13-slim /bin/sh -c "pip install requests beautifulsoup4 && python scraper.py"書籍のタイトルが取れていればOKです。他のPCなどでも動かしてみましょう。

RedisをDockerで動かしてみる
Redisは、Docker Hubに公式イメージが公開されています。なので、インストールなど不要で、DockerからRedisをサーバーとして立ち上げることができます。

以下を、ターミナルで実行しましょう。
docker run --rm -d --name test-redis -p 6379:6379 redis:7Redisの起動確認
Redisが起動しているか、6379番ポートにアクセスして確認してみましょう。
まず、さきほどRedisを起動したターミナルとは「別のターミナル」を起動します。

別のターミナルで、以下を実行します。
docker exec -it test-redis redis-cli成功すると、ポートNo「6379」が返ってきます。

ipアドレスとポートがわかっていれば、pingを打つとPONGが返ってきます。実行してみましょう。

これで、Pythonアプリも、Redisも、Docker上で起動できていることが確認できました。
少し長くなるので、今回はここまで。
まとめ
以上で、「ノンプログラマーのためのDocker入門 Docker Compose前編」をお送りしました。
次回は、PythonアプリとRedisをつなぎたいと思います。
お楽しみに。



