でじたるチリクラブ

旧くまでもぶたでもありません

Windows 10でDockerコンテナのPostgreSQLを動かす(2)

bannyaaa.hatenablog.jp

Windows 10でDockerコンテナのPostgreSQLを動かす(1)の続き。

環境

Windows 10でDocker Desktop (WSL 2バックエンド) がインストール済み。

  • Windows 10 Home: 20H2
  • Docker Desktop: 3.5.1
  • Docker Engine: 20.10.7

psqlでデータベースに接続(失敗)

コンテナで実行中のPostgreSQLデータベースにpsqlで接続する。

何も考えずに公式イメージのページにかかれたとおり、以下のコマンドを実行したところエラーになった。

> docker run -it --rm --network some-network postgres psql -h some-postgres -U postgres
docker: Error response from daemon: network some-network not found.

いったんdocker runコマンドのオプションの説明。

  • -it-i-tの組み合わせで、コンテナ内でインタラクティブな操作をするときに指定する。
  • -rmはコンテナを終了時に自動的に削除する。
  • --network <ネットワーク名>はコンテナを指定したネットワークに接続する。
  • psql以降はデータベースに接続するためのpsqlの実行とそのオプション。
    • -hは接続先データベースのホスト名。
    • -Uは接続先データベースのユーザ名。

このdocker runコマンドで行おうとしていることは、一時的に使う2個目のpostgresコンテナを実行し、その中でpsqlを起動してデータベースに接続すること。そしてエラーメッセージは、--networkオプションで指定しているネットワークが存在しないといっている。ここでの「ネットワーク」とは何ぞや、となったのでそこから調べてみた。

Dockerにおけるネットワーク

Dockerにはコンテナ同士の通信を行うためのネットワークという概念がある。

以下のコマンドで現在のネットワーク一覧を表示できる。

> docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
3a23672a0415   bridge    bridge    local
8c5b594cdf11   host      host      local
9add3ef94360   none      null      local

ここでは、はじめから作成済みのネットワークが3点出力されている。コンテナ実行時にネットワークを何も指定しなければ、bridgeが使われる。

ネットワークは追加することができる。

> docker network create some-network
> docker network ls
NETWORK ID     NAME           DRIVER    SCOPE
de7e1d508a4e   bridge         bridge    local
8c5b594cdf11   host           host      local
9add3ef94360   none           null      local
13730a030319   some-network   bridge    local

同一のネットワークを使っているコンテナ同士は通信ができる。ただし、デフォルトのbridgeネットワークを使うと、コンテナ名で通信先を指定することができない。そのためコンテナ同士の通信を行う際は、新規にネットワークをつくるアプローチが一般的なようだ。

公式イメージのページにかかれていたpsqlによる接続方法は、ネットワークsome-networkを作成し、PostgreSQLデータベースコンテナとpsql実行コンテナの両方をそのネットワークに属させる必要があったことがわかった。

ネットワークをきちんと理解するには時間がかかりそうだが、とりあえずここまで。

参考