2.7 Dockerハンズオン|Python・PostgreSQLコンテナを動かしてみる【環境構築なしで体験】

【第2章】イメージとコンテナの基本操作

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 の使い分けが理解できる

目次

  1. 前提:ここまで何をやったか
  2. なぜ Python と PostgreSQL?
  3. Part 1:Python コンテナで対話シェル
  4. Part 1-応用:--rm で使い捨てコンテナ
  5. Part 2:PostgreSQL コンテナに psql で接続
  6. Part 2-応用:SQL を叩いてみる
  7. 後片付け:コンテナとイメージを削除
  8. 今回使ったオプションまとめ
  9. よくあるつまずき
  10. 次のステップ:ブラウザからアクセスできる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常駐起動
⚠️ 事前確認
ターミナルで docker version が通ることを確認してください。通らない場合は 1-3 Dockerインストール完全ガイドへ。

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 でも触れます。

💡 2種類の起動パターンを身につける
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です。

⚠️ 「約1GBもあるの?」と思ったら
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 を実行したときの図】
あなたのPC
⌨️ キーボード
🖥️ ターミナル

Python コンテナ
🐍 python3
>>> プロンプト

-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 あり/なしの違い】
–rm なし
run → exit →
コンテナが Exited のまま残る
あとで docker rm が必要

–rm あり
run → exit →
コンテナが 自動削除
後片付け不要

使い分けの目安:

シチュエーション おすすめ
ちょっと Python を触りたい/動作確認だけ --rm あり
コンテナ内で状態を作って後で再利用したい --rm なし
本番サービスとしてずっと動かす --rm なし(後述の -d 型)

5. Part 2:PostgreSQL コンテナに psql で接続

次は DB コンテナ。Python と違って PostgreSQL は「動き続ける」タイプです。起動したらずっと待ち受けていて、クライアント(psql)からの接続を受け付け続けます。

【2種類のコンテナの動き方】
一時起動型(Python REPL)
起動 ─▶ 対話 ─▶ exit ─▶ 停止
👤 人が使い終わったら閉じる

常駐型(PostgreSQL)
起動 ─▶ 待ち受け 待ち受け 待ち受け …
🔄 明示的に止めるまで動き続ける

この「動き続けるコンテナ」をバックグラウンドで起動するのが、次に学ぶ -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

STATUSUpNAMESmydb なら成功です。

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 のイメージ】
Docker ホスト
💻 あなたのターミナル
docker exec -it …

━━▶
コンテナ「mydb」(稼働中)
🐘 postgres 本体
+ psql(新しいプロセス)

↑ 動作中コンテナに「追加のコマンド」を差し込むのが 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
$
💡 psqlを抜けても mydb は止まらない
\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-7)→ 次回(2-8)の拡張イメージ】
今回(2-7)
あなた ━▶ docker exec -it ━▶ コンテナ内部
→ コンテナに入って触る

次回(2-8)
あなたのブラウザ ━▶ localhost:8080 ━▶ コンテナ内の 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の基礎を動画で体系的に学びませんか?

実務で使う基礎だけを3時間に凝縮。環境構築から丁寧に解説しています。

Udemy Docker入門講座 クーポン割引で講座を見る →

コメント

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