📌

DevcontainerでメインコンテナからMySQLコンテナにアクセス

2022/06/26に公開

経緯

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