DockerによるPython Webサービスのコンテナ化入門

Pythonで簡単なWebサーバを実装した後、開発・再起動の手間を軽減するためにDockerの導入を検討するケースは多い。以下では、その背景とDockerの基本概念、環境構築方法を解説する。

シンプルなPython Webサーバの例

以下のコードは、ソケットベースでHTTPリクエストを処理する最小限のPython Webサーバである:

import socket

HOST, PORT = '0.0.0.0', 8080
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((HOST, PORT))
sock.listen(1)

print(f'Serving HTTP on port {PORT} ...')
while True:
    conn, addr = sock.accept()
    request = conn.recv(1024)
    print(request.decode('utf-8'))

    response = b'HTTP/1.1 200 OK\r\n\r\nHello from Python!'
    conn.send(response)
    conn.close()

このスクリプトを実行すると、localhost:8080 にアクセスしてレスポンスを確認できる。しかし、コード変更ごとにプロセスを手動で再起動する必要があり、開発効率が低い。これを解決する手段の一つがDockerによるコンテナ化である。

Dockerの概要

DockerはGo言語で実装されたオープンソースのコンテナエンジンであり、「Build, Ship and Run Any App, Anywhere」を理念とする。アプリケーションとその依存関係を一括でパッケージ化し、環境に依存せずどこでも同一の動作を保証する。

Dockerの基盤にはLinuxカーネルの機能(特に名前空間とcgroups)が用いられており、LXC(Linux Containers)を発展させたものと見なせる。ただし、Dockerはイメージフォーマットやレジストリ管理、ネットワーキングなどの高レベル機能を提供し、運用性を大幅に向上させている。

主要コンセプト

  • Image(イメージ):アプリケーションとその実行環境を含む不変なテンプレート。レイヤー構造を持ち、ビルド後に内容は変更されない。
  • Container(コンテナ):イメージから起動される実行インスタンス。読み書き可能な最上位レイヤーを持ち、状態を持つ。
  • Repository(リポジトリ):Docker Hubなどのレジストリ内に格納されるイメージの集合。タグ(例:python:3.9)でバージョン管理される。

Dockerと仮想マシン(VM)の違い

VMはHypervisor上で完全なゲストOSを実行し、ハードウェアリソースを抽象化する。一方、DockerコンテナはホストOSのカーネルを共有し、プロセスレベルで隔離されるため、起動が高速でオーバーヘッドが小さい。これは「軽量な仮想化」とも呼ばれる。

ユースケース

  • アプリケーションの標準化されたパッケージングとデプロイ
  • CI/CDパイプラインにおける自動テスト環境の構築
  • Webアプリケーションやデータベースのスケーラブルなデプロイ
  • プライベートPaaS環境の迅速な構築

環境構築

Dockerは64ビットLinuxカーネルを必要とする。Windows環境では、Windows 10以降であればDocker Desktop for Windowsが利用可能。それ以前のバージョンや安定性を重視する場合は、VM(例:VMware Workstation)上にLinuxディストリビューション(例:Ubuntu)をインストールし、その中にDockerをセットアップするのが推奨される。

基本コマンド

サービス管理

sudo systemctl start docker  # Dockerデーモン起動

コンテナ操作

docker ps                   # 実行中のコンテナ一覧
docker ps -a                # 全コンテナ(停止中含む)
docker logs <container>     # コンテナログ表示
docker stop <container>     # コンテナ停止
docker start <container>    # コンテナ再開
docker rm <container>       # コンテナ削除(停止済みのみ)
docker port <container>     # ポートマッピング確認

イメージ操作

docker images                # ローカルイメージ一覧
docker pull python:3.9       # イメージ取得
docker search nginx          # Docker Hubでイメージ検索

Dockerfileによるカスタムイメージ構築

以下はCentOSベースのSSHサーバイメージを定義するDockerfileの例:

FROM centos:7
LABEL maintainer="admin@example.com"

RUN echo 'root:securepass' | chpasswd && \
    useradd -m appuser && \
    echo 'appuser:securepass' | chpasswd && \
    echo 'LANG="en_US.UTF-8"' > /etc/locale.conf

EXPOSE 22 80
CMD ["/usr/sbin/sshd", "-D"]

このファイルを元に、以下のコマンドでイメージをビルドできる:

docker build -t custom/centos-ssh .

各命令(FROM, RUN, CMDなど)は大文字で記述され、それぞれが新しいレイヤーを生成する。これにより、キャッシュ効率や再利用性が向上する。

タグ: Docker Python Web Server containerization linux

7月15日 23:20 投稿