こんにちは。インサイトテクノロジーの松尾です!
Amazon Aurora や Amazon RDS、クラウド上の VM にインストールした PostgreSQL など、リモートで起動している DBMS に対して SQL を実行したいというケース、よくありますよね!?
そんなとき、みなさんは、どのように実行されておりますか?
VM にインストールしたデータベースであれば SSH で直接ログインしてコマンドクライアントを実行することもできますが、Aurora や RDS などのマネージドデータベースだとそれもできません。
他のマシンではなく、自分のマシンからアクセスしたいと考えた時、選択肢としては、おそらく以下の感じではないでしょうか。
- 自分のマシンに psql などをインストールする
- DBeaver などのツールを使う
DBeaver はとても便利で、実際、私のマシンにもインストールしてあります。が、どうしても、psql などでログインして SQL を実行したいケースがあります。そんなとき、自分のマシンにもし psql がインストールされていないと、新たに psql をインストールしなければならないのでしょうか?
できれば環境 ( 自分のマシン ) を汚したくないですよね。
本ブログでは、psql を直接インストールせずに使用する方法をご紹介します。
コマンド SQL クライアントは Docker から使う
はい、Docker を使いましょう。
今、このブログを読んでいる多くの方のマシンには Docker を使える環境が整っているはずです。Docker を使える環境であれば、psql を実行するのに、ローカルマシンへのインストールは必要ありません。
PostgreSQL へ接続するとき
PostgreSQL へ接続するときは以下のようになります。
docker run -it --rm postgres:12 psql --host=HOSTNAME --port=PORT --username=USERNAME --password --dbname=DATABASE
HOSTNAME
, PORT
, USERNAME
, DATABASE
は、それぞれ、ホスト名、ポート番号、ユーザー名、データベース名です。接続後にパスワードの入力が要求されます。
初回の実行時などは、イメージのダウンロード等が行われるため、以下のような感じで処理されます。パスワードを入力すると接続完了です。
$ docker run --rm -it postgres:12 psql --host=xxxxx.ap-northeast-1.rds.amazonaws.com --port=5432 --username=insight --password --dbname=insight
Unable to find image 'postgres:12' locally
12: Pulling from library/postgres
69692152171a: Pull complete
a31b993d5cc6: Pull complete
f65921886500: Pull complete
b9c1a94e4ca8: Pull complete
435dd99ceb68: Pull complete
d3ee8e88c67c: Pull complete
84b08674f942: Pull complete
7d358e850d3e: Pull complete
12e82e5f286d: Pull complete
305662ca7131: Pull complete
11cd3eebcbbd: Pull complete
9366f2135f89: Pull complete
23c7e66c8792: Pull complete
5c6e2c3cf76b: Pull complete
Digest: sha256:1ad9a00724bdd8d8da9f2d8a782021a8503eff908c9413b5b34f22d518088f26
Status: Downloaded newer image for postgres:12
Password:
psql (12.7 (Debian 12.7-1.pgdg100+1), server 12.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
insight=>
MySQL へ接続するとき
MySQL へ接続するときは以下のようになります。
docker run -it --rm mysql:8 mysql --host=HOSTNAME --port=PORT --user=USERNAME --password --database=DATABASE
HOSTNAME
, PORT
, USERNAME
, DATABASE
は、PostgreSQL の例と同じです。
MySQL への接続も PostgreSQLへの接続と同様に初回はイメージがダウンロードされ接続されます。
$ docker run --rm -it mysql:8 mysql --host=xxxxx.ap-northeast-1.rds.amazonaws.com --port=3306 --user=insight --password --database=insight
Unable to find image 'mysql:8' locally
8: Pulling from library/mysql
69692152171a: Already exists
1651b0be3df3: Pull complete
951da7386bc8: Pull complete
0f86c95aa242: Pull complete
37ba2d8bd4fe: Pull complete
6d278bb05e94: Pull complete
497efbd93a3e: Pull complete
f7fddf10c2c2: Pull complete
16415d159dfb: Pull complete
0e530ffc6b73: Pull complete
b0a4a1a77178: Pull complete
cd90f92aa9ef: Pull complete
Digest: sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969
Status: Downloaded newer image for mysql:8
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 14
Server version: 5.7.31 Source distribution
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql>
これで無事、ローカルマシンへソフトウェアを直接インストールせずに、PostgreSQL や MySQL へコマンドで接続することができました。
当然ですが、イメージは存在しています。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
postgres 12 b98f3fad83fd 4 days ago 314MB
mysql 8 c0cdc95609f1 7 days ago 556MB
が、PC に直接インストールせず、他に全く影響を与えず使用できるということで、めでたしめでたしとします。
おわりに
今回、PostgreSQL と MySQL のコマンドクライアントを Docker で使用する方法をご紹介しました。さて、Oracle Database でも同じことができるのでしょうか?
次回は Oracle Database のコマンドクライアント sqlplus を Docker 経由で使用する方法をご紹介します。
開発メンバー募集中デス。
インサイトテクノロジーにご興味を持たれたエンジニアの方、ぜひご連絡をお待ちしております♪
https://recruit.jobcan.jp/insight-tec/