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など)は大文字で記述され、それぞれが新しいレイヤーを生成する。これにより、キャッシュ効率や再利用性が向上する。