2025-4I データベース工学 第02回 講義資料

2025年10月09日 (木) 3-4時限

1 連絡と概要

2 前回講義の振返りと確認

前回講義では「なぜデータベース (DBMS) を使ったデータ管理が必要なのか」を学びました。また、リレーショナルデータベースの特長や機能を簡単に紹介し、DB Fiddleというサービスを使って SQL による RDB の操作を体験してもらいました。

また、最後にDocker Desktopを PC にインストールしてもらいました。そして、動作確認としてDockerHubから hello-world イメージをプルして (=取得して)、そのイメージをもとにコンテナを作成・起動して、Docker が正常に機能するかを確認してもらいました。

また、宿題 (=今回の講義に向けた準備) として、以下のコマンドで postgres:17.6dbgate/dbgate:6.6.3 という Docker イメージをプル (取得) をしてもらいました。

docker image pull postgres:17.6
docker image pull dbgate/dbgate:6.6.3

今回の講義は、以上の作業が完了していることを前提とします。

そもそも Docker とは?

3年の知能情報実験実習1の後期テーマのなかで、既に Docker を使用して Apacheコンテナ (ウェブサーバ) を動かしているので、概要は把握しているハズですが…

Docker とは、アプリを動かすための環境を OS (Linux)ごと ひとまとめにした「イメージ」から、すぐに使える軽量な実行環境「コンテナ」を作成して、動かすことができるソフトウェアです。コンテナはそれぞれ独立して動作するため、ホスト OS の環境を汚すことなく、さまざまな開発環境を安全に試すことができるメリットがあります。

※ ここでの「OS」とは、Linuxカーネルを除いたユーザー空間(ライブラリやコマンド群など)を指します。

3 Docker 上での PostgreSQL コンテナの起動と操作

Docker を使って PostgreSQL (RDBMS) のコンテナを作成・起動し、実際に使ってみます。一般に「Dockerコンテナ」の 基本的なライフサイクル は、次のようになります。

  1. Docker Hub から イメージを取得する
    • docker image pull コマンド
  2. イメージからコンテナを作成する (必要に応じてカスタマイズ)
    • docker container create コマンド
  3. コンテナを起動する⤴
    • docker container start コマンド
  4. コンテナを利用する
    • docker container exec コマンド
    • TCP/IP (ポート通信) によるアプリ接続
  5. コンテナを停止する⤵
    • 必要に応じて 3. に戻る🔙
    • docker container stop コマンド
  6. コンテナを削除する
    • docker container rm コマンド
  7. イメージを削除する(不要になった場合)
    • docker image rm

3.1 準備

はじめに Docker Desktop が起動済みで、ステータスが「Running」となっていることを確認してください。タスクトレイにアイコンが見つからない場合はスタートメニューから「Docker Desktop」を探して手動で起動してください。

img

次にPostgreSQL v17.6DbGate v6.6.3のイメージがプルできていること (ローカルにダウンロードできていること) を確認します。次のコマンド (docker images) を使って、ローカルに存在する Docker イメージの一覧 (リスト) を確認してください。

docker images

コマンドの応答に、次のようなものが含まれていれば問題なくイメージのプルができています。

REPOSITORY                TAG              IMAGE ID       CREATED         SIZE
postgres                  17.6             3fe059c96160   5 days ago      453MB
dbgate/dbgate             6.6.3            c17f3615b225   4 weeks ago     1.32GB

なお、Docker Desktop (Docker Engine) が立ち上がっていない ときは、以下のようなエラーが返ってきます。

error during connect: Head "http://%2F%2F.%2Fpipe%2FdockerDesktopLinuxEngine/_ping": open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.

Dockerイメージの一覧は、Docker Desktop (GUI) からも確認ができます。

img

Dockerイメージ「postgres:17.6」の構成

皆さんには宿題として postgres:17.6 というDockerイメージをプルしてもらいました。postgres:17.6Debian 13 (コードネーム Trixie/トリクシー) の軽量版 (debian:trixie-slim) の上で PostgreSQL 17.6 が動作するように構成された Docker イメージとなります。

Debian (デビアン) は Linux を代表するディストリビューションのひとつで、各リリースには 映画「トイ・ストーリー」 に登場するキャラクタ名がコードネームとして採用されています。

3.2 コンテナの作成

