でじたるチリクラブ

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

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

Dockerのお勉強をかねて、PostgreSQLをコンテナで動かせるようにする。

環境

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

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

PostgreSQLイメージの取得

PostgreSQLのイメージは、Docker Hubに上がっている公式イメージを利用する。

Docker Hubからローカルに最新(latest)イメージを取得する。

> docker pull postgres

PostgreSQLコンテナの実行

公式イメージのページに記載されているコマンドのとおり、コンテナを作成してpostgresインスタンスを起動してみる。

> docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres

以下はdocker runコマンドのオプションの説明。

  • --nameはコンテナに任意の名前をつけたいときに指定する。
  • -e環境変数を指定する。PostgreSQLのイメージの実行に必須となる、POSTGRES_PASSWORDにパスワードを設定する。
  • -dはコンテナをバックグラウンドのdetachedモードで実行する。デフォルトはフォアグラウンドのforegroundモード実行。
  • さいごのpostgresは実行対象のコンテナイメージの名前。

コンテナが動いているか確認する。

> docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED        STATUS         PORTS      NAMES
4656c729e721   postgres   "docker-entrypoint.s…"   1 second ago   Up 2 seconds   5432/tcp   some-postgres

コンテナを停止させるときはdocker stopコマンドを使う。

> docker stop <コンテナの名前>

dockerコマンドの補足

docker runはコンテナを作成して実行するコマンドで、作成するコンテナの名前はユニークである必要がある。あるコンテナが停止中であっても、別のコンテナを同じ名前でdocker runすると、以下のようにコンテナ名が既に使われているとエラーメッセージが出る。

> docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
docker: Error response from daemon: Conflict. The container name "/some-postgres" is already in use by container "4656c729e7214c53f21e6e7952423106b9a6be3b930a63d3ea50c3588f478eba". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

停止中の作成済みコンテナを起動するときは、docker startコマンドを使う。

> docker start <コンテナの名前>

docker rmコマンドでコンテナを削除すれば、再び同じ名前でコンテナを作成できるようになる。

> docker ps -a
CONTAINER ID   IMAGE                             COMMAND                  CREATED          STATUS                        PORTS     NAMES
4656c729e721   postgres                          "docker-entrypoint.s…"   17 minutes ago   Exited (0) 13 minutes ago               some-postgres

> docker rm some-postgres
> docker ps -a
CONTAINER ID   IMAGE                             COMMAND            CREATED        STATUS                    PORTS     NAMES

> docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres

あるいは--nameでコンテナ名を指定しなければ、Dockerが重複しない名前を勝手につけてくれる。

> docker run -e POSTGRES_PASSWORD=mysecretpassword -d postgres
> docker ps
CONTAINER ID   IMAGE                             COMMAND                  CREATED         STATUS         PORTS
                               NAMES
fdd01f765286   postgres                          "docker-entrypoint.s…"   8 seconds ago   Up 7 seconds   5432/tcp                                      xenodochial_wilbur

参考