DockerでPostgreSQLを試してみる

DockerでPostgreSQLを試してみる

Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provision :docker
end

VagrantでCentOS7を起動して接続。

> vagrant up
> vagrant ssh

PostgreSQLのコンテナを起動。

$ docker run -d --name my-db -p 5432:5432 postgres

しかし、起動しない。

$ docker ps -a
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS                      PORTS     NAMES
424dcd28dc6e   postgres   "docker-entrypoint.s…"   17 seconds ago   Exited (1) 16 seconds ago             my-db

ログを見ると、POSTGRES_PASSWORDを指定しろと書いてある。

$ docker logs my-db
Error: Database is uninitialized and superuser password is not specified.
       You must specify POSTGRES_PASSWORD to a non-empty value for the
       superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
・・・

改めて、POSTGRES_PASSWORDを指定して起動

$ docker rm my-db
$ docker run -d -e POSTGRES_PASSWORD=hogehoge --name my-db -p 5432:5432 postgres

起動できた。

$ docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                    NAMES
9789ba348819   postgres   "docker-entrypoint.s…"   11 seconds ago   Up 11 seconds   0.0.0.0:5432->5432/tcp   my-db

bashを起動して、

$ docker exec -it my-db /bin/bash

データベースを作ってみる。

# psql -U postgres
postgres# CREATE DATABASE hoge;

できた。

postgres# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
 hoge      | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres

postgres# \q
# exit

A5:SQLで接続してみる。
f:id:yk5656:20210126220253j:plain

接続できた。
f:id:yk5656:20210126220302j:plain

一応、自動で起動するようにしておく。

$ docker update --restart=always my-db

再起動しても、

$ exit
> vagrant reload
> vagrant ssh

起動している。

$ docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED             STATUS          PORTS                    NAMES
9789ba348819   postgres   "docker-entrypoint.s…"   About an hour ago   Up 22 seconds   0.0.0.0:5432->5432/tcp   my-db

docker-composeの場合

下記のようなVagrantfileとdocker-compose.ymlを用意。

Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder ".", "/vagrant", type:"virtualbox"

  config.vm.provision :docker
  config.vm.provision :docker_compose, yml: "/vagrant/docker-compose.yml"
end

docker-compose.yml

version: '3'
services:
  postgres:
    image: postgres
    container_name: my-db
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD: hogehoge
    restart: always

※「vagrant plugin install vagrant-docker-compose」でvagrant-docker-composeをインストールしておく必要あり。

※docker-compose.ymlに「restart: always」を指定するのではなく、Vagrantfileに「run: "always"」と指定するのもいいかも。

・・・
  config.vm.provision :docker_compose, yml: "/vagrant/docker-compose.yml", run: "always"
 ・・・