MySQL
docker
docker-compose

dockerコンテナからローカルのMySQLを使う場合にすること

環境

Mac OS Sierra バージョン 10.12.6

MySQLはbrewでインストール Server version: 5.7.18 Homebrew

Docker

docker-compose.yml

このAPIコンテナからローカルのMySQLにつなぎたい

version: "3"
services:
  web:
    build:
      context: ./web
    container_name: web
    command: npm start
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
    volumes:
      - ./web:/home/web
  api:
    build:
      context: ./api
    container_name: api
    command: npm start
    ports:
      - "3010:3010"
    environment:
      - NODE_ENV=development

    volumes:
      - ./api:/home/api
  nginx:
    build:
      context: ./nginx
    container_name: nginx
    ports:
      - "8080:80"
      - "443:443"
    environment:
      - NODE_ENV=development

Macですること

Aliasをきる

sudo ifconfig lo0 alias 10.200.10.1/24

MySQLですること

外部からのアクセスを許可するため、bind-addressの設定をすること
外部からのアクセスができるユーザーを作成すること

  • my.cnf
bind-address = 10.200.10.1
  • my.cnfの罠にはまらないように

どのファイルを読み込んでいるかをみる。

$ mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf

/etc/my.cnfから、順に読み込まれていくが上書きされてしまうので、最優先が ~/.my.cnfだったりする。
/etc/my.cnfに書いていた設定が、/usr/local/etc/my.cnfの設定でうわが枯れてしまってハマりました。

  • MySQL自動起動設定を一度止めておいた方がいいかも

落としたのに、蘇っている。。。とかある

 brew services stop mysql
  • 外部からアクセスできるユーザーを作成すること
GRANT ALL ON *.* TO user@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

APIですること

hostとユーザー名を上記で設定したのにすること

module.exports = {

  development: {
    client: 'mysql',
    connection: {
      host : '10.200.10.1',
      database: 'test_db',
      user:     'user',
      password: 'password'
    },
    pool: {
      min: 2,
      max: 5
    },
    migrations: {
      tableName: 'knex_migrations'
    }
  },

余談

bind-address=0.0.0.0でもいけるかも
自分の環境ではmy.cnfにその設定を入れると起動しなかったので、上記のようにしています。

要は、MySQLが外部(コンテナ)からの接続を受け入れるようにしておくことがキモです。