はじめに
みなさん、こんにちは 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 (青用)どっちも使わずに一旦作れました。
を作ればいけそうですね。多分。
やってみる
方針としては
docker network create
でネットワーク作成docker run ~~
で dbサーバのコンテナ起動docker run ~~
でdbクライアントのコンテナ起動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のものとまとめてやります。
疲れました。
しかしネットワークについては理解が深まりました。
やっぱりテキストのものをやるだけではなく、自分でこうするにはどうしたら。。。
という流れでテキスト見直してあーだこーだしたほうが習得が早いです。
さてこれからインプット動画視聴です。
みなさんも勉強頑張ってください。
僕も頑張ります。