endokのブログ

IT・プログラミングネタ

Dockerの公式MySQLイメージを使ってホストからアクセスするまで

Dockerわかってる人には単純な話かと思いますが、一部ハマったのでメモ。

やりたいこと

  • 公式MySQLイメージを使ってコンテナ起動する
  • ホスト側からmysqlコマンドでコンテナのmysqldに接続する。

mysql Repository | Docker Hub Registry - Repositories of Docker Images
こちらのイメージを利用する。

dockerはインストール済とする。

公式MySQLイメージをpullする

今回はバージョン5.5を利用。

$ docker pull mysql:5.5
$ docker ps
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
mysql                      5.5                 c8defdc7b8fa        6 days ago          214.7 MB

コンテナを起動する

MYSQL_ROOT_PASSWORDという環境変数でrootパスワードを設定する。
その他の環境変数は公式参照。

外部から接続するには、-p [ホスト側ポート]:[コンテナ側ポート]でポートを公開する必要があるとのこと。
今回はホストの13306でコンテナの3306ポートに接続する。

ここで問題発生。

最初、

$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d mysql:5.5 -p 13306:3306

としていたが、これだとすぐにコンテナがエラーで終了してしまった。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

ログを確認する。

$ docker logs mysql
...
150314 15:00:05 [ERROR] mysqld: unknown option '-p'
150314 15:00:05 [ERROR] Aborting

150314 15:00:05  InnoDB: Starting shutdown...
150314 15:00:06  InnoDB: Shutdown completed; log sequence number 1595675
150314 15:00:06 [Note] mysqld: Shutdown complete

mysqldに-pオプションが渡ってしまっている模様。
考えてみると当たり前だが、最後に-pオプションを指定していたのがまずかった。
-pオプションの場所を変更すると起動成功。

$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 13306:3306 mysql:5.5
$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                     NAMES
5289e9512b4e        mysql:5.5           "/entrypoint.sh mysq   47 seconds ago      Up 46 seconds       0.0.0.0:13306->3306/tcp   mysql

ホストから接続する

ホストからlocalhostの13306ポートに接続すればよい。
パスワードは上の例では"mysql"。

$ mysql -u root -p -h 127.0.0.1 -P 13306
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.42 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, 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>

無事接続成功。