イメージ postgres:17.6雛形 (テンプレート) として、動作に関わるいくつかの設定を組み込んで pg17 という名前を付けたコンテナを作成していきます。次の docker container create コマンドを実行してください。

docker container create --name pg17 -e POSTGRES_USER=student -e POSTGRES_PASSWORD=secret123 -e POSTGRES_DB=playground postgres:17.6

コマンドが正常に実行できた場合、そのコンテナのIDが返ってきます。コンテナIDは、Docker が内部的に生成する SHA256 ハッシュ値(64文字の16進数)の先頭部分 となります。

コマンドを複数行に分けて書くときのルール

PowerShell では、次のようにバッククォート ` を用いることでコマンドを複数行に分けて入力できます。同様のことを Bash で行なう場合はバックスラッシュ \コマンドプロンプト (cmd.exe) で行なう場合はハット ^ を使用します。

docker container create --name pg17 `
  -e POSTGRES_USER=student `
  -e POSTGRES_PASSWORD=secret123 `
  -e POSTGRES_DB=playground `
  postgres:17.6

PowerShell の場合、複数行のコマンドを貼り付けようとすると、以下のようなダイアログが表示されます。内容を確認して「強制的に貼り付け」を選択してください。

img

ここで、docker container create に設定している各オプションの意味は次の通りです。

以上のように、公式の Docker イメージの多くは 環境変数の指定によりコンテナが最初に起動されるときの動作 (=初期化処理) がカスタマイズ できるようになっています。利用可能な環境変数やその説明は、Docker Hub 上の各イメージの詳細ページに記載されています。

なお、パッケージを追加したり、設定を変更したりといった細かなカスタマイズや調整は Dockerfile を使って行います (この詳細については、あとで解説します)。

(プロンプト例)

OS の「環境変数」とは何ですか。

Linux における「スーパーユーザ」とは何ですか。

Docker において「Dockerfile」とは何をするものですか。コンテナの作成に必須ですか。

コンテナの削除

既に同名のコンテナ (pg17) が存在するときに、docker container create ... を実行すると次のようなエラーが返ってきます。

Error response from daemon: Conflict. The container name "/pg17" is already in use by container "xxxx". You have to remove (or rename) that container to be able to reuse that name.

このときは、次のコマンドで「既存のコンテナ」を先に削除してから、再度、docker container create ... コマンドを実行してください。rm は、remove の略です。

docker container rm pg17

なお、起動中のコンテナを削除する際には -f オプションをつけてください (停止中のコンテナの削除に対しては -f オプション不要です)。

3.2.1 定着確認

3.3 コンテナの状態確認

存在しているコンテナの一覧 (リスト) は、次のコマンドで確認できます。ps とは process status (プロセスの状態) の略です。--all (Long Option) は、-a (Short Option) とすることもできます。

docker ps --all

コマンドを実行すると、次のような応答が返ってくるはずです。IMAGEpostgres:17.6NAMESpg17 (コンテナの作成時に --name で指定した名前)、STATUSCreated となっている行が存在することを確認してください。

CONTAINER ID   IMAGE           COMMAND            CREATED         STATUS    PORTS     NAMES
d2196c5352d3   postgres:17.6   "docker-entry…"    2 seconds ago   Created             pg17

なお、(停止中のコンテナは除外して) 起動中のコンテナだけを表示したい場合は --all のオプションを外して次のようにしてください。

docker ps

現時点では pg17 というコンテナを作成しただけで、まだ「コンテナの起動はしていない状態」なのでリストには何も表示されないはずです (別途、Claude の MCP などで、コンテナを起動しているときは、それが表示されることがあります)。

3.3.1 定着確認

3.4 コンテナの起動

コンテナを起動するときは、次のように コンテナの名前 (例えば pg17) を指定して docker container start コマンドを実行します。

docker container start pg17

成功すると「コンテナ名」が応答として返ってきます。

コンテナが起動したことを確認するために docker ps コマンドを実行し、pg17 コンテナの STATUS「Up」 になっていることを確認してください。

なお、Dockerコンテナの状況 (一覧・起動・停止) は、Docker Desktop (GUI) からも確認することができます。起動中のコンテナは、Name の項目の前に緑色の マークがついて、Actions の項目が 停止マーク になります。

img

3.4.1 定着確認

3.5 コンテナの利用 (Bash経由)

ここまでの操作で pg17 というコンテナが起動し、そこで PostgreSQL 17 (RDBMS) が起動している状態 となりました。実際にこれを使用していきたいと思います。

まずは、次の docker container exec コマンドで、コンテナの内部 (Linux) に ログイン していきます。

docker container exec -it pg17 bash

docker container exec は、既に起動しているコンテナのなかで 任意のコマンドを実行 (execute) する ためのコマンドとなります。付加している -it オプションは、対話的 (Interactive) にターミナルをつなぐためのオプション となります。

このコマンドを実行すると、コンテナのなかの Linux (Debian) に接続し、そのシェル環境 (Bash) で対話的にコマンドを実行できる状態 になります。

(プロンプト例)

docker container exec コマンドで指定する -it オプションについて詳しく解説してください。

Linuxの操作に関する文脈において「シェル」とは何ですか。

Linuxの操作に関する文脈において「bash」とは何ですか。

3.5.1 Linuxシェル (Bash) の操作

上記のように docker container exec -it pg17 bash コマンドを実行すると、ターミナルのプロンプト (=コンソールに関する文脈では ユーザに入力を促すために表示される文字列 を意味する) が、次のように切り替わります。

root@d2196c5352d3:/#

このようにプロンプトが変わったことで、操作対象が「Windows の PowerShell」から「Docker コンテナ内の Linux のBash環境」に切り替わっていることが確認できます。

ターミナルに表示されるプロンプトが持つ情報

Linux の root@d2196c5352d3:/# というプロンプトには、次のような情報が含まれています。

PostgreSQL コンテナ (pg17) の内部が「どのような Linux 環境で構成されているか」は、次のコマンドで確認することができます。

cat /etc/os-release

上記のコマンドを実行すると、以下のように Debian 13 (コードネーム trixie ) に関する情報が表示されます。

PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
NAME="Debian GNU/Linux"
VERSION_ID="13"
VERSION="13 (trixie)"
VERSION_CODENAME=trixie
DEBIAN_VERSION_FULL=13.1
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

なお、このコンテナでは lspwdcd などの基本コマンドは使えますが、nanovimvi といったエディタは入っていません。そのため、コンテナ内部の設定ファイルを編集したい場合などは、別の方法を使う必要があります。

3.5.2 psql の対話モードで PostgreSQL を操作

このコンテナでは、既に「PostgreSQL のサーバープロセス」が起動しており、RDBMSのクライアントツールから接続して利用できる状態になっています。サーバの稼働状態は pg_isready コマンドから確認できます。

では、実際に PostgreSQL の公式 CLI クライアントツールである psql を使って接続していきます。次のコマンドを実行してください。CLI: Command Line Interface

psql -U student -d playground

ここで -Uログインする「ユーザ名」-d接続する「データベース名」 を指定するためのオプションとなります。

コマンドを実行すると「PostgreSQL の対話モード」が開始し、ターミナルのプロンプトが以下のような表示 (接続しているデータベース名=#) になります。これにより、SQL を打ち込んで、データベースを操作する準備が整いました。

psql (17.6 (Debian 17.6-2.pgdg13+1))
Type "help" for help.

playground=#

対話モードの利用中に、SQLを入力・実行しても「反応がない?」と感じたときは、セミコロン ; を入力して Enter キーを入力してみてください。反応がないように見えるとき、たいていは、システムがコマンド終端の ; を待っている状態です。それでも解決しなときは、ターミナルを閉じて、再度、docker container exec ... で接続してください。

3.5.3 テーブルの作成 (CREATE TABLE)

動作確認として、次に示す s_users というテーブルを作成してみます (s はサンプルという意味でつけています)。RDBMSの「テーブル名」は、前回も説明したように一般的には 複数形で命名してスネークケース で記述します (ただし、チームやプロジェクトの規約が優先)。

■ s_users

id name age
1 Alice 20
2 Bob 25

まずは、テーブルのスキーマ (=列構成やデータ型の設計情報) を指定してテーブルを作成する SQL を実行します。以下を、コピーして、ターミナルに貼りけて実行してみてください。

CREATE TABLE s_users (id INT PRIMARY KEY, name TEXT NOT NULL, age INT);

成功すると CREATE TABLE のように表示されます。もし 同名のテーブルが既に存在している場合ERROR: relation "s_users" already exists のようなエラーになります。

(プロンプト例)

PostgreSQL を使用しています。CREATE TABLE s_users (id INT PRIMARY KEY, name TEXT NOT NULL, age INT); という SQL について詳細に解説してください。

3.5.4 レコードの挿入 (INSERT)

次に、レコードを挿入する SQL を実行します。成功すると INSERT 0 2 と表示されます。

INSERT INTO
  s_users (id, name, age)
VALUES
  (1, 'Alice', 20),
  (2, 'Bob', 25);

SQL では 改行 を無視するので INSERT INTO s_users (id, name, age) VALUES (1, 'Alice', 20), (2, 'Bob', 25); のように1行で与えても問題ありません。

(プロンプト例)

PostgreSQL で、テーブルに2件のレコードを挿入したら INSERT 0 2 のように表示されました。02 の意味について解説してください。

テーブルから全てのレコードを削除したいときは…

指定したテーブルから全てのレコードを削除する場合は DELETE FROM を使用します。

DELETE FROM s_users;

また、TRUNCATE TABLE を使用すると、より高速に全件削除ができます。IDシーケンスについてもリセットされます。

TRUNCATE TABLE s_users;

(プロンプト例)

リレーショナルデータベースにおける DELETE FROM xxxTRUNCATE TABLE xxxx の違いについて教えてください。

リレーショナルデータベースにおける「IDシーケンス」とは何ですか。

テーブルそのものを削除したいときは…

レコードを含めてテーブルそのものを削除する場合は DROP TABLE を使用します。

DROP TABLE s_users;

3.5.5 レコードの抽出 (SELECT)

次に、レコード全件を 抽出 (選択) する SQL を実行します。

SELECT * FROM s_users;

実行結果は、次のようになります。

 id | name  | age
----+-------+-----
  1 | Alice |  20
  2 | Bob   |  25
(2 rows)

次のように、列 (カラム) の出力順を指定して抽出すること もできます。

SELECT age, id, name FROM s_users;

実行結果は、次のようになります。

 age | id | name
-----+----+-------
  20 |  1 | Alice
  25 |  2 | Bob
(2 rows)

また、SELECT name, age FROM s_users; とすれば、nameage だけを抽出・表示することができます (id の列は抽出・表示しない)。

3.5.6 PosgreSQL の対話モードの終了 と Linuxシェルの終了

psql\q (もしくは[Ctrl]+[D]のショートカット) を入力すると対話モードが終了して、Linux のシェルに戻ります。

さらに、exit (もしくは[Ctrl]+[D]のショートカット) を入力するとLinux のシェルが終了して、Windows のPowerShell に戻ってきます。

3.6 コンテナの利用 (Windows から psql を直接実行)

上記の手順では いったんコンテナのなかに入ってから、シェル経由で psql を実行 していました。しかし、Windows側からコンテナの psql コマンドを直接叩くことも可能 です。

例えば、次のような SQL を記述した hoge.sql というファイルをWindows側で用意しておきます。

SELECT * FROM s_users;

このSQLファイルを、次のように ファイルリダイレクト (<) を使って psql に流し込むことができます。ここでは、オプションを -it ではなく -i にしている点に注意してください。

docker container exec -i pg17 psql -U student -d playground < hoge.sql

注意: 上記コマンドは PowerShell ではなくコマンドプロンプト (cmd.exe) から実行してください。PowerShell ではファイルリダイレクト (<) が利用できません。

実行結果は、次のようになります。宿題として授業時間外で試してみてください。

img

(プロンプト例)

Docker に関する質問です。docker container exec -it pg17 bash では -it オプションなのに、docker container exec -i pg17 psql -U student -d playground < hoge.sql では -i オプションにするのはなぜですか。

Linuxなどのシェルに関する文脈において「ファイルリダイレクト」とは何ですか?

3.7 コンテナの停止

次のコマンドで pg17 のコンテナを停止 (≠削除) します。

docker container stop pg17

念のために docker ps で起動中のコンテナ一覧に pg17 が含まれていないことを確認してください。

3.7.1 演習

再び pg17 コンテナを起動し、そこに接続し psql から SELECT * FROM s_users; を実行し、テーブルのデータが残っていること (=コンテナを停止してもデータが消失しないこと) を確認してください。

(プロンプト例)

Docker で docker create --name pg17 -e POSTGRES_USER=hoge -e POSTGRES_PASSWORD=fuga -e POSTGRES_DB=piyo postgres:17.6 のようにコンテナを作成しました。
このコンテナを起動して、データベースにテーブルを作成して、レコードを挿入しました。その後、このコンテナを停止し、再度、起動すると、テーブルとレコードの情報が消えずに残っていました。これらの情報は、どこに保存されていたのでしょうか。

3.8 コンテナの削除

次のコマンドで pg17 のコンテナを削除します。コンテナを削除すると、データベースの内容 (例えば、先ほど作成した s_users など) も一緒に削除されます。

docker container rm pg17

念のために docker ps -a (-a は停止中のコンテナも含めて表示するオプション) で、pg17 が消えていることを確認してください。

停止中のものも含めて、コンテナが1個も存在しないとき、Docker Desktop では以下のような表示となります。

img

3.8.1 演習

ここまでの一連の操作 (コンテナの作成👉コンテナの起動👉コンテナの利用 (psqlからSQLの実行)👉コンテナの停止👉コンテナの削除) を、再度、実行して Docker に関する基本的なコマンド操作に慣れてください。

イメージのプル、コンテナの作成・起動をまとめて実行するコマンド

ここまでは「イメージのプル」「コンテナの作成」「コンテナの起動」を個別に実行しましたが、docker container run コマンドでは、これらの3つをまとめて実行すること ができます。

docker container run --name pg17 `
  -e POSTGRES_USER=student `
  -e POSTGRES_PASSWORD=secret123 `
  -e POSTGRES_DB=playground `
  -d `
  postgres:17.6

