STEP 4:初めてのDockerコンテナ実行

🐳 STEP 4: 初めてのDockerコンテナ実行

PostgreSQLコンテナを起動して、データベースに接続・操作してみよう

📋 このステップで学ぶこと

  • docker runコマンドの詳細な使い方とオプションの意味
  • PostgreSQLコンテナの起動と動作確認
  • docker execコマンドでコンテナ内に接続する方法
  • PostgreSQLでのデータベース基本操作(CRUD)
  • コンテナの停止・再開・削除の方法
  • コンテナとイメージの関係の理解

🎯 1. PostgreSQLコンテナを起動しよう

1-1. PostgreSQLとは?

📊 PostgreSQL(ポストグレスキューエル)

世界中で広く使われているオープンソースのリレーショナルデータベースです。
高性能、高信頼性で、大企業からスタートアップまで幅広く採用されています。
データエンジニアリングでは、データウェアハウスやETL処理のデータストアとして頻繁に使用されます。

1-2. なぜPostgreSQLをDockerで動かすのか?

従来のインストール方法とDockerを使った方法を比較してみましょう。

❌ 従来の方法
  • PostgreSQLをダウンロード(10分)
  • インストーラーを実行(10分)
  • 設定ファイルを編集(20分)
  • ユーザーやデータベースを作成(10分)
  • 環境変数の設定(10分)
  • トラブル対応(???)
  • 合計:1〜2時間
✅ Dockerの方法
  • コマンド1つで起動
  • 設定はオプションで指定
  • すぐに使える
  • 不要になったら削除するだけ
  • 環境を汚さない
  •  
  • 合計:約1分

1-3. PostgreSQLコンテナを起動するコマンド

以下のコマンドを実行して、PostgreSQLコンテナを起動します。

docker run –name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres:15
💡 コマンドが長い場合

上記のコマンドは1行で入力します。
読みやすくするために、バックスラッシュ(\)を使って複数行に分けることもできます。

複数行で書く場合(見やすい形式):

docker run –name my-postgres \ -e POSTGRES_PASSWORD=mysecretpassword \ -p 5432:5432 \ -d postgres:15

1-4. コマンドの各部分の意味

このコマンドは複数のオプションで構成されています。一つずつ詳しく見ていきましょう。

オプション 意味 詳細説明
docker run コンテナを作成して起動 イメージからコンテナを作成し、実行するコマンド
--name my-postgres コンテナに名前をつける 「my-postgres」という名前でコンテナを識別できる。省略するとランダムな名前が付く
-e POSTGRES_PASSWORD=... 環境変数を設定 PostgreSQLの管理者パスワードを設定。この環境変数は必須
-p 5432:5432 ポートを公開 ホスト(左):コンテナ(右)のポートを接続。ホストの5432番ポートからアクセス可能に
-d バックグラウンド実行 デタッチモード。コンテナをバックグラウンドで実行し、すぐにコマンドプロンプトに戻る
postgres:15 使用するイメージ PostgreSQLバージョン15の公式イメージを使用

1-5. コマンドを実行してみよう

上記のコマンドを実行すると、以下のような出力が表示されます。

Unable to find image ‘postgres:15’ locally 15: Pulling from library/postgres a2abf6c4d29d: Pull complete e1769f35a42a: Pull complete 33a59cfee47c: Pull complete 461b2090c5c5: Pull complete 8ed8ab6290fa: Pull complete 495e42c822a0: Pull complete 18e858c71c58: Pull complete 594792c80d5f: Pull complete 9e96f8f30da9: Pull complete fa0da4066946: Pull complete d5b13c6d4e82: Pull complete 8734e16c0d20: Pull complete dc14f5a87091: Pull complete Digest: sha256:c4c45e8e… Status: Downloaded newer image for postgres:15 7f8c3e5b4d2a1c9b8e7f6a5d4c3b2a1f0e9d8c7b6a5d4c3b2a1f0e9d8c7b6a5d
📝 出力の意味
  • Unable to find image ‘postgres:15’ locally:ローカルにイメージがないことを検出
  • Pulling from library/postgres:Docker Hubからイメージをダウンロード開始
  • Pull complete:各レイヤーのダウンロード完了(PostgreSQLは複数のレイヤーで構成)
  • 最後の長い文字列:作成されたコンテナのID
