諸事情によりローカルに作ったmysqlにdockerコンテナから接続する必要があったので調べました。
2022/01/27追記
Docker desktop4.3.0において、記事で紹介しているdocker.for.win.localhost
とdocker.for.mac.localhost
両方ともは非推奨になりました。(なぜかwindowsのリリースノートもmac用のDNSが乗ってますが……)
- https://docs.docker.com/desktop/windows/release-notes/#docker-desktop-430
- https://docs.docker.com/desktop/mac/release-notes/#docker-desktop-430
今後は変わりに以下のDNSにアクセスすれば良いとのことなので、記事は適宜読み替えるようおねがいします。macもwindowsも一緒になって便利ですね。
ただし、あくまでこれは開発用に利用するDNS名であり、Docker for WindowsおよびDocker for Mac以外では動作しないとのことなのでご注意ください。
host.docker.internal
- https://docs.docker.com/desktop/mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host
- https://docs.docker.com/desktop/windows/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host
追記が遅れてすまねえ……。
環境
- Windows 10 Enterprise
- mysql 5.6.36
- Docker for windows
- Docker 17.09.0-ce
接続方法
dockerのバージョンが17.06以降であればこれでOKです。
mysql -h docker.for.win.localhost -u root
macの場合は(おそらく)こちらでいけるはずです。
mysql -h docker.for.mac.localhost -u root
dockerのバージョンが17.05以下の場合はこちらでは取り扱いません。軽く調べてそっとブラウザを閉じたくなりました。17.06で追加された機能が便利すぎます。
mysql側での準備についてですが、おそらく不要です。少なくとも自分の環境では、bind-addressが127.0.0.1のみに設定されている状態でも、問題なく接続することができました。
docker.for.win.localhost
さらっと使ったdocker.for.win.localhost
およびdocker.for.mac.localhost
とは何ぞや?というお話ですが、これはDockerのver17.06にて追加されたローカルホスト用DNS名だそうです。これをmysqlのホスト名に指定すれば、ローカルのmysqlを実行することができます。
他のサービスにおいても、同様にローカルを指すことができるはずです。
ですがどうやら、docker.for.win.localhost:80
のような感じで、ポートを指定している他のコンテナに続することにも使えるらしく、こちらの使い方の方が本命っぽいです。