[Docker]ノンプログラマーのためのDocker入門 Docker Compose前編

Docker

どうも、ケニー(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は、速さ重視で短期的なデータ保存に向いています。

今回のハンズオンでは、以下の流れを体験します。

  1. Python+Dockerだけでスクレイピングする
  2. RedisをDockerで動かしてみる(ポートを解放した状態を作る)
  3. 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をサーバーとして立ち上げることができます。

redis - Official Image | Docker Hub
Redis is the world’s fastest data platform for caching, vector search, and NoSQL databases.

以下を、ターミナルで実行しましょう。

docker run --rm -d --name test-redis -p 6379:6379 redis:7

Redisの起動確認

Redisが起動しているか、6379番ポートにアクセスして確認してみましょう。

まず、さきほどRedisを起動したターミナルとは「別のターミナル」を起動します。

別のターミナルで、以下を実行します。

docker exec -it test-redis redis-cli

成功すると、ポートNo「6379」が返ってきます。

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

これで、Pythonアプリも、Redisも、Docker上で起動できていることが確認できました。

少し長くなるので、今回はここまで。

まとめ

以上で、「ノンプログラマーのためのDocker入門 Docker Compose前編」をお送りしました。

次回は、PythonアプリとRedisをつなぎたいと思います。

お楽しみに。

参考資料

このシリーズの目次

タイトルとURLをコピーしました