💡 2回目以降の起動

一度イメージをダウンロードすれば、2回目以降はダウンロードなしで即座に起動します。
これがDockerの大きなメリットの一つです。

1-6. コンテナが動いているか確認

コンテナが正常に起動しているか確認しましょう。

docker ps
📝 コマンドの意味
  • docker ps :現在実行中のコンテナ一覧を表示するコマンド
  • 「ps」は「process status(プロセスの状態)」の略

以下のような出力が表示されます。

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7f8c3e5b4d2a postgres:15 “docker-entrypoint.s…” 2 minutes ago Up 2 minutes 0.0.0.0:5432->5432/tcp my-postgres
✅ 確認ポイント
  • STATUSが「Up」→ コンテナが正常に動作中
  • PORTSに「0.0.0.0:5432->5432/tcp」→ ポート5432で接続可能
  • NAMESが「my-postgres」→ 指定した名前で起動されている
📊 docker ps の出力項目の説明
項目 説明
CONTAINER ID コンテナを識別する一意のID(先頭12文字を表示)
IMAGE コンテナの元になったイメージ名
COMMAND コンテナ内で実行されているコマンド
CREATED コンテナが作成されてからの経過時間
STATUS コンテナの状態(Up=実行中、Exited=停止)
PORTS 公開されているポートのマッピング情報
NAMES コンテナの名前

🔌 2. PostgreSQLコンテナに接続しよう

2-1. docker execコマンドとは?

docker execコマンドを使うと、実行中のコンテナ内でコマンドを実行できます。
これを使ってPostgreSQLのコマンドラインツール(psql)に接続します。

2-2. コンテナ内のPostgreSQLに接続

以下のコマンドを実行します。

docker exec -it my-postgres psql -U postgres
📝 コマンドの各部分の意味
  • docker exec :実行中のコンテナ内でコマンドを実行
  • -i :インタラクティブモード(標準入力を開いたままにする)
  • -t :疑似ターミナルを割り当てる(端末のように操作できる)
  • -it :上記2つのオプションを組み合わせ。対話的な操作が可能に
  • my-postgres :接続先のコンテナ名
  • psql :PostgreSQLのコマンドラインクライアント
  • -U postgres :「postgres」ユーザーでログイン

接続に成功すると、以下のようなプロンプトが表示されます。

psql (15.4 (Debian 15.4-1.pgdg120+1)) Type “help” for help. postgres=#
✅ 接続成功!

postgres=#というプロンプトが表示されたら、PostgreSQLに接続できています。
これで、SQLコマンドやpsqlの特殊コマンドを実行できます!

2-3. psqlの基本的な使い方

psqlには、SQLコマンドの他に、バックスラッシュ(\)で始まる特殊コマンドがあります。

📚 よく使うpsqlコマンド一覧
コマンド 機能 説明
\l データベース一覧 サーバー上のすべてのデータベースを表示
\c データベース名 データベースに接続 指定したデータベースに切り替え
\dt テーブル一覧 現在のデータベースのテーブルを表示
\d テーブル名 テーブル構造 テーブルのカラム情報を表示
\du ユーザー一覧 データベースユーザーを表示
\q 終了 psqlを終了してコンテナから出る
\? ヘルプ psqlコマンドの一覧を表示

2-4. データベース一覧を確認してみよう

接続したら、まずデータベースの一覧を確認してみましょう。

