🐳 STEP 4: 初めてのDockerコンテナ実行
PostgreSQLコンテナを起動して、データベースに接続・操作してみよう
📋 このステップで学ぶこと
- docker runコマンドの詳細な使い方とオプションの意味
- PostgreSQLコンテナの起動と動作確認
- docker execコマンドでコンテナ内に接続する方法
- PostgreSQLでのデータベース基本操作(CRUD)
- コンテナの停止・再開・削除の方法
- コンテナとイメージの関係の理解
🎯 1. PostgreSQLコンテナを起動しよう
1-1. PostgreSQLとは?
世界中で広く使われているオープンソースのリレーショナルデータベースです。
高性能、高信頼性で、大企業からスタートアップまで幅広く採用されています。
データエンジニアリングでは、データウェアハウスやETL処理のデータストアとして頻繁に使用されます。
1-2. なぜPostgreSQLをDockerで動かすのか?
従来のインストール方法とDockerを使った方法を比較してみましょう。
- PostgreSQLをダウンロード(10分)
- インストーラーを実行(10分)
- 設定ファイルを編集(20分)
- ユーザーやデータベースを作成(10分)
- 環境変数の設定(10分)
- トラブル対応(???)
- 合計:1〜2時間
- コマンド1つで起動
- 設定はオプションで指定
- すぐに使える
- 不要になったら削除するだけ
- 環境を汚さない
- 合計:約1分
1-3. PostgreSQLコンテナを起動するコマンド
以下のコマンドを実行して、PostgreSQLコンテナを起動します。
上記のコマンドは1行で入力します。
読みやすくするために、バックスラッシュ(\)を使って複数行に分けることもできます。
複数行で書く場合(見やすい形式):
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:ローカルにイメージがないことを検出
- Pulling from library/postgres:Docker Hubからイメージをダウンロード開始
- Pull complete:各レイヤーのダウンロード完了(PostgreSQLは複数のレイヤーで構成)
- 最後の長い文字列:作成されたコンテナのID
一度イメージをダウンロードすれば、2回目以降はダウンロードなしで即座に起動します。
これがDockerの大きなメリットの一つです。
1-6. コンテナが動いているか確認
コンテナが正常に起動しているか確認しましょう。
docker ps:現在実行中のコンテナ一覧を表示するコマンド- 「ps」は「process status(プロセスの状態)」の略
以下のような出力が表示されます。
- STATUSが「Up」→ コンテナが正常に動作中
- PORTSに「0.0.0.0:5432->5432/tcp」→ ポート5432で接続可能
- NAMESが「my-postgres」→ 指定した名前で起動されている
| 項目 | 説明 |
|---|---|
| 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:実行中のコンテナ内でコマンドを実行-i:インタラクティブモード(標準入力を開いたままにする)-t:疑似ターミナルを割り当てる(端末のように操作できる)-it:上記2つのオプションを組み合わせ。対話的な操作が可能にmy-postgres:接続先のコンテナ名psql:PostgreSQLのコマンドラインクライアント-U postgres:「postgres」ユーザーでログイン
接続に成功すると、以下のようなプロンプトが表示されます。
postgres=#というプロンプトが表示されたら、PostgreSQLに接続できています。
これで、SQLコマンドやpsqlの特殊コマンドを実行できます!
2-3. psqlの基本的な使い方
psqlには、SQLコマンドの他に、バックスラッシュ(\)で始まる特殊コマンドがあります。
| コマンド | 機能 | 説明 |
|---|---|---|
\l |
データベース一覧 | サーバー上のすべてのデータベースを表示 |
\c データベース名 |
データベースに接続 | 指定したデータベースに切り替え |
\dt |
テーブル一覧 | 現在のデータベースのテーブルを表示 |
\d テーブル名 |
テーブル構造 | テーブルのカラム情報を表示 |
\du |
ユーザー一覧 | データベースユーザーを表示 |
\q |
終了 | psqlを終了してコンテナから出る |
\? |
ヘルプ | psqlコマンドの一覧を表示 |
2-4. データベース一覧を確認してみよう
接続したら、まずデータベースの一覧を確認してみましょう。
- postgres:デフォルトのデータベース。管理作業に使用
- template0:システム用テンプレート(変更不可)
- template1:新しいデータベース作成時のテンプレート
📊 3. データベースの基本操作
3-1. 新しいデータベースを作成
実際にデータベースを作成して、テーブルを操作してみましょう。
まず、新しいデータベース「testdb」を作成します。
SQLコマンドはセミコロン(;)で終わる必要があります。
セミコロンを入力してEnterを押すと、コマンドが実行されます。
作成されたことを確認します。
一覧に「testdb」が追加されているはずです。では、このデータベースに接続しましょう。
プロンプトが postgres=# から testdb=# に変わりました。
これで、testdbデータベースで作業できます。
3-2. テーブルを作成
ユーザー情報を格納する「users」テーブルを作成します。
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:日時型、デフォルトで現在時刻
テーブル一覧を確認します。
テーブルの構造を確認します。
3-3. データを挿入(INSERT)
テーブルにデータを挿入します。
INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (値1, 値2, ...);
複数行を一度に挿入する場合は、VALUESの後にカンマで区切って並べます。
idとcreated_atは自動設定されるので指定不要です。
「INSERT 0 3」は「3行挿入された」という意味です。確認してみましょう。
3-4. データを検索(SELECT)
様々な条件でデータを検索してみましょう。
全件取得
特定のカラムだけ取得
条件を指定して検索(WHERE句)
3-5. データを更新(UPDATE)
山田太郎さんのメールアドレスを変更してみましょう。
UPDATE テーブル名 SET カラム名 = 新しい値 WHERE 条件;
WHERE句を忘れると全レコードが更新されてしまうので注意!
確認します。
3-6. データを削除(DELETE)
鈴木次郎さんのデータを削除してみましょう。
DELETE FROM テーブル名 WHERE 条件;
WHERE句を忘れると全レコードが削除されてしまうので要注意!
全件を確認します。
3-7. PostgreSQLから退出
作業が終わったら、psqlを終了します。
これでコンテナ内のpsqlから退出し、ホストのターミナルに戻ります。
🛑 4. コンテナの停止・再開・削除
4-1. コンテナを停止する
作業が終わったら、コンテナを停止してリソースを解放できます。
docker stop:実行中のコンテナを停止するコマンドmy-postgres:停止するコンテナ名(またはコンテナID)
停止したコンテナを確認するには、-aオプションを付けます。
docker ps は実行中のコンテナのみ表示しますが、
-a(all)オプションを付けると、停止中のコンテナも含めてすべて表示します。
STATUSが「Exited (0)」になっていれば正常に停止しています。
カッコ内の数字は終了コードで、「0」は正常終了を意味します。
4-2. コンテナを再開する
停止したコンテナは、再度起動できます。
docker run:イメージから新しいコンテナを作成して起動docker start:既存の停止中コンテナを再開
再開したことを確認します。
コンテナを停止・再開しても、データは保持されます!
先ほど作成したデータベースやテーブル、挿入したデータはそのまま残っています。
もう一度 docker exec -it my-postgres psql -U postgres で接続して確認してみましょう。
4-3. コンテナを削除する
コンテナが不要になったら、削除してディスク容量を解放できます。
削除する前に、まずコンテナを停止する必要があります。
docker rm:コンテナを削除するコマンド(remove の略)- 実行中のコンテナは削除できないため、先に
docker stopが必要
削除されたことを確認します。
「my-postgres」が一覧から消えていれば削除成功です。
コンテナを削除すると、コンテナ内のデータも一緒に削除されます。
データを永続化する方法は、STEP 10「ボリュームとデータ永続化」で学びます。
4-4. コンテナとイメージの関係
コンテナを削除しても、イメージは残っています。確認してみましょう。
docker images :ローカルにダウンロードされているイメージ一覧を表示
イメージが残っているので、次回コンテナを作成する際はダウンロード不要で即座に起動できます。
もう一度 docker run を実行すれば、すぐに新しいコンテナが作成されます。
4-5. イメージも削除する(オプション)
ディスク容量を節約したい場合は、イメージも削除できます。
docker rmi:イメージを削除するコマンド(remove image の略)postgres:15:削除するイメージ名とタグ
イメージを削除すると、次回起動時に再ダウンロードが必要になります(数分かかる)。
ディスク容量に余裕があれば、イメージは残しておくことをおすすめします。
4-6. コンテナのライフサイクルまとめ
💪 5. 練習問題
ここまで学んだ内容を練習問題で確認しましょう。
まず、PostgreSQLコンテナを起動してから取り組んでください。
新しいデータベース「practice」を作成してください
データベースを作成した後、そのデータベースに接続してください。
CREATE DATABASE でデータベースを作成し、\c で接続します。
プロンプトが practice=# に変われば成功です。
社員(employees)テーブルを作成してください
要件:
- id:主キー、自動採番
- name:名前、最大100文字、NULL不可
- department:部署、最大100文字、NULL不可
- salary:給与、整数型
以下の社員データを挿入してください
- 山田太郎、営業部、500000
- 佐藤花子、開発部、600000
- 鈴木次郎、人事部、450000
- 田中三郎、開発部、650000
以下のデータ検索クエリを作成してください
- 開発部の社員を全員表示
- 給与が55万円以上の社員を表示
- 社員を給与の高い順に表示
以下のデータ更新・削除操作を行ってください
- 山田太郎の給与を550000に昇給
- 鈴木次郎を削除
- 開発部全員の給与を5%アップ
部署ごとの集計クエリを作成してください
- 部署ごとの社員数を表示
- 部署ごとの平均給与を表示
- 部署ごとの給与合計を表示し、合計が100万円以上の部署のみ表示
コンテナ操作の練習
以下の操作を順番に実行してください。
- psqlを終了する
- コンテナを停止する
- 停止中のコンテナを含めて一覧表示する
- コンテナを再開する
- 再開したコンテナに再接続し、データが残っていることを確認する
テーブル結合にチャレンジ
部署テーブルを作成し、社員テーブルと結合してください。
- departments テーブル:id、name(部署名)、location(所在地)
- 営業部(東京)、開発部(大阪)、人事部(東京)を登録
- 社員名と所在地を表示するクエリを作成
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 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