Dockerハンズオン|Python・PostgreSQLコンテナを動かしてみる【環境構築なしで体験】
ここまでの2-1〜2-6で、docker run の主要オプション(-it / -d / --name / -p / -v)とライフサイクルを一通り学んできました。今回はそれらを組み合わせて、実務で最もよく触る2種類のコンテナを実際に動かします。
- Python コンテナ:プログラミング言語ランタイムの代表。ローカルにPythonを入れずに
pythonコマンドが使える体験を。 - PostgreSQL コンテナ:データベースの代表。ローカルにDBを入れずにSQLを叩ける体験を。
どちらも「自分のPCにインストールせずに触れる」という、Dockerの最大の魅力を実感できる題材です。コマンドは全部コピペでOK。「なんとなく触ったら動いた」から「仕組みが見えてきた」へ進みましょう。
① Python コンテナで対話シェルを起動してPythonコードを実行できる
② PostgreSQL コンテナを起動してSQLを叩ける
③
-it / -d / --name / --rm の使い分けが理解できる
目次
- 前提:ここまで何をやったか
- なぜ Python と PostgreSQL?
- Part 1:Python コンテナで対話シェル
- Part 1-応用:
--rmで使い捨てコンテナ - Part 2:PostgreSQL コンテナに psql で接続
- Part 2-応用:SQL を叩いてみる
- 後片付け:コンテナとイメージを削除
- 今回使ったオプションまとめ
- よくあるつまずき
- 次のステップ:ブラウザからアクセスできるWebサーバへ
1. 前提:ここまで学んだオプション
第2章の前半で以下を押さえてきました。このハンズオンで全部を組み合わせて使います。
| 記事 | 身についたこと | 今回使う場面 |
|---|---|---|
| 2-2 主要コマンド | run / ps / logs / exec |
全編で使う |
| 2-3 ライフサイクル | Created / Running / Exited の状態遷移 | 常駐DBの挙動理解 |
| 2-4 インタラクティブモード | -it |
Python REPL、psql接続 |
| 2-5 デタッチモード | -d / --name / --rm |
PostgreSQL常駐起動 |
2. なぜ Python と PostgreSQL?
世の中には無数のコンテナイメージがありますが、最初に触るべきはこの2種類です。理由は「実務で最も遭遇するカテゴリの代表例」だからです。
| カテゴリ | 代表例 | よくある用途 |
|---|---|---|
| プログラミング言語ランタイム | python, node, ruby, go, openjdk | アプリケーションを動かす/CI でテストする |
| データベース・ミドルウェア | postgres, mysql, redis, mongo | 開発用のDB/ローカルでの動作確認 |
| Webサーバ・プロキシ | nginx, httpd, caddy | 静的配信/リバースプロキシ(第2章で扱います) |
Python と PostgreSQL を動かせるようになれば、あとは同じパターンで node でも redis でも mysql でも触れます。
・Python(一時起動型):手で叩いて、終わったら閉じる →
docker run -it・PostgreSQL(常駐型):バックグラウンドで動かし続ける →
docker run -d --nameこの2つが、今後あなたが出会うほぼ全てのコンテナの原型になります。
3. Part 1:Python コンテナで対話シェル
まずは Python の対話シェル(REPL)を、自分のPCに Python を入れずに起動してみます。
3-1. イメージを取得する
docker pull python:3.12
初回だけ数百MB程度のダウンロードが発生します。2回目以降はレイヤーキャッシュによって一瞬で終わります。
ダウンロードが済んだか確認しましょう。
docker images
python 3.12 <IMAGE ID> <日付> 約 1GB のような行が出ていればOKです。
python:3.12 は Debian ベースの標準イメージで豊富なライブラリを含むため大きめです。軽量版 python:3.12-slim (約150MB)や python:3.12-alpine (約50MB)もあります。使い分けは第3章 3-6(イメージ軽量化)で詳しく扱います。今回は学習優先で標準版のままで大丈夫です。
3-2. 対話シェルを起動する
いよいよコンテナを起動します。
docker run -it python:3.12
数秒で Python の対話シェル(>>> のプロンプト)が起動します。
Python 3.12.x (main, ...) [GCC ...] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
3-3. -it の復習
2-4 で学んだとおり、-it は 対話モード(-i:入力を渡す+-t:端末として振る舞う)の略記です。Python REPL や bash、後述の psql のように「人間がキーボードで操作するツール」には必ず付けます。
docker run -it python を実行したときの図】-i が入力方向、-t が出力方向を司る3-4. Python コードを実際に動かしてみる
>>> のプロンプトに、次の順で打ってみましょう。
>>> 1 + 2
3
>>> import sys
>>> sys.version
'3.12.x (main, ...) [GCC ...]'
>>> name = "Docker"
>>> print(f"Hello from {name}!")
Hello from Docker!
今あなたは「自分のPCに Python を入れずに」 Python のコードを実行しました。このコンテナは
python:3.12 という完全に独立した環境なので、PC側で Python のバージョンが 2.7 だろうが 3.8 だろうが、コンテナ内は常に 3.12 です。
3-5. シミュレータで -it を体験する
ブラウザで同じ操作を試せます。下のシミュレータで docker run -it python:3.12 を実行してみてください。-it の有無で挙動がどう変わるかも比較できます。
3-6. コンテナから抜ける
Python シェルで exit() と打つか、Ctrl+D を押すと、Python プロセスが終了してコンテナも停止します。元の PC のプロンプトに戻ります。
>>> exit()
$
コンテナは停止しましたが、削除はされていません。確認してみましょう。
# 停止中のコンテナも含めて表示
docker ps -a
さっき exit した Python コンテナが Exited 状態で残っているはずです。コンテナは「停止 ≠ 削除」です(これは第2章 2-3「ライフサイクル」で詳しく扱います)。
4. Part 1-応用:--rm で使い捨てコンテナ
先ほどの流れでは、毎回 exit するたびに停止済みコンテナが増えていきます。ちょっと試すだけなのに後から docker rm で削除するのは面倒です。
そんなときは --rm を付けます。コンテナが終了したら自動で削除してくれます。
docker run -it --rm python:3.12
--rm あり/なしの違い】docker rm が必要使い分けの目安:
| シチュエーション | おすすめ |
|---|---|
| ちょっと Python を触りたい/動作確認だけ | --rm あり |
| コンテナ内で状態を作って後で再利用したい | --rm なし |
| 本番サービスとしてずっと動かす | --rm なし(後述の -d 型) |
5. Part 2:PostgreSQL コンテナに psql で接続
次は DB コンテナ。Python と違って PostgreSQL は「動き続ける」タイプです。起動したらずっと待ち受けていて、クライアント(psql)からの接続を受け付け続けます。
この「動き続けるコンテナ」をバックグラウンドで起動するのが、次に学ぶ -d オプションです。
5-1. イメージを取得する
docker pull postgres:16
5-2. -d と --name でバックグラウンド起動
docker run -d --name mydb -e POSTGRES_PASSWORD=secret postgres:16
2-5 で学んだとおり -d でバックグラウンド起動、--name mydb で後から参照できる名前を付けます。PostgreSQL 公式イメージは パスワード指定(環境変数)が必須なので -e POSTGRES_PASSWORD=secret を忘れずに。
実行すると長い16進数の文字列(コンテナID)が1行だけ返り、すぐにプロンプトに戻ります。バックグラウンドで PostgreSQL が立ち上がった合図です。
-it と -d は同時に使わない対話したいのか、裏で動かすのか、どちらか一方です。
-d で起動したコンテナに後から入りたいときは、2-2 で学んだ docker exec を使います(次のステップ)。
5-3. 動いているか確認する
docker ps
こんな出力になります(列は横スクロールで確認)。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abc123def456 postgres:16 "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 5432/tcp mydb
STATUS が Up、NAMES が mydb なら成功です。
5-4. ログを覗いてみる
docker logs mydb
PostgreSQL の起動ログが流れます。末尾に database system is ready to accept connections が出ていれば接続準備完了です。
docker logs が使える理由コンテナの標準出力は全てDockerが記録しています。
-d でバックグラウンド起動したコンテナでも、あとから docker logs <名前> でいつでも見られます。「動いてるのか動いていないのかわからない!」というトラブル時の最初の確認手段です。
6. Part 2-応用:SQL を叩いてみる
バックグラウンドで動いている PostgreSQL コンテナの中に入って、SQL を実行してみます。
6-1. docker exec で動作中コンテナに入る
2-2 で学んだ docker exec を使って、稼働中の mydb コンテナに psql を差し込みます。
docker exec -it mydb psql -U postgres
docker exec のイメージ】成功すると psql のプロンプトに切り替わります。
psql (16.x)
Type "help" for help.
postgres=#
6-2. テーブルを作って、入れて、取り出す
psql プロンプトで下記を順に叩いてみましょう。
postgres=# CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT);
CREATE TABLE
postgres=# INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Carol');
INSERT 0 3
postgres=# SELECT * FROM users;
id | name
----+-------
1 | Alice
2 | Bob
3 | Carol
(3 rows)
あなたのPCに PostgreSQL をインストールしていないのに、テーブル作成・INSERT・SELECT ができました。もし「PostgreSQL を使ってみたかったけど環境構築が面倒」で諦めた経験があるなら、その壁はもう乗り越えました。
6-3. psql を抜ける
psql プロンプトで \q (バックスラッシュ + q)と打つと psql から抜けます。
postgres=# \q
$
\q で抜けたのは docker exec で追加で起動した psql プロセスだけ。メインの PostgreSQL コンテナ(mydb)は引き続き動き続けています。docker ps で再確認してみてください。
6-4. コンテナのライフサイクルを可視化する
下のシミュレータで Created → Running → Stopped → Removed の状態遷移を体験できます。PostgreSQLのような常駐型コンテナは docker stop するまでずっと Running 状態です。
7. 後片付け:コンテナとイメージを削除
ハンズオンが終わったら、作ったコンテナを整理しましょう。Docker の世界でクリーンに保つ習慣は早めに身につけるのがコツです。
7-1. 動いているコンテナを止める
docker stop mydb
PostgreSQL プロセスに停止シグナルが送られ、コンテナが Exited 状態になります。
7-2. 停止したコンテナを削除する
docker rm mydb
Part 1 で作った Python コンテナも一緒に片付けたい場合は、停止中コンテナ名を確認してから削除します。
docker ps -a # 停止中も含めて表示
docker rm <コンテナID or 名前> # 一つずつ削除
7-3. イメージも削除したい場合
イメージはコンテナと別管理です。容量を空けたいときは下記。
docker images # イメージ一覧
docker rmi python:3.12 # イメージ削除
docker rmi postgres:16
そのイメージから作られたコンテナが残っていると
docker rmi はエラーになります。先にコンテナを docker rm で消してからイメージを削除します。
8. 今回使ったオプションまとめ
| オプション | 役割 | 今回の使い方 |
|---|---|---|
-i |
標準入力を開く | キーボード入力をコンテナに渡すため |
-t |
TTY(擬似端末)を割り当て | プロンプトや色表示を有効化 |
-it |
上記2つのセット | Python REPL・psql など対話ツールで必須 |
-d |
デタッチ(バックグラウンド起動) | DB・Webサーバなど常駐型で使う |
--name <名前> |
コンテナに名前を付ける | あとから docker logs exec stop で指定するため |
--rm |
終了時に自動削除 | 使い捨ての Python REPL などで便利 |
-e KEY=value |
環境変数を渡す | POSTGRES_PASSWORD など公式イメージの必須設定 |
人が触るコンテナ(Python/ubuntu/psql)→
-it裏で動かし続けるコンテナ(DB/Webサーバ)→
-d --nameまずこの2パターンだけ覚えれば9割の場面に対応できます。
9. よくあるつまずき
| 症状 | 原因 | 対処 |
|---|---|---|
docker run postgres で「POSTGRES_PASSWORD not set」エラー |
公式イメージはパスワード必須 | -e POSTGRES_PASSWORD=... を付ける |
docker ps に出てこない |
コンテナが終了済み(Exited) | docker ps -a で停止中も表示 |
the input device is not a TTY エラー |
-t が無い/PowerShellで winpty 必要 |
-it を忘れずに付ける。Git Bashで改善する場合も |
docker run -d したらすぐ Exited になる |
メインプロセスが終了した(-d は常駐前提) |
対話ツールは -it、常駐ツールは -d、と使い分ける |
| コンテナIDだけ出て何も起きない | 正常(-d は起動後すぐプロンプトに戻る) |
docker ps で Up になっているか確認 |
2回目の --name mydb でエラー |
同名の停止コンテナが残っている | docker rm mydb で削除してから再度 run |
10. 次のステップ:ブラウザからアクセスできるWebサーバへ
今回は「コンテナの中で完結する」操作でした。次の 2-8 ハンズオンでは、2-6 で学んだ -p(ポート転送)を使って、コンテナの外(=あなたのPCのブラウザ)からコンテナの中の nginx にアクセスする体験をします。
2-8 ハンズオン(nginxでWebサーバ)で、
docker run -p 8080:80 nginx → ブラウザで http://localhost:8080 → nginxの画面が出る、という第2章のゴールを体験しましょう。その先の第3章では、公式イメージを使うだけでなく Dockerfile で自分専用のイメージを作る方向へ進みます。
11. まとめ
| 体験したこと | 使ったコマンド | 学んだこと |
|---|---|---|
| Python REPL を起動 | docker run -it python:3.12 |
対話型コンテナは -it が必須 |
| 使い捨ての Python | docker run -it --rm python:3.12 |
--rm で終了時に自動削除 |
| PostgreSQL をバックグラウンド起動 | docker run -d --name mydb -e POSTGRES_PASSWORD=... postgres:16 |
常駐型は -d + --name + 環境変数 |
| 動作中コンテナに psql で入る | docker exec -it mydb psql -U postgres |
起動後に追加コマンドを差し込む exec |
| ログ確認 | docker logs mydb |
バックグラウンドコンテナの状態を見る常套手段 |
| 後片付け | docker stop / rm / rmi |
コンテナとイメージは別管理 |
今回のハンズオンで、あなたは「自分のPCにインストールせずに言語ランタイムとDBを動かす」という、Dockerの最も日常的な使い方を手に馴染ませました。あとは同じ型で、node / ruby / mysql / redis / mongo など、あらゆるイメージを扱えます。
参考リンク
- Docker Hub: python(公式イメージ) — 利用可能なタグ一覧と
-slim/-alpineバリエーションの説明。 - Docker Hub: postgres(公式イメージ) — 環境変数
POSTGRES_PASSWORDPOSTGRES_USERPOSTGRES_DBの使い方と初期化スクリプトの配置。 - docker run リファレンス(公式) — 全オプションの一次情報源。
- docker exec リファレンス(公式) — 第2章で詳しく扱う exec コマンドの公式解説。



コメント