【Docker】別コンテナを立ち上げてAdminerをインストールしデータベースに接続する【メモ】

docker
ソースコードにAdminer入れたくないけどローカルでは使いたい、そんなときの対応






手っ取り早くAdminer

新しくジョインしたプロジェクトでAPIの設計が機能要求を満たしているか確認してほしいというリクエストをもらったのですけど、立ち上げ初期のプロジェクトでデータベースの定義書はあるもののER図はなく、触りたいならコンソールでという状況でした。出来ないの?と聞かれれば出来なくは無いですけど、正直、視覚的にデータベースを確認出来た方が生産性は上がります。


というわけでAdminerを入れたい。


でもソースコードにAdminerを入れて万が一本番環境へ上がってしまったらそれはそれで困ります。さすがにそんな提案はしたくない。どうしましょう?



ローカルだけで動かせば良いじゃん

はい、そうですね。

でもソースコードに含まれている docker-compose.yml に追加するのはそれもそれで気が引けます。万が一(略)。というわけわけで、リポジトリに上げない形で別コンテナを用意してそこからデータベースに接続しましょう。必要なモノは以下の通りです。

  • Adminerコンテナ
  • DBコンテナへのネットワーク設定



Adminerコンテナ

適当なフォルダを作って、中にこんな感じの docker-compose.yml を作成しましょう。


version: '3.8'

services:
 adminer:
   container_name: adminer
   hostname: adminer
   image: adminer:latest
   restart: always
   ports:
     - 18080:8080
   networks:
     - db-network

networks:
   db-network:
     name: db_default


あとはこれをBuildして起動すれば終わりです。一般的な環境では http://localhost:10800 でアクセス出来るようになります。



ポイント:ネットワークには名前を付けましょう

ネットワークに名前を付けなかった場合、docker-compose.yml ごとにネットワークが自動で生成されます。


$ docker network ls
NETWORK ID     NAME                              DRIVER    SCOPE
123456789012   adminer_default                      bridge    local
234567890123   bridge                            bridge    local
345678901234   host                              host      local
456789012345   db_default                        bridge    local


これだと同じネットワーク上にならないのでアクセス出来ません。必ず名前を付けましょう。

Adminerコンテナ用の docker-compose.yml にDB用コンテナのデフォルトネットワーク名を設定すれば大丈夫です。



余談:これを英語で提案しないと

今度のプロジェクトは外資系というわけでは無いんですけどメンバーに外国人が多いんですよ。PMなど要職の人間は日本語も英語もペラペラなんですけど、チームリーダーには英語のみ喋れる人もいて、しかもその人がインフラ担当。なのでこの提案を通したかったら英語でプレゼンしないといけないという……

一般論としてSEじゃないプログラマ寄りのエンジニアの人って「Adminer?初心者向けだろ」って言いそうだし(古いバージョンでは脆弱性もあるし今後もないとはいいきれない)、なおかつそれが外国人で議論に発展したらDeepLでも追いつかない気がしてちょっと気が引けてます。


まーーーー、本番環境に影響を与えるモノじゃないから好きにしていいよっていってもらえると思うんですけど。


ちょっと英語でのコミュニケーションも勉強しないとなあ。読むしか出来ないもんなあ。



追記

当初案ではソースコードに手を加えていたので気が引けていたのですけど、デフォルトネットワーク名を設定しさえすれば別に既存のファイルを触らなくてもローカルでAdminerが動かせることが解ったので、問題なくなりました。英語での提案自体はして、ちゃんと通じたみたいですけどね。ちなみにリアクションはもちろん聞き取れませんでした(笑)

技術者同士だから単語ベースでは解るんですけど、全体の正確な文意となると難しいんですよねー。MTGで英語聞き続けてたら解るようになるのかな。