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実行コンテナの両方をそのネットワークに属させる必要があったことがわかった。
ネットワークをきちんと理解するには時間がかかりそうだが、とりあえずここまで。