-d オプションによって、コンテナを デタッチドモード (Detached Mode) で起動します。これにより、コンテナは バックグラウンドで実行 され、ターミナルはすぐに操作可能な状態に戻ります。

(プロンプト例)

Docker の docker container run コマンドにおいて「コンテナをデタッチモードで起動する」とは、どういうことですか?デタッチモードで起動しないときの動作はどうなりますか。

なお、run は、pull create start をまとめて実行するものなので、以降は stop で停止、再び起動するときは start を使用します。既に同名のコンテナが存在する場合は run は失敗するので注意してください。

3.9 まとめ

以上のように Docker を利用することで、即座に利用可能な PostgreSQL 環境が簡単に構築・破棄できるようになります。Windows に直接 PostgreSQL をインストール/アンインストールする場合と比較し、大幅に手間と時間を省くことができます。

3.9.1 定着確認

4 Docker Desktop による Docker の GUI 操作

ここまでは CLI (CUI) ベースの Docker 操作について紹介してきましたが、これらの操作は Docker Desktop を利用して GUI から行なうこともできます。

4.1 コンテナの起動

docker container start xxxx コマンド相当の操作

img

4.2 コンテナの停止

docker container stop xxxx コマンド相当の操作

img

4.3 コンテナのシェルを利用

docker container exec -it xxxx bash コマンド相当の操作

