手元では動いたのに
大阪の物流会社で、配送管理システムを担当する山本さんの話です。
山本さんは、配達ルートの表示を直しました。自分のノートパソコンでは、きちんと動きました。
ところが本番のサーバーに入れると、画面にエラーが出ました。サーバーの Python が古かったのです。
「手元では動いたのに」は、開発の現場でよく聞く言葉です。このレッスンでは、これを防ぐ方法を学びます。
このレッスンのゴール
メモ
コンテナとは何か、なぜチームが使うのかを説明できる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 依存関係 | アプリが動くのに必要な、別のソフトウェアです。 | flask 3.0 |
| イメージ | アプリと、その依存関係をまとめた包みです。 | |
| コンテナ | 動いている状態のイメージです。 | |
| Dockerfile | イメージの作り方を書いたファイルです。 | |
| レジストリ | イメージを置いておく、ネット上の倉庫です。 |
学生が入力するセルは、このプレビューでは空白です。
似た二台は、同じではない
アプリは、単独では動きません。Python のような言語や、いくつものライブラリを使います。これらが依存関係です。
ノートパソコンとサーバーでバージョンが違うと、片方だけで失敗します。
次のブロックを実行して、山本さんの二台を比べましょう。
ノートパソコンとサーバーを比べる
mkdir -p haiso && cd haiso
printf 'python 3.12\nflask 3.0\nrequests 2.32\n' > laptop.txt
printf 'python 3.9\nflask 2.2\nrequests 2.32\n' > server.txt
# diff は、二つのファイルで違う行だけを表示します
diff laptop.txt server.txt && echo "二台の環境は同じです"
# server.txt の python を 3.12、flask を 3.0 に直して、
# もう一度「実行」を押してください。最後の一行が変わります。
イメージは、アプリと依存関係の包み
解決策は、アプリと依存関係を一つに包むことです。この包みをイメージと呼びます。
イメージの作り方は Dockerfile に書きます。一行が一つの命令です。土台の OS、入れるもの、コピーするもの、起動の仕方を順に書きます。
イメージを動かしたものがコンテナです。ノートパソコンでもサーバーでも、中身は同じです。
Dockerfile を読む
mkdir -p haiso && cd haiso
cat > Dockerfile <<'END'
# 土台のイメージ: Python 3.12 が入った小さな OS
FROM python:3.12-slim
WORKDIR /app
# 先に依存関係を入れ、あとからアプリのコードを入れます
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8080
CMD ["python", "app.py"]
END
# 命令の数を数えます (大文字で始まる行)
grep -c '^[A-Z]' Dockerfile
# どの土台から作るかを表示します
grep '^FROM' Dockerfile
よく使う Docker の命令は三つ
Docker は、いちばん広く使われているコンテナの道具です。この練習環境には Docker がないので、実際の画面の出力を下に載せます。
docker build はイメージを作り、名前とバージョンを付けます。docker run はコンテナを起動します。docker ps は、動いているコンテナを一覧にします。
作る、起動する、一覧を見る
$ docker build -t haiso-app:2.1 .
=> [1/5] FROM python:3.12-slim
=> [4/5] RUN pip install -r requirements.txt
=> naming to docker.io/library/haiso-app:2.1
$ docker run -d -p 8080:8080 haiso-app:2.1
7b2e94c0d1f3
$ docker ps
CONTAINER ID IMAGE STATUS PORTS
7b2e94c0d1f3 haiso-app:2.1 Up 12 seconds 0.0.0.0:8080->8080/tcpよくある間違い
注意
コンテナは「小さな仮想マシン」だと思う人が多くいます。そうではありません。仮想マシンは、OS を丸ごと一つ持ちます。コンテナは土台の OS を共有し、アプリだけを切り離します。だから数秒で起動できます。
仮想マシンとコンテナ
| 仮想マシン | コンテナ | |
|---|---|---|
| OS | 自分専用のものを丸ごと持つ | 土台の OS を共有する |
| よくある大きさ | 数GB | 数十から数百MB |
| 起動の時間 | 数分 | 数秒 |
| 主な使い方 | システム全体を分ける | アプリ一つを包んで運ぶ |
学生が入力するセルは、このプレビューでは空白です。