DockerコンテナからDockerホストMySQLに接続する
スッとMySQLに繋げなかったのでちょっと調べた。
- Dockerネットワークの種類
- Dockerコンテナ起動時にオプションでネットワークを指定する
- MySQLユーザーのHostを書き換える
- アプリケーションからのMySQL接続ホストを127.0.0.1にする
- Dockerコンテナ起動
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.cnf
にbind-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