Torihaji's Growth Diary

Little by little, no hurry.

初心者がDocker で 使い捨て PostgreサーバとPostgreクライアントを作る

はじめに

みなさん、こんにちは torihaziです。

今回はタイトルのことをやっていきます。

現在学習しているもの(youtube)がPosgreSQLになるのですが、

ローカルに色々入れて。。。をやるというものでした。

そうなるとローカルが汚れるので、そんならDockerで全部作ったるということで今に至ります。

復習も兼ねていい勉強になるかと思います。

なおDocker初心者ですので、「そんな使い方するか、はげ」という方は見なかったことにしてください。

あと見切り発車中です。

それではltg

自身の環境について

  • Apple M2
  • Ventura 13.4
  • Docker version 24.0.7, build afdd53b

まず何がいるか

構成図はこんな感じです。

緑の方は Docker hubからpostgresql のimageをそのまま持ってくれば良さそうです。

青の方は postgre-client(psqlが使える)を入れた alipine? ubuntu? を作れば良さそうです。

そのため

  • docker-compose.yml どっちも使わずに一旦作れました。
  • Dockerfile (青用) どっちも使わずに一旦作れました。

を作ればいけそうですね。多分。

やってみる

方針としては

  1. docker network createでネットワーク作成
  2. docker run ~~で dbサーバのコンテナ起動
  3. docker run ~~でdbクライアントのコンテナ起動
  4. docker-compose.ymlでも作ってみる

です。

ネットワークの作成

以下の構成図を目指して作成します。(冒頭に示した図は誤りです)

コンテナ間の通信はbridgeを通じて行うということを理解できていませんでした。

1. 現時点におけるネットワークを調べる

docker network lsで現時点におけるネットワークを調べます。

特に何もしていない場合は次の3つが表示されるはずです。

# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
55d109cc26dc   bridge    bridge    local
90e6df847268   host      host      local
7b13fcb3161b   none      null      local

2. psql-testの作成

docker network create [作成するネットワーク名]でネットワークを作成します。

その後docker network lsで作成されているか確認します。

# docker network create psql-test
wh394twjseiorgu90jthi4oetgioer(英数字の羅列)
# docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
55d109cc26dc   bridge      bridge    local
90e6df847268   host        host      local
7b13fcb3161b   none        null      local
e39c513a77c7   psql-test   bridge    local <= 追加されている

あとはこのpsql-testに作成したdockerコンテナを組み込む(アサイン)するだけです。

この時点で下記のようになっています。

DBサーバコンテナ作成

ここからは単純です。docker run ~~コマンドを叩くだけです。

まずは緑色のDBサーバ用のコンテナを立ち上げます。

長いです。

# docker run --name postgre-db -h postgre-db --network psql-test -e POSTGRES_PASSWORD=postgres -d postgres:16-alpine
3j4oigjewr09gjweirg049q5jgreog(数字の羅列)

1つずつ分解します。

  • docker run : Dockerコンテナを実行する
  • --name postgre-db : postgre-dbという名前のコンテナを作る
  • -h postgre-db : postgre-dbという名前をコンテナ内のホスト名として設定する
  • --network psql-test : 作成したコンテナをpsql-testというネットワークに組み込む
  • -e POSTGRES_PASSWORD=postgres : 環境変数として 設定
  • -d : デタッチモードで起動(バックグラウンドで起動) <- 入力できなくなるので設定する方が無難
  • postgres:16-alpine : Dockerhubから好きなイメージ名を指定(軽いということでalpineに)

作成できたか確認してみます。

# docker container ls
CONTAINER ID   IMAGE                COMMAND                   CREATED         STATUS         PORTS      NAMES
8ca1bea34e14   postgres:16-alpine   "docker-entrypoint.s…"   8 minutes ago   Up 7 minutes   5432/tcp   postgre-db

ネットワークにも組み込まれているか確認します。