\l
List of databases Name | Owner | Encoding | Collate | Ctype | ICU Locale | Locale Provider | Access privileges ———–+———-+———-+————+————+————+—————–+———————– postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | | libc | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | | libc | =c/postgres + | | | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | | libc | =c/postgres + | | | | | | | postgres=CTc/postgres (3 rows)
📝 デフォルトで存在するデータベース
  • postgres:デフォルトのデータベース。管理作業に使用
  • template0:システム用テンプレート(変更不可)
  • template1:新しいデータベース作成時のテンプレート

📊 3. データベースの基本操作

3-1. 新しいデータベースを作成

実際にデータベースを作成して、テーブルを操作してみましょう。
まず、新しいデータベース「testdb」を作成します。

CREATE DATABASE testdb;
📝 SQLコマンドの注意点

SQLコマンドはセミコロン(;)で終わる必要があります。
セミコロンを入力してEnterを押すと、コマンドが実行されます。

CREATE DATABASE

作成されたことを確認します。

\l

一覧に「testdb」が追加されているはずです。では、このデータベースに接続しましょう。

\c testdb
You are now connected to database “testdb” as user “postgres”. testdb=#
✅ 確認ポイント

プロンプトが postgres=# から testdb=# に変わりました。
これで、testdbデータベースで作業できます。

3-2. テーブルを作成

ユーザー情報を格納する「users」テーブルを作成します。

CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
📝 各カラムの意味
  • id SERIAL PRIMARY KEY :自動採番される主キー(1, 2, 3…と自動で増える)
  • name VARCHAR(100) NOT NULL :最大100文字の文字列、NULL不可
  • email VARCHAR(100) UNIQUE NOT NULL :最大100文字、重複不可、NULL不可
  • created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP :日時型、デフォルトで現在時刻
CREATE TABLE

テーブル一覧を確認します。

\dt
List of relations Schema | Name | Type | Owner ——–+——-+——-+———- public | users | table | postgres (1 row)

テーブルの構造を確認します。

\d users
Table “public.users” Column | Type | Collation | Nullable | Default ————+—————————–+———–+———-+———————————– id | integer | | not null | nextval(‘users_id_seq’::regclass) name | character varying(100) | | not null | email | character varying(100) | | not null | created_at | timestamp without time zone | | | CURRENT_TIMESTAMP Indexes: “users_pkey” PRIMARY KEY, btree (id) “users_email_key” UNIQUE CONSTRAINT, btree (email)

3-3. データを挿入(INSERT)

テーブルにデータを挿入します。

INSERT INTO users (name, email) VALUES (‘山田太郎’, ‘taro@example.com’), (‘佐藤花子’, ‘hanako@example.com’), (‘鈴木次郎’, ‘jiro@example.com’);
📝 INSERTの書き方

INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (値1, 値2, ...);
複数行を一度に挿入する場合は、VALUESの後にカンマで区切って並べます。
idとcreated_atは自動設定されるので指定不要です。

INSERT 0 3

「INSERT 0 3」は「3行挿入された」という意味です。確認してみましょう。

SELECT * FROM users;
id | name | email | created_at —-+———-+——————–+—————————- 1 | 山田太郎 | taro@example.com | 2024-01-15 10:30:45.123456 2 | 佐藤花子 | hanako@example.com | 2024-01-15 10:30:45.123456 3 | 鈴木次郎 | jiro@example.com | 2024-01-15 10:30:45.123456 (3 rows)

3-4. データを検索(SELECT)

様々な条件でデータを検索してみましょう。

全件取得

SELECT * FROM users;

特定のカラムだけ取得

SELECT name, email FROM users;
name | email ———-+——————– 山田太郎 | taro@example.com 佐藤花子 | hanako@example.com 鈴木次郎 | jiro@example.com (3 rows)

条件を指定して検索(WHERE句)

SELECT * FROM users WHERE name = ‘山田太郎’;
id | name | email | created_at —-+———-+——————+—————————- 1 | 山田太郎 | taro@example.com | 2024-01-15 10:30:45.123456 (1 row)

