📌
DevcontainerでメインコンテナからMySQLコンテナにアクセス
経緯
VSCodeのDevcontainer機能を使って開発しています。Devcontainerを実現するために最小限の構成は開発環境一式が入ったコンテナ1つですが、データ管理を適切に行うため、DBを専用のコンテナで稼働させることにしました。このような複数コンテナ構成は一般的なので特に躓くことなく環境構築できるかなと思ったところ、以外にもコケたのでメモを残しておきます。(単に自分がDockerの知識不足だっただけかもしれませんが)。以下、開発環境一式が入ったコンテナをメインコンテナ(main)と呼びます。メインコンテナからDBコンテナ(db)へアクセスします。
設定ファイル
./devcontainer/Dockerfile
メインコンテナを構築するためのDockerfileです。その内容は本件に関係ないので省略。
./devcontainer/docker-compose.yaml
version: '3.4'
services:
main:
build:
context: ../
dockerfile: .devcontainer/Dockerfile
volumes:
- ..:/workspace:cached
tty: true
db:
image: mysql:8.0
container_name: db
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: some_db
MYSQL_USER: someone
MYSQL_PASSWORD: password
ports:
- "3306:3306"
volumes:
- ../data/db:/var/lib/mysql
データ永続化のために、/var/lib/mysql
をホストコンピュータの../data/db
にマッピングしています。
./devcontainer/devcontainer.json
{
"name": "main",
"dockerComposeFile": "docker-compose.yaml",
"service": "main",
"workspaceFolder": "/workspace/",
// 以下、本件には関係ない設定が続く
.
.
.
}
mainコンテナからdbコンテナへ接続
mainコンテナにmysqlクライアントがインストール済みとし、接続コマンドは、
mysql -h db -u someone -ppassword some_db
ホスト名の指定で-h <コンテナ名>
とするのがポイントです。同じホスト上で稼働中だからと言って、-h 127.0.0.1
と書いては接続できませんでした。ただ、ホストコンピュータからは127.0.0.1
指定で接続できるので、この答えにたどり着くまでにハマっていました。
ちなみに、-h localhost
と書くのは別の意味で接続不可になります。localhost指定だと、MySQLサーバとの通信がTCPネットワークを介さない構成になるので、別コンテナ上で動くMySQLサーバと通信できません。もし-h localhost
とするなら、--protocol tcp
とする必要があります。
Discussion