Docker composeで立ち上げたコンテナからローカルホストのMySQLにアクセスした記録

今後書く予定の記事にEC2からWebARENA Indigoに乗り換えた話を書こうと思っています。そのときの話にEC2とのローカルIP周りの差異で困ったことを備忘録も兼ねて先出ししておきます。

環境

  • WebARENA Indigo

    • 2vCPU

    • 2GB メモリ

    • 40GB SSD

    • Ubuntu 22.04 LTS

用語のおことわり

ローカルホスト・ローカルマシンという言葉が出てきますが、Dockerコンテナに対してのVPSのUbuntuを指す言葉として使っています。vps上のdockerから、あなた自身のPCにアクセスするものではありません。

もともとの設定

version: '3.7'

services:
  ...

  web:
    build: ./go-server/
    ports:
      - 1323:1323
    volumes:
      - ./go-server/app:/app
    tty: true
    extra_hosts:
      - "machine_db:(サブネットでのIP)"

EC2で立ち上げていたときは、EC2コンテナのサブネット内でのIPをextra_hostsとして利用していました。しかし、Indigoのvpsにサブネットはありません。(同じことができるとは思うので、「サブネットという名前の付いた機能が無い」の方が正確です。)

一度グローバルIPアドレスを入れてみましたが、動きませんでした。

extra_hostsの設定

結論としては、docker0ネットワーク内でのローカルマシンのIPを使いました。
Dockerを入れたサーバーには、docker0というネットワークがあります。これは以下のコマンドで確認可能です。

$ ip a

このipをextra_hostsに登録すると、ローカルマシンにアクセスできます。

え…WSLにないんだけど…

そういう場合は、gateway.docker.internalを指定してください。WSLはDocker Desktop for Windowsのdockerを見ているため、linuxのくせにこのホストを使えるのだと思います。厳密な検証はしていませんが、少しでもお役に立てればと、今の自分の開発環境での成功例をお出しします。

mysqlの設定

これはアプリサーバーとDBサーバーを分割して運用する方はよくご存知だと思いますが、bind-addressをコメントアウトすればOKです。

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

まずファイルを開きます。(検索画面でここから見ている方、これはUbuntu用です。OSによって割と場所が変わるので環境に合わせて適宜検索してください。)

...
bind-address = 127.0.0.1
......
# bind-address = 127.0.0.1
...

そして、上記のようにコメントアウトします。3306ポートを外部に公開していないのでこれをしても第三者から入られないと思っています。

まとめ

最後に手順をまとめておこうと思います。

  1. docker0内のローカルマシンのIPをextra_hostsに登録する。

  2. mysqlのbind-addressをコメントアウトする。

やることは少ないです。しかし知らないと半日消えます。私は消えました。

この記事が気に入ったらサポートをしてみませんか?