img

Exec タブを選択します。

img

4.4 コンテナの削除

docker container rm xxxx コマンド相当の操作

img

5 Docker 環境での PostgreSQL のポート通信設定

ここまでの説明では docker container exec を使って、コンテナ内の psql (クライアントツール) から PostgreSQL のサーバプロセスを利用しました。psqlpsql -U student -d playground のように起動したとき、UNIXドメインソケット というものを介して、PostgreSQL のサーバプロセスと通信をします。

UNIXドメインソケット とは、Linux や macOS のようなUNIX系OSで使われるプロセス間通信 (IPC: Inter-Process Communication) の仕組みで、同じホスト上で動作するプログラム同士が、ネットワークを経由せずに高速に直接データをやり取りするための方法 です。

つまり、ここまでの範囲で説明した使い方は、「PostgreSQL のサーバプロセス」と「クライアントツール」の通信が すべて「コンテナの内部」で完結しているもの でした。

一方で、PostgreSQL のサーバプロセスとは別のホストのクライアントツールから接続するとき、TypeScript や Python などのプログラムからDB接続するとき には TCP/P 接続 (ポート通信) を使う必要があります。

Docker Desktop を起動している「Windows (ホストOS)」と「Docker コンテナ」の間での TCP/IP 接続を有効化するには docker container create コマンドの実行時に、次のように -p オプションを指定する必要があります。