# docker network inspect psql-test
[
    {
        "Name": "psql-test",
        "Id": "e39c513a77c7d3793aeade008d1bbfef5333e10021c7e5a0025b194f58181ff1",
        "Created": "2024-02-17T01:37:42.311064131Z",
        "Scope": "local",
        "Driver": "bridge",
  ・・・・・・・・・・
        "Containers": { <= このネットワークに組み込まれているコンテナちゃんたち一覧
            "8ca1bea34e142d28a102251f04403075dfa421193ddbd297e1a0328aa1988f6b": {
                "Name": "postgre-db", <= 組み込まれちゃってるコンテナ
                "EndpointID": "bd142fd32f9999c88f4667f8114d410bc0f54e3af74868183bd4e30dce5effab",
                "MacAddress": "02:42:ac:15:00:02",
                "IPv4Address": "172.21.0.2/16",
                "IPv6Address": ""
            }
        },
 ・・・・・・・

OKですね。これで次の状態になりました。

DBクライアントコンテナ作成

やることはDBサーバの時とほぼ同じです。

方法1 1発でpostgreサーバに入る

## 1発で postgreのプロンプトになります。
#  docker container run --rm --name=postgre-client --network psql-test -it postgres:16-alpine psql -h postgre-db -U postgres -p 5432 postgres
Password for user postgres:  <= パスワードを入力(自分のものに従うなら "postgres")
psql (16.2)
Type "help" for help.

postgres=# 

方法2 bashを挟んでそこからpsqlコマンドでpostgreサーバに入る(今回こっち)

## 一旦bashを立ち上げてからpsqlで入ります。
#  docker container run --rm --name=postgre-client --network psql-test -it postgres:16-alpine bash

どちらかを実行することで次の結果になります。

今回はbashを挟んで行います。

理由は次のことを試したかったからです。

  • psql コマンド本当にあるのか
4819d14d4750:/# which psql
/usr/local/bin/psql
  • DBサーバのホストpingが通るのか
4819d14d4750:/# ping -c 3 postgre-db
PING postgre-db (172.21.0.2): 56 data bytes
64 bytes from 172.21.0.2: seq=0 ttl=64 time=0.148 ms
64 bytes from 172.21.0.2: seq=1 ttl=64 time=0.257 ms
64 bytes from 172.21.0.2: seq=2 ttl=64 time=0.335 ms

--- postgre-db ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.148/0.246/0.335 ms
  • /etc/hostsにdbサーバの情報はあるのか
4819d14d4750:/# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.21.0.3      4819d14d4750

ないですね。postgre-dbの情報はどこに載っているのでしょうか。

勝手にdockerのDNSで名前解決されることは理解していますが、どこに載っているのでしょうか。

わかる人いたら教えてください。

とりあえず無事繋がるのでよしとします。

最後にpsqlコマンド(クライアントからサーバに繋ぐためのコマンド)で接続します。

4819d14d4750:/# psql -h postgre-db -U postgres
Password for user postgres:  <= ここも変えてなければ postgres
psql (16.2)
Type "help" for help.

postgres=# 

無事接続できましたね。

ちなみにクライアント側でexitで抜けると --rmを設定しているので

出たらコンテナも削除されるはずです。

起動しているときに他ターミナルで確認します。

# docker container ls -a
CONTAINER ID   IMAGE                COMMAND                   CREATED         STATUS         PORTS      NAMES
1088051238b6   postgres:16-alpine   "docker-entrypoint.s…"   5 seconds ago   Up 5 seconds   5432/tcp   postgre-client
001fdbdbc239   postgres:16-alpine   "docker-entrypoint.s…"   5 minutes ago   Up 4 minutes   5432/tcp   postgre-db

上のやつですね。

クライアントから抜けます。

1088051238b6:/# exit
exit

# docker container ls -a
CONTAINER ID   IMAGE                COMMAND                   CREATED         STATUS         PORTS      NAMES
001fdbdbc239   postgres:16-alpine   "docker-entrypoint.s…"   5 minutes ago   Up 5 minutes   5432/tcp   postgre-db

きちんと使い捨てのものができました!

見切り発車終点です。。。

docker-compose.yml

ごめんなさい。事切れました。次回作で作ります。

終わりに

いかがだったでしょうか。

コンテナのデータ永続化とかそういうものまではできていませんが

一旦これで十分だと思います。

ymlファイルについては盛大にサボりましたが、一旦これにて終了です。

コンテナのデータ永続化についてもymlのものとまとめてやります。

疲れました。

しかしネットワークについては理解が深まりました。

やっぱりテキストのものをやるだけではなく、自分でこうするにはどうしたら。。。

という流れでテキスト見直してあーだこーだしたほうが習得が早いです。

さてこれからインプット動画視聴です。

みなさんも勉強頑張ってください。

僕も頑張ります。