docker-composeでPostgresとpgAdminコンテナを作成・起動


最近になってサーバー上でDockerを使うようになり,色々調べたのでメモ.
複数のコンテナをまとめて管理したい場合はdocker-composeを使う.ここではPostgresとpgAdminコンテナをまとめて作成・起動する.

とりあえず以下が設定ファイルの例

docker-compose.yml
version: "3"
services:
  postgres:
    image: postgres:latest
    container_name: "my_postgres"
    restart: always
    environment:
      POSTGRES_USER: user_name
      POSTGRES_PASSWORD: password
      POSTGRES_DB: db_name
      LANG: ja_JP.UTF-8
      TZ: "Aisa/Tokyo"
    ports: 
      - "5432:5432"
    volumes: 
      - volume_postgres:/var/lib/postgresql/data

  pgadmin:
    image: dpage/pgadmin4
    container_name: "my_pgadmin4"
    restart: always
    ports: 
      - 81:80
      - 444:443
    environment:
      PGADMIN_DEFAULT_EMAIL: my_email
      PGADMIN_DEFAULT_PASSWORD: password
    volumes:
      - volume_pgadmin:/var/lib/pgadming
    depends_on:
      - postgres

volumes:
  volume_pg:
  volume_pgadmin:

上記ファイルがあるディレクトリで以下のコマンドを打つことでimageのDL,コンテナのbuild,起動を全てやってくれる.-dをつけないとデタッチせずにフォアグラウンドでコンテナが起動する.buildするときにキャッシュを使いたくない場合はdocker-compose build --no-cacheとするらしい.
別途psexecでコンテナの稼働状況を確認したり,コンテナに入ったりできる.

docker-compose up -d # imageのDL,コンテナのbuild,起動

docker-compose ps # docker-composeで起動したコンテナの稼働状況を確認
docker-compose exec service_name /bin/bash # コンテナ内に入る

学んだこと

  • YMLファイルで-がついてるのは配列の値,ついてないのは文字列として処理される.
  • Postgresで日本語を使えるようにしたい場合,LANGにUTF-8を指定しておけば良い模様(コンテナ内でpsqlを使ってログインするとロケール設定のエラーが出る... ただしテーブルにデータを日本語で保存できた)
  • トップレベルのvolumes以下で指定されたVolumeはパブリック扱いになって外部のコンテナからもアクセスできるらしい.Webアプリからアクセスするならここで指定する必要がある.
  • docker-compose exec service_name /bin/bash でコンテナにアクセスできる.service_nameはトップレベルのservices直下に書いた値(例ではpostgresかpgadmin).その下のcontainer_nameを書いてたから動かなくてはまった.

色々やってみてPostgresコンテナにはアクセスできて使えるようになった.pgAdminコンテナはまた後で使ってみたい.

ついでに確認したこと

  • railsで本番環境のDBコンソールに入るにはrails dbconsole --environment=production
  • railsで本番環境のDBテーブルにseedデータを入れるにはrails db:migrate RAILS_ENV=production
  • psqlでデータベースを切り替えるには\c database_name