joppot

コピペで絶対動く。説明を妥協しない

ソフトウェア

docker for Macのdocker containerからホストのmysqlに接続する

投稿日:2017年5月8日 更新日:

Pocket

概要

みなさんこんにちはcandleです。
今回はMacのdocker containerからホストのmysqlにつなぐ方法を紹介します。

例えば、docker上でrailsやwordpressなどを動かす時mysqlにつなぐ事があります。
mysqlのdockerを用意しても良いのですが、データの保持や起動時間など開発中は必要じゃない事が多いです。
その時、Macに入れたmysqlにdockerからアクセスできれば便利ですよね。その方法を紹介します。


前提

docker for macを使っている

SPONSORED LINK


テスト用のmysqlデータベースを作成する

例によって、この記事もチュートリアル形式で紹介します。
もしも、重要なところだけを見たい場合はこの章と次の章を飛ばしてください。

まずはテスト用のデータベースを作成します。

Macのターミナルを開いて、以下のファイルを作成します。

touch ~/pokemondb.sql

以下の内容を記述します。

CREATE DATABASE `pokemondb` DEFAULT CHARACTER SET utf8;

USE `pokemondb`;

DROP TABLE IF EXISTS `pokemon`;
CREATE TABLE `pokemon` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `type` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO `pokemon` VALUES (1,'Pikachu','Electric'),(2,'Garchomp','Dragon Ground');

読み込みます。

mysql -u root -p < ~/pokemondb.sql

データベースの準備ができました。

テスト用のdocker containerを作成する

この記事ではnginxとphp-fpm containerを作り、ホストのmysqlにphpからアクセスします。

dockerの構成は下の記事をほぼコピペさせてもらいます。

http://takaya030.hatenablog.com/entry/20160504/1462330190

こういうファイル構成にします。

mysqltest/
├── docker-compose.yml
├── nginx
│ ├── Dockerfile
│ └── server.conf
└── php7
    ├── Dockerfile
    └── index.php

デスクトップやホームディレクトリなど適当なフォルダで下を実行します。

mkdir mysqltest && cd mysqltest
touch docker-compose.yml && mkdir nginx && mkdir php7
touch nginx/Dockerfile nginx/server.conf
touch php7/Dockerfile php7/index.php

それぞれのファイルには以下を記述していきます。

docker-compose.yml

nginx:
  build: ./nginx
  ports:
    - "80:80"
  links:
    - php7

php7:
  build: ./php7


nginx/Dockerfile

FROM nginx:latest
MAINTAINER candle

ADD server.conf /etc/nginx/conf.d/server.conf


nginx/server.conf

server {
  listen 80 default;
  server_name _;
  root /var/www/html;
  index index.php index.html index.htm;
  charset utf-8;

  access_log off;
  error_log off;

  location / {
    try_files $uri $uri/ /index.php$is_args$args;
  }
  location ~ \.php$ {
    fastcgi_pass mysqltest_php7_1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include       fastcgi_params;
  }
}


php7/Dockerfile

FROM php:7-fpm
MAINTAINER candle

RUN /usr/local/bin/docker-php-ext-install mysqli
COPY index.php /var/www/html/


php7/index.php

<?php

$mysqli = new mysqli('10.200.10.1', 'root', '', 'pokemondb');
if ($mysqli->connect_error) {
  echo $mysqli->connect_error;
  exit();
} else {
  $mysqli->set_charset("utf8");
}


$sql = "SELECT * FROM pokemon";
if ($result = $mysqli->query($sql)) {
  while ($row = $result->fetch_assoc()) {
    echo $row["name"] ."&nbsp;". $row["type"] . "<br>";
  }
  $result->close();
}

$mysqli->close();
?>

必要なファイルが準備できました。
少し補足します。
最後のindex.phpが重要です。
これがdockerの中からホストのmysqlにアクセスします。

$mysqli = new mysqli(‘10.200.10.1’, ‘root’, ”, ‘pokemondb’);

$mysqli = new mysqli(‘ホスト名’, ‘ユーザ名’, ‘パスワード’, ‘データベース名’);

になっています。
ホストのIPアドレスについては次の章で説明します。


新しいlocal ipアドレスを割り振る

上のindex.phpを見てもわかる通り、phpは10.200.10.1にアクセスしようとしています。
しかし、ホストのMacに割り振られているlo0 ipアドレスは127.0.0.1です。
問題はdockerからはホストのmysql 127.0.0.1:3306にアクセスできません。
詳しいことは僕もわからないのですが、なんかそういう設定らしいです。

そこでホストのMacに新しいlo0 IPアドレス10.200.10.1を加えます。

ちなみに、この10.200.10.1という番号はdockerの公式docsを参考にしました。
https://docs.docker.com/docker-for-mac/networking/

macのターミナルを立ち上げて以下を実行します。
lo0に 10.200.10.1を割り振ります。

sudo ifconfig lo0 alias 10.200.10.1/24

その後確認のために以下のコマンドを実行します。

ifconfig

このlo0にipを割り振るコマンドは毎回パソコンを立ち上げるたびにやらなくてはなりません。
自動的にipを割り振る方法はこちらの記事で紹介していますので参考にしてください。

https://joppot.info/2017/05/03/3908

準備が整いました。

dockerを起動する

docker-compose.ymlがあるフォルダで以下を実行します。

docker-compose up -d

終わったらイメージを確認します。

docker images

動いているコンテナを確認します。

docker ps

nginxは80ポートで動いています。
以下のURLにブラウザからアクセスします。

http://127.0.0.1

うまく、phpがmysqlにアクセスして、データが取れてきていますね。

まとめ

ネットワーク周りはやっぱり難しく、いろいろ試行錯誤しました。
lo0にipアドレスを割り振ればいけることが分かったので一安心です。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-ソフトウェア
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

スライド(パワースポイント)でクリエイティブコモンズが「表示」の写真の使い方

概要 みなさんこんにちは、最近サービスを作ろうとして忙しいcandleです。今回はクリエイティブコモンズの「表示」が指定されている画像のパワーポイントでの使い方です。 簡単にクリエイティブコモンズの説 …

Mac Yosemiteを購入したので、よく使うソフトウェアをインストールする

概要 みなさんこんにちはcandleです。 今回は私がよく使っているソフトウェアの紹介をします。主に「文章、ブログ、プログラミング、デザイン」に関わっている人に向けてになります。 Skitch1.0. …

Macのログインフックを利用して自動でlo0のipアドレスを割り振る

概要 みなさんこんにちはcandleです。 今回はMacのログインフックを使って、自動的にローカルのipアドレスを割り振ってみたいと思います。 Macでは自動的に127.0.0.1がローカルのIPアド …

wordpressの記事一覧で個々の記事のcontentテキストの文字数をプラグインで制限する

English 日本語 概要 みんさんこんにちはcandleです。 最近、wordpress案件でしばらくの間フリーのテーマを使う事があったのですが、 フリーのもの多くは記事一覧で個々の記事の内容を全 …

WP Offload S3 とawsプラグインでwordpressの画像をs3にアップロードする

概要 みなさんこんにちはcandleです。今回はwordpressの画像をs3にアップロードします。 私は最近まで別のs3にアップロードするプラグインを使っていたのですが、開発が2年前に止まってしまい …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

twitter

スポンサードリンク

アーカイブ