docker container create --name pg17 `
  -e POSTGRES_USER=student `
  -e POSTGRES_PASSWORD=secret123 `
  -e POSTGRES_DB=playground `
  -p 5432:5432 `
  postgres:17.6

この設定により、

マッピングされるようになります。これで、任意のクライアントツールやプログラムから 5432番ポートを使って PostgreSQL に接続できるようになります。

なお、既にホストOS側で別のアプリで 5432 番ポートを使っている場合は -p 5432:5433 のようにして、ホスト側のポート番号を 5433 に変えることができます。

5.0.1 定着確認

5.1 演習 (宿題・授業時間外)

TCP/IP ポートのマッピング設定を含めて Docker コンテナを作成・起動し、Windows (ホストOS) 上のクライアントツールから、コンテナ内の PostgreSQL サーバプロセスに接続してみましょう。

(プロンプト例)

Dockerコンテナとホストで「ポートをマッピングをする」とは、どのようなことですか。PostgreSQL のコンテナを作成する状況を想定して解説してください。

5.1.1 コンテナ側の準備

まず、pg17 という名前のコンテナが存在していれば docker container rm pg17 コマンドで削除しておきます。

次に、以下の docker container run コマンドで、5432番ポート (RDBMSの標準ポート) のマッピング設定 を含めてコンテナを作成・起動します。

docker container run --name pg17 `
  -e POSTGRES_USER=student `
  -e POSTGRES_PASSWORD=secret123 `
  -e POSTGRES_DB=playground `
  -p 5432:5432 `
  -d `
  postgres:17.6

つづいて docker container exec -it pg17 bash コマンドで、pg17 コンテナにログインし、psqls_users テーブルを作成し、いくつかのレコードを挿入しておきます (参考1参考2)。

ホストとコンテナのポート対応の確認

作成済みコンテナにおいて、どのポートがどのようにマッピングされているか (=ホスト👉コンテナの対応) を確認するためには docker port コマンドを使用します。

docker port pg17 のようにコマンドを実行すると、次のような結果が表示されます。

5432/tcp -> 0.0.0.0:5432
5432/tcp -> [::]:5432

1行目 は、コンテナ内の TCP ポート 5432 が、ホストOSの IPv4 アドレス 0.0.0.05432 番ポートに公開されていること、を示しています。ここでの 0.0.0.0 は「すべての IPv4 アドレスで受け付ける」という特別な指定で、実際には 127.0.0.1 (ローカルホスト) などのすべての IPv4 経路を含みます。

2行目は **IPv6*+ 向けの設定で、同様に IPv6 のすべてのアドレス ([::]) で接続を受け付けていることを示しています。

5.1.2 ホスト側の準備とTCP/IP接続

次に、PostgreSQLに対応し、インストール不要で使える軽量のSQLクライアント「HeidiSQL (ハイディエスキューエル)」を取得してきます。こちらから「Portable Windows version (zipped)」をダウンロードしてきます。

img

ダウンロードした Zipファイル を 完全展開 して、heidisql.exe をダブルクリックして起動してください (Zipのプレビューモードでは heidisql.exe は正常実行されないので注意してください)。

HeidiSQL の起動後、新規のDB接続設定を作成するために、画面左下の「新規」ボタンを押下します。

img

次のように接続設定をします。ユーザパスワードデータベース の各項目は docker container run コマンドで環境変数に設定した値を入力してください。入力が完了したら「開く」ボタンを押下します。

img

設定を保存するかを確認されるので「はい」を選択してください。

img

ここまでの手順にミスがなければ、5432番ポートを介して、コンテナで起動している PostgreSQL のサーバプロセスに接続され、以下のような画面が開きます。

画面上の public を展開して s_users テーブルを選択してください。

img

さらに、以下のように「データ」タブを選択することで、テーブルのレコードを確認することができます。

img

クエリ」タブを選択し、SQLを実行することもできます。

img

以上のように、コンテナを作成する際にポートのマッピングを設定することで、コンテナの外部から TCP/IP 通信で PostgreSQL に接続することができます。

なお、これ以降、本授業で HeidiSQL を使用する予定はないので、ダウンロードしたZipと、展開したフォルダは削除してもらって構いません。

6 Docker とは (詳細)

以上のハンズオンを通じて、体験的に Docker の概要が把握できたと思います。ここからは、Docker について、少しだけ詳しく解説していきたいと思います。


Dockerとは「コンテナ型仮想化技術」を実装したソフトウェアで、これを利用することで 普段使いのPC環境をクリーンに保ったまま、様々な開発環境を構築 できるようになります。しかも、それぞれの開発環境が相互に影響しないようにすること ができるようになります。

Docker を利用すると「なにがうれしいのか🤔」について、具体的な状況を想定して詳しく考えてみたいと思います。例として、次のような状況を考えていきます。

「データベース工学」の授業で「PostgreSQL 17」の環境構築が必要で、同時に「応用専門PBL2」でのプロジェクト開発で「PostgreSQL 15」の環境構築が必要になった。

このようなとき、次のような問題が考えられます。

このような問題を根本解決してくれるのが Docker となってきます。

Dockerでは コンテナ と呼ばれる独立した「箱」を用意し、各コンテナの内部に 最小限のOSと必要な開発環境 (例えば PostgreSQL など) を構築し、それぞれのコンテナを必要に応じて立ち上げることができます。メインのOSに直接インストールする場合と違って Windowsレジストリの書き換え などは起きません。

また、開発環境が不要になったときは、コンテナごときれいに削除することができます (ゴミが残ることがありません)。また Dockerfiledocker-compose.yaml という軽量の設定ファイル (テキストファイル) を残しておけば、すぐに開発環境を再構築することも可能となります。また、その設定ファイルを使って、別PCに上に開発環境のクローンを構築することも可能になります。

このように Docker (コンテナ型仮想化技術) には 普段使いのOS環境に影響を与えず、様々な開発環境を気軽に構築できる というメリットがあります。

なお、コンテナ型仮想化技術の「詳しい仕組み」については、本科目では解説しないので興味関心がある学生は、書籍や生成AIなどを利用して各自で掘り下げてください。少し古い書籍ですが仕組みと使い方がわかる Docker&Kubernetes のきほんのきほんが初心者向けの内容になっており、お勧めです (研究室に所蔵しているので、内容を確認したい学生は声をかけてください)。

(プロンプト例)

Docker に代表される「コンテナ型仮想化技術」とは、どのような技術ですか。

Python では venv を使って仮想環境を構築して、ライブラリのバージョン管理ができます。また、Node.js では、package.json を用いて、プロジェクトフォルダ単位で npm パッケージのバージョン管理ができます。それらと、コンテナ型仮想化技術 (Docker) って何が違うのですか?

6.1 Docker の活用法

Docker は、次のようなケースで、特に便利に利用することができます。

6.1.1 ケース1

例えば Python 3.10 でアプリを開発していたとします。このアプリが Python 3.7、3.8、3.9、3.11 といった異なる実行環境でも正常に動作するかを確認したいとき、Docker を利用すると便利です。各バージョンの Python 環境をコンテナとして簡単に用意できるため、複数バージョンでの動作確認を1台ので手軽に行うことができます。

6.1.2 ケース2

チーム開発のように「全員の開発環境をそろえたい」ときにも Docker は強力です。OS (Windows/macOS) やライブラリの違いによる「自分の PC では動くのに、他の人のでは動かない…」というトラブルを防ぐことができます。同じ Docker イメージ (Dockerfiledocker-compose.yaml ) を共有すれば、全員が限りなく同じ環境で開発することができます。

6.1.3 参考書籍

Docker を使用して開発環境を構築するときは、以下の電子書籍が参考になると思います (KindleUnlimited対象 2025/10/09現在)。

VSCode を Dockerコンテナ 環境に接続して開発

本科目では扱いませんが、VSCode の Dev Containers という拡張機能を利用すると、VSCode から Dockerコンテナ内(Linux 環境)に直接接続して、プログラムの実行やデバッグを含む開発作業 を行うこともできます。

img

6.2 デメリット

各種環境を Windows に直接構築する場合と比較して、Docker を利用して環境構築することには、次のようなデメリットがあります。

7 授業時間外学習の指示 (宿題)

🚨本科目は「学修単位科目」であり、1回の講義あたり、4時間相当の授業時間外学習が求められる科目です🏃

(プロンプト例)

いま、Docker コンテナを docker container run --name pg17 -e POSTGRES_USER=student -e POSTGRES_PASSWORD=secret123 -e POSTGRES_DB=playground -p 5432:5432 -d postgres:17.6 のように起動しています。これを docker-compose.yaml を使った方法に切り替えたいです。どのようにすればよいですか。