3-5. データを更新(UPDATE)

山田太郎さんのメールアドレスを変更してみましょう。

UPDATE users SET email = ‘taro_new@example.com’ WHERE id = 1;
📝 UPDATEの書き方

UPDATE テーブル名 SET カラム名 = 新しい値 WHERE 条件;
WHERE句を忘れると全レコードが更新されてしまうので注意!

UPDATE 1

確認します。

SELECT * FROM users WHERE id = 1;
id | name | email | created_at —-+———-+———————-+—————————- 1 | 山田太郎 | taro_new@example.com | 2024-01-15 10:30:45.123456 (1 row)

3-6. データを削除(DELETE)

鈴木次郎さんのデータを削除してみましょう。

DELETE FROM users WHERE id = 3;
⚠️ DELETEの注意点

DELETE FROM テーブル名 WHERE 条件;
WHERE句を忘れると全レコードが削除されてしまうので要注意!

DELETE 1

全件を確認します。

SELECT * FROM users;
id | name | email | created_at —-+———-+———————-+—————————- 1 | 山田太郎 | taro_new@example.com | 2024-01-15 10:30:45.123456 2 | 佐藤花子 | hanako@example.com | 2024-01-15 10:30:45.123456 (2 rows)

3-7. PostgreSQLから退出

作業が終わったら、psqlを終了します。

\q

これでコンテナ内のpsqlから退出し、ホストのターミナルに戻ります。

🛑 4. コンテナの停止・再開・削除

4-1. コンテナを停止する

作業が終わったら、コンテナを停止してリソースを解放できます。

docker stop my-postgres
📝 コマンドの意味
  • docker stop :実行中のコンテナを停止するコマンド
  • my-postgres :停止するコンテナ名(またはコンテナID)
my-postgres

停止したコンテナを確認するには、-aオプションを付けます。

docker ps -a
📝 docker ps -a とは

docker ps は実行中のコンテナのみ表示しますが、
-a(all)オプションを付けると、停止中のコンテナも含めてすべて表示します。

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7f8c3e5b4d2a postgres:15 “docker-entrypoint.s…” 30 minutes ago Exited (0) 10 seconds ago my-postgres
✅ 確認ポイント

STATUSが「Exited (0)」になっていれば正常に停止しています。
カッコ内の数字は終了コードで、「0」は正常終了を意味します。

4-2. コンテナを再開する

停止したコンテナは、再度起動できます。

docker start my-postgres
📝 docker run と docker start の違い
  • docker run :イメージから新しいコンテナを作成して起動
  • docker start既存の停止中コンテナを再開
my-postgres

再開したことを確認します。

docker ps
💡 データは残っている?

コンテナを停止・再開しても、データは保持されます!
先ほど作成したデータベースやテーブル、挿入したデータはそのまま残っています。
もう一度 docker exec -it my-postgres psql -U postgres で接続して確認してみましょう。

4-3. コンテナを削除する

コンテナが不要になったら、削除してディスク容量を解放できます。
削除する前に、まずコンテナを停止する必要があります。

docker stop my-postgres docker rm my-postgres
📝 コマンドの意味
  • docker rm :コンテナを削除するコマンド(remove の略)
  • 実行中のコンテナは削除できないため、先に docker stop が必要
my-postgres my-postgres

削除されたことを確認します。

docker ps -a

「my-postgres」が一覧から消えていれば削除成功です。

⚠️ コンテナを削除するとデータも消える

コンテナを削除すると、コンテナ内のデータも一緒に削除されます。
データを永続化する方法は、STEP 10「ボリュームとデータ永続化」で学びます。

4-4. コンテナとイメージの関係

コンテナを削除しても、イメージは残っています。確認してみましょう。

docker images
📝 コマンドの意味

docker images :ローカルにダウンロードされているイメージ一覧を表示

REPOSITORY TAG IMAGE ID CREATED SIZE postgres 15 abc123def456 2 weeks ago 379MB
💡 イメージが残っているメリット

