2017/03/30(木)Docker で MySQL!

まえがき

久しぶりの記事が作業記録ですこんにちわ。

実はこのWebサーバはとある人に一角を貸しているのです。
そしてその人に「MySQLを入れてくれ」と言われたのです。

MySQL…なんかすごそうだけどよくわからないアレ…
でも例のコレクション整理プロジェクトでもDBをブンブンする必要あるし、ちょうどいいから入れてみよう。

仕事だとテスト担当でSQL触る機会なんかなくて実はMySQLを触るのは(研修以外で)初
そんなかんなで、MySQLを使えるようにした記録です。

方針

  • とりあえず今日はけもフレ最終話リピートしすぎて寝る時間なのでさくっと終らせます
  • いま持ってる技術を使います
  • とりあえずアクセスできるところまで。中身はどうせ他の人が入れるんだし…
  • スペックは保証しない

使うもの

  • Docker

3/29

user@ubuntu-docker:~$ docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
6d827a3ef358: Pull complete 
ed0929eb7dfe: Pull complete 
03f348dc3b9d: Pull complete 
fd337761ca76: Pull complete 
7e6cc16d464a: Pull complete 
ca3d380bc018: Pull complete 
3fe11378d5c0: Pull complete 
2b5dfd325645: Pull complete 
b54281d17fbe: Pull complete 
9a5cfd2d8db6: Pull complete 
a371b9bf0e19: Pull complete 
Digest: sha256:b39e58483853ecd03160f9bfdc8d3ecb0be9071fdbbe5484d6a115677b62c84e
Status: Downloaded newer image for mysql:latest
user@ubuntu-docker:~$ docker run --name mysqld -e MYSQL_ROOT_PASSWORD=ぱすわーど -d mysql
(コンテナID)
user@ubuntu-docker:~$ docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                            NAMES
(ID)        mysql                        "docker-entrypoint..."   19 seconds ago      Up 18 seconds       3306/tcp                         mysqld
(以下略)
終わり。

そんでもって接続用のクライアントコンテナと言うものを作って…アクセス出来たから立ってはいるんですが…
このDBがWeb鯖と同じ場所なら問題ないんですが、dockerで遊ぶようのUbuntu上(同じLAN、同じハイパーバイザ上だが)なんですね。
LAN内から接続できるようにします
user@ubuntu-docker:~$ docker run --link  mysqld:mysql -it --rm mysql bash
root@8fa973d43269:/# mysql -u root -p -h $MYSQL_PORT_3306_TCP_ADDR
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
無事接続できたらユーザを見る
mysql> select user,host from mysql.user;
+-----------+-----------+
| user      | host      |
+-----------+-----------+
| root      | %         |
| mysql.sys | localhost |
| root      | localhost |
+-----------+-----------+
3 rows in set (0.00 sec)

mysql>
||< 

ここにLAN環境からアクセスできるようにユーザを追加

>|?|
mysql> GRANT ALL PRIVILEGES ON *.* TO user@"192.168.1.%" IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> select user,host from mysql.user;
+-----------+-------------+
| user      | host        |
+-----------+-------------+
| root      | %           |
| user      | 192.168.1.% |
| mysql.sys | localhost   |
| root      | localhost   |
+-----------+-------------+
4 rows in set (0.00 sec)
これでできた…と思う。

それでMacから接続を試みる。
まずはホームブリューからクライアントをインストール
MBP:~ user$ brew install mysql --client-only
(中略)
🍺  /usr/local/Cellar/mysql/5.7.17: 321 files, 234.4MB
MBP:~ user$ mysql -h192.168.1.19 -u user -p
Enter password: 
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.19' (61)
あれれおかしいね

というところで寝る時間はとっくに過ぎているのでこの辺で一度ストップ。

4/2再開

ちょっと日が空いたけど再開する。

とりあえずdocker restartしてdocker psを見る
user@ubuntu-docker:~$ docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                            NAMES
4bef7b372a65        mysql                        "docker-entrypoint..."   3 days ago          Up 4 seconds        3306/tcp                         mysqld
b2bd2761985f        sameersbn/redmine:3.3.1-1    "/sbin/entrypoint...."   8 days ago          Up 3 days           443/tcp, 0.0.0.0:10080->80/tcp   redmine_redmine_1
edc388a32a9f        sameersbn/postgresql:9.5-4   "/sbin/entrypoint.sh"    8 days ago          Up 3 days           5432/tcp                         redmine_postgresql_1
ほかにもれっどまいんが立ち上がってたりします。
こちらを見ると分かるんですが、docker-composeで上げているれっどまいんはポートフォワードされているのがわかると思います
コレじゃないかな?

ということで以下を実行
user@ubuntu-docker:~$ docker stop mysqld 
mysqld
user@ubuntu-docker:~$ docker run --name mysqld2 -e MYSQL_ROOT_PASSWORD=ぱすわーど -p 33366:3306 -d mysql
1d7bbfa19087642db79e5f143110f62880deba280c2523160ce1b44e4df9ab20
user@ubuntu-docker:~$ docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                            NAMES
1d7bbfa19087        mysql                        "docker-entrypoint..."   10 seconds ago      Up 8 seconds        0.0.0.0:33366->3306/tcp          mysqld2
b2bd2761985f        sameersbn/redmine:3.3.1-1    "/sbin/entrypoint...."   8 days ago          Up 3 days           443/tcp, 0.0.0.0:10083->80/tcp   redmine_redmine_1
edc388a32a9f        sameersbn/postgresql:9.5-4   "/sbin/entrypoint.sh"    8 days ago          Up 3 days           5432/tcp       
こんな感じでどうだろうか。
そんでMacから接続してみる
MBP:~ user$ mysql -h192.168.1.19 -uroot -p -P33366
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
わーいできた
外から接続するときはちゃんとポートフォワードを設定してやらないといけないみたいですね。

まとめ

さくっと終らせますという方針はどこかへ行ってしまった。

とりあえず、今回の反省点として
  • 時間がないときに慌ててやらない
  • ポート設定は重要
  • そもそもdockerはいいけどハイパーバイザのメモリは大丈夫?
です。
だいいち、dockerのMySQLてこうやって使うものでは無いんだよなあ…
本来、他のコンテナから接続するものだよなぁ…大丈夫かしら

おわり

参考

Dockerの公式MySQLイメージの使い方を徹底的に解説するよ
(俺得)MySQLに、クライアントでリモート接続する時の設定
ホスト上にコンテナのポートを割り当て
OK キャンセル 確認 その他