PostgreSQLのお試し環境を作りたいと思い、PostgreSQLサーバ+pgwebサーバ+webサーバの最低限の構成を構築しました。
構築手順を備忘録として残しておきます。
環境は以下です。
- Ubuntu 20.04.1 LTS
- Docker: 19.03.13
- Docker Compose: 1.27.4
- pgweb: latest (2020/10/28 執筆時点では、0.11.7が最新)
- postgres: latest (2020/10/28 執筆時点では、13.0が最新)
目次
サーバ構成
Ubuntsuサーバ(ホスト側)の上にwebコンテナ、pgwebコンテナ、pgコンテナを立ち上げることでWebサーバ + pgwebサーバ + PostgreSQLサーバの最低限の構成を構築しました。
ディレクトリ構成は以下を想定します。
pgtest/
|-- .env
|-- dbdata
|-- docker-compose.yml
`-- ssl_certs
Ubuntuサーバ(ホスト側)の環境を構築する
ホスト側はDockerが利用できて、インターネットからアクセスできればどのようなものでも良いです。
すでに構築しているものがあるのなら、この章は読み飛ばしてください。
もし、構築をこれからするという方には、ConoHa VPSが手軽に利用できてオススメです。
ConoHa VPSなら、初期費用なしで一時間単位の課金となるため、ちょっと検証用にLinux環境が欲しいなと思ったら一時的に立ち上げて、すぐに解約するって形でも利用できます。
1時間あたり1.5円なので、24時間借りても36円、1ヶ月借りても880円と格安です(メモリ1GB、CPU2コア、SSD100GBのスタンダードモデルの場合)。
この章では、ConoHa VPS上にDocker環境を立ち上げる方法を紹介します。
Dockerを立ち上げるまでの工程としては以下の3STEPです。
STEP1. ConoHa VPSでUbuntuサーバを立ち上げる
STEP2. ConoHa VPSにドメインを設定する
STEP3. ConoHa VPSにDocker環境を構築する
STEP1. ConoHa VPSでUbuntuサーバを立ち上げる
ConoHa VPSでUbuntuサーバを立ち上げ、初期設定をします。
手順は以下のブログでまとめましたので、そちらを参考にしてください。
STEP2. ConoHa VPSにドメインを設定する
pgwebサーバにドメインでアクセスするために、ドメインを設定します。
手順は以下のブログでまとめましたので、そちらを参考にしてください。
STEP3. ConoHa VPSにDocker環境を構築する
ConoHa VPS上のUbuntuサーバにDockerをインストールします。
手順は以下のブログでまとめましたので、そちらを参考にしてください。
webコンテナ、pgwebコンテナ、pgコンテナを立ち上げる
前置きが長くなってしまいましたが、Webサーバ + pgwebサーバ + PostgreSQLサーバの最低限の構成をコンテナで立ち上げます。
コンテナを立ち上げるために、
- pgtest/docker-compose.yml
- pgtest/.env
という2つのファイルを作成します。
pgtest/docker-compose.ymlを作成する
webコンテナ、pgwebコンテナ、pgコンテナは複数のコンテナを1ファイルで立ち上げることができるDocker-Composeを使って構築することにします。
Docker-Composeは「docker-compose.yml」というファイルでどのようなコンテナを立ち上げるかを設定できます。
【pgtest/docker-compose.yml】
version: '3.8'
services:
pg:
image: postgres:latest
container_name: pg
restart: always
volumes:
- ./dbdata:/var/lib/postgresql/data
expose:
- 5432
environment:
- POSTGRES_DB=${PG_DB_NAME}
- POSTGRES_USER=${PG_DB_USER}
- POSTGRES_PASSWORD=${PG_DB_PASSWORD}
- TZ=${PG_DB_TZ}
command: --port=5432
pgweb:
image: sosedoff/pgweb
container_name: pgweb
restart: always
expose:
- 8080
command: /usr/bin/pgweb --bind=pgweb --listen=8080
depends_on:
- pg
web:
image: steveltn/https-portal:1
container_name: web
restart: always
volumes:
- ./ssl_certs:/var/lib/https-portal
ports:
- '80:80'
- '443:443'
environment:
DOMAINS: >-
${SITE_DOMAIN} -> http://pgweb:8080/,
STAGE: 'staging'
depends_on:
- pgweb
pgtest/.envを作成する
環境依存性のある変数やセキュアな情報は.envに記載します。
Docker-Composeはdocker-compose.ymlと同じディレクトリ上にある.envファイルを自動で読み取るので、pgtest/ディレクトリ上に.envを作成します。
【pgtest/.env】
PG_DB_NAME=PGDB
PG_DB_USER=shiguregaki
PG_DB_PASSWORD=pg_pAssw0rd
PG_DB_TZ=asia/Tokyo
SITE_DOMAIN=shiguregaki-test.com
webコンテナ、pgwebコンテナ、pgコンテナを立ち上げる
/pgtest
ディレクトリに移動して、以下のコマンドを実行することで、コンテナを起動させます。
$ docker-compose up
以下のように表示されたらOKです。
[2020-10-27 22:50:53.471] web | [cont-init.d] 20-setup: exited 0.
[2020-10-27 22:50:53.478] web | [cont-init.d] 30-set-docker-gen-status: executing...
[2020-10-27 22:50:53.478] web | [cont-init.d] 30-set-docker-gen-status: exited 0.
[2020-10-27 22:50:53.484] web | [cont-init.d] done.
[2020-10-27 22:50:53.484] web | [services.d] starting services
[2020-10-27 22:50:53.495] web | [services.d] done.
これで、コンテナが問題なく起動することを確認出来きました。
ただし、このままでは、コンテナの出力がターミナルソフトとなっており、ターミナルソフトが操作できなくなってしまうので、コンテナをバックグランドで起動させることにします。
一度「Ctrl+c
」でコンテナを停止させます。
そして、再度以下のコマンドを実行します。
$ docker-compose up -d
docker-compose up
コマンドに-d
オプションをつけることで、バックグラウンドでコンテナを起動させることができます。
pgwebサーバにwebアクセスしてみる
pgwebサーバはhttps://{SITE_DOMAIN}で公開されているので、ブラウザでアクセスすると、pgwebのログインページが表示されるはずです。
ここで、以下のように設定すればログインできるはずです。
パラメータ | 設定値 |
---|---|
Host | pg |
Username | 環境変数${PG_DB_USER}で設定した値 |
Password | 環境変数${PG_DB_PASSWORD}で設定した値 |
Database | 環境変数${PG_DB_NAME}で設定した値 |
SSL Mode | disable |
注意: プライバシーエラーについて
「pgtest/docker-compose.yml」の「services.web.environment.STAGE
」がstaging
のため、証明書がオレオレ証明書になっており、プライバシーエラーが出ます。
pgwebサーバにアクセスすることができたら、「pgtest/docker-compose.yml」の「services.web.environment.STAGE
」をproduction
に変更しておきましょう。production
に変更することで、プライバシーエラーが出なくなります。
PostgreSQLサーバにログインしてみる
PostgreSQLサーバにログインすることで、DBやユーザを新規作成/削除するコマンドを実行したり、DBにログインして、テーブル制御をしたりすることができます。
PostgreSQLサーバにログインしてみる
PostgreSQLサーバはpgコンテナ上に立ち上がっているので、dockerコマンドでログインできます。
$ docker exec -it pg bash
特にユーザを指定していないため、rootでPostgreSQLサーバにログインします。
ログインすると以下のような表示に変わります。
root@240708905a63:/#
- 「@240708905a63」はコンテナIDで、任意の値となっているはずなので気にしなくて良いです。
PostgreSQL DBにログインしてみる
ログイン先のDB情報として、DB名は環境変数PG_DB_NAME
で、ログインするユーザは環境変数PG_DB_USER
で設定しているため、それを指定するために-U
オプションと-d
オプションを使用します。
> psql -U {$PG_DB_USERで指定したユーザ名} -d {$PG_DB_NAMEで指定したDB名}
補足: 「role "root" does not exist」エラーについて
ググるとpsqlコマンドについてまとめているサイトがたくさんありますが、ユーザがデフォルトの特権ユーザであるpostgresをベースに-U
オプションを省略したコマンドを紹介しているものが多いです。-U
オプションを省略するとPostgreSQLサーバにログインしているユーザでDBへ接続しようとします。pgコンテナでは、PostgreSQLサーバにrootでログインしているので、-U
オプションで$PG_DB_USERで設定したユーザを指定する必要があります。
もし-U
オプションを指定しないと、以下のようなエラーが出ます。
psql: error: could not connect to server: FATAL: role "root" does not exist
PostgreSQLのコマンドについて
PostgreSQLではSQL文の他にメタコマンドがあります。
また、PostgreSQLサーバ/クライアントアプリケーションのコマンドもあります。
- PostgreSQLで使用できるSQLコマンド一覧
- PostgreSQLで使用できるメタコマンド一覧
- PostgreSQLサーバアプリケーションのコマンド一覧
- PostgreSQLクライアントアプリケーションのコマンド一覧
データベースやユーザの参照やテーブルの操作をする場合は、SQL文やメタコマンドを利用し、データベースやユーザ自体を作成/削除したい場合は、サーバ/クライアントアプリケーションコマンドを利用するイメージです。
また、SQLコマンド、メタコマンドはPostgreSQL DBにログインして打てるコマンド(psqlでログイン)で、サーバ/クライアントアプリケーションコマンドはPostgreSQLサーバにログインして打てるコマンド(サーバにログイン)です。
まとめ
PostgreSQLサーバのお試し環境を作ることができました。
PostgreSQLは一般的なSQLコマンドの他にメタコマンドやPostgreSQLサーバ/クライアントアプリケーションのコマンドがあり、いろいろいじりたくなったので、このお試し環境を立ち上げました。
以下の記事で自分がPostgreSQLをいじってみていろいろ感じたことをまとめました。(個人的な備忘録ですが、、、)よろしければ、ご覧ください。
また、ConoHa上でDockerを導入したり、Webアプリを立ち上げたりした内容を以下の記事でまとめました。こちらもよろしければご覧になってください。
広告
Dockerをやるなら以下の書籍がオススメです。
Dockerとは何か?から複数のコンテナを管理することができるDocker Compose、Kubernetesまでまとめられています。
ConoHa VPS
は初期費用不要で月に数百円で利用できる仮想サーバのサービスです。以下のような方には非常にオススメのサービスとなっています!
- 勉強がてらLinuxの環境をちょっと触ってみたい
⇒管理者権限が実行可能なLinuxサーバ環境が構築可能です! - スモールスタートでサービスを提供して、うまくいったら規模をスケールアップしたい
⇒後からメモリサイズやCPU数などのスケールアップ/スケールダウン可能です! - AWSやGCPなどのクラウドサービスは高いので、もっと安くサーバ構築したい
⇒初期費用なし、月数百円(1時間単位も可)で利用可能です!
以上!
コメント