イメージが残っているので、次回コンテナを作成する際はダウンロード不要で即座に起動できます。
もう一度 docker run を実行すれば、すぐに新しいコンテナが作成されます。

4-5. イメージも削除する(オプション)

ディスク容量を節約したい場合は、イメージも削除できます。

docker rmi postgres:15
📝 コマンドの意味
  • docker rmi :イメージを削除するコマンド(remove image の略)
  • postgres:15 :削除するイメージ名とタグ
⚠️ 注意

イメージを削除すると、次回起動時に再ダウンロードが必要になります(数分かかる)。
ディスク容量に余裕があれば、イメージは残しておくことをおすすめします。

4-6. コンテナのライフサイクルまとめ

【コンテナのライフサイクル】 ① イメージをダウンロード(初回のみ) docker pull postgres:15 ↓ ② コンテナを作成・起動 docker run –name my-postgres … postgres:15 ↓ ③ コンテナを使用 docker exec -it my-postgres psql -U postgres ↓ ④ コンテナを停止 docker stop my-postgres ↓ ⑤ コンテナを再開(必要に応じて) docker start my-postgres ↓ ⑥ コンテナを削除 docker rm my-postgres ↓ ⑦ イメージを削除(必要に応じて) docker rmi postgres:15

💪 5. 練習問題

ここまで学んだ内容を練習問題で確認しましょう。
まず、PostgreSQLコンテナを起動してから取り組んでください。

docker run –name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres:15 docker exec -it my-postgres psql -U postgres
練習問題 1 基礎

新しいデータベース「practice」を作成してください

データベースを作成した後、そのデータベースに接続してください。

【解答】
CREATE DATABASE practice; \c practice

CREATE DATABASE でデータベースを作成し、\c で接続します。
プロンプトが practice=# に変われば成功です。

練習問題 2 基礎

社員(employees)テーブルを作成してください

要件:

  • id:主キー、自動採番
  • name:名前、最大100文字、NULL不可
  • department:部署、最大100文字、NULL不可
  • salary:給与、整数型
【解答】
CREATE TABLE employees ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, department VARCHAR(100) NOT NULL, salary INTEGER ); — 確認 \d employees
練習問題 3 基礎

以下の社員データを挿入してください

  • 山田太郎、営業部、500000
  • 佐藤花子、開発部、600000
  • 鈴木次郎、人事部、450000
  • 田中三郎、開発部、650000
【解答】
INSERT INTO employees (name, department, salary) VALUES (‘山田太郎’, ‘営業部’, 500000), (‘佐藤花子’, ‘開発部’, 600000), (‘鈴木次郎’, ‘人事部’, 450000), (‘田中三郎’, ‘開発部’, 650000); — 確認 SELECT * FROM employees;
練習問題 4 基礎

以下のデータ検索クエリを作成してください

  1. 開発部の社員を全員表示
  2. 給与が55万円以上の社員を表示
  3. 社員を給与の高い順に表示
【解答】
— 1. 開発部の社員 SELECT * FROM employees WHERE department = ‘開発部’; — 2. 給与が55万円以上 SELECT * FROM employees WHERE salary >= 550000; — 3. 給与の高い順(降順) SELECT * FROM employees ORDER BY salary DESC;
練習問題 5 応用

以下のデータ更新・削除操作を行ってください

  1. 山田太郎の給与を550000に昇給
  2. 鈴木次郎を削除
  3. 開発部全員の給与を5%アップ
【解答】
— 1. 山田太郎の昇給 UPDATE employees SET salary = 550000 WHERE name = ‘山田太郎’; — 2. 鈴木次郎を削除 DELETE FROM employees WHERE name = ‘鈴木次郎’; — 3. 開発部全員を5%アップ UPDATE employees SET salary = salary * 1.05 WHERE department = ‘開発部’; — 確認 SELECT * FROM employees;
練習問題 6 応用

部署ごとの集計クエリを作成してください

  1. 部署ごとの社員数を表示
  2. 部署ごとの平均給与を表示
  3. 部署ごとの給与合計を表示し、合計が100万円以上の部署のみ表示
【解答】
— 1. 部署ごとの社員数 SELECT department, COUNT(*) as employee_count FROM employees GROUP BY department; — 2. 部署ごとの平均給与 SELECT department, AVG(salary) as avg_salary FROM employees GROUP BY department; — 3. 給与合計が100万円以上の部署 SELECT department, SUM(salary) as total_salary FROM employees GROUP BY department HAVING SUM(salary) >= 1000000;
練習問題 7 応用

コンテナ操作の練習

以下の操作を順番に実行してください。

  1. psqlを終了する
  2. コンテナを停止する
  3. 停止中のコンテナを含めて一覧表示する
  4. コンテナを再開する
  5. 再開したコンテナに再接続し、データが残っていることを確認する
【解答】
— 1. psqlを終了 \q — 2. コンテナを停止 docker stop my-postgres — 3. 停止中含めて一覧表示 docker ps -a — 4. コンテナを再開 docker start my-postgres — 5. 再接続してデータ確認 docker exec -it my-postgres psql -U postgres \c practice SELECT * FROM employees;
練習問題 8 発展

テーブル結合にチャレンジ

部署テーブルを作成し、社員テーブルと結合してください。

  • departments テーブル:id、name(部署名)、location(所在地)
  • 営業部(東京)、開発部(大阪)、人事部(東京)を登録
  • 社員名と所在地を表示するクエリを作成
【解答】
— 部署テーブル作成 CREATE TABLE departments ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, location VARCHAR(100) ); — データ挿入 INSERT INTO departments (name, location) VALUES (‘営業部’, ‘東京’), (‘開発部’, ‘大阪’), (‘人事部’, ‘東京’); — 結合クエリ(部署名で結合) SELECT e.name as 社員名, e.department as 部署, d.location as 所在地 FROM employees e LEFT JOIN departments d ON e.department = d.name;

LEFT JOIN は、左のテーブル(employees)の全レコードを表示し、
右のテーブル(departments)に対応するデータがあれば結合します。

📝 STEP 4 のまとめ

✅ このステップで学んだこと
  • docker runでPostgreSQLコンテナを起動(オプションの意味も理解)
  • docker psで実行中のコンテナを確認
  • docker exec -itでコンテナ内のpsqlに接続
  • PostgreSQLでの基本操作(CREATE、INSERT、SELECT、UPDATE、DELETE)
  • docker stop/startでコンテナの停止・再開
  • docker rmでコンテナの削除
  • コンテナとイメージの関係を理解
📊 今回学んだDockerコマンド一覧
コマンド 機能
docker run イメージからコンテナを作成して起動
docker ps 実行中のコンテナ一覧を表示
docker ps -a 停止中含む全コンテナ一覧を表示
docker exec -it コンテナ内でコマンドを実行
docker stop コンテナを停止
docker start 停止中のコンテナを再開
docker rm コンテナを削除
docker images イメージ一覧を表示
docker rmi イメージを削除
💡 重要ポイント

従来なら1〜2時間かかるPostgreSQLのセットアップが、Dockerなら1分でできました!
これがDockerの威力です。

しかも、不要になったら簡単に削除できて、ホストマシンの環境を汚しません。
開発やテスト、学習に最適なツールです。

🎯 次のステップの予告

次のSTEP 5では、「Dockerの基本コマンド」をより詳しく学びます。

  • docker runの詳細なオプション
  • docker logsでログを確認
  • docker inspectで詳細情報を取得
  • Nginxコンテナを使った実践

Dockerコマンドをマスターして、より自由にコンテナを操作できるようになりましょう!

📝

学習メモ

Docker・コンテナ技術入門 - Step 4

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE