あるソフトウェアエンジニアの開発ブログ

ソフトウェアエンジニアリングを中心につらつらと書く

DockerコンテナからDockerホストMySQLに接続する

スッとMySQLに繋げなかったのでちょっと調べた。

Dockerネットワークの種類

Docker コンテナ・ネットワークの理解 — Docker-docs-ja 1.13.RC ドキュメント
ここを見ながら概要をつかむ。
Dockerインストール時、3つのネットワークが作成される。

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
d1dbc2003e68        bridge              bridge              local
c16c847feff0        host                host                local
27dc4c232fed        none                null                local

Dockerコンテナ起動時にオプションでネットワークを指定する

指定しないとデフォルトのbridgeが適用される。
それだと、Dockerコンテナに割り当てられたIPをMySQLがリッスンする必要があり、
my.cnfbind-address=<DockerコンテナIP>を指定する必要がある。
めんどくさいので、hostを指定する。
ホストネットワークは、DockerコンテナにDockerホストのネットワークスタックを共有する設定。

MySQLユーザーのHostを書き換える

Dockerコンテナからlocalhostへの接続は出来ないため、127.0.0.1でアクセスする。
よって、MySQLユーザーのHostを変更する。

rename user 'ytoida'@'localhost' to 'ytoida'@'127.0.0.1';

変更されたか確認する。

select User, Host from mysql.user;

アプリケーションからのMySQL接続ホストを127.0.0.1にする

config/config.exsを修正する。

config :stock_scraping_batch, StockScrapingBatch.Repo,
  adapter: Ecto.Adapters.MySQL,
  database: "stock_scraping",
  username: "ytoida",
  password: "",
  hostname: "127.0.0.1",
  port: 3306

Dockerコンテナ起動

ネットワークオプションをhostにして起動する。

docker run --rm --net="host" yukitoida/stock_scraping_batch

実際のDockerfileの中身は以下。

FROM elixir
MAINTAINER yuki-toida

RUN git clone https://github.com/yuki-toida/stock_scraping_batch.git root/stock_scraping_batch

WORKDIR /root/stock_scraping_batch

RUN mix local.hex --force && \
    mix local.rebar --force && \
    mix hex.info

RUN chmod +x run.sh

CMD ["./run.sh"]

run.shの中身は以下。

#!/bin/bash

# git pull
git pull origin master

# create executable shell script
mix deps.get
mix escript.build

# execute
./stock_scraping_batch

最後の./stock_scraping_batchバッチ処理を実行する。
正常にMySQLにアクセス出来るはず。