Skip to content

Instantly share code, notes, and snippets.

@mapk0y
Created November 3, 2016 09:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mapk0y/4c94181a7f0d5318ba9b3c2fc495819d to your computer and use it in GitHub Desktop.
Save mapk0y/4c94181a7f0d5318ba9b3c2fc495819d to your computer and use it in GitHub Desktop.

docker の MySQL イメージに関する検証

やること

  • docker 公式の MySQL イメージで MYSQL_DATABASE を使った場合の挙動について調べる
    • docker の MySQL イメージには docker 製と MySQL 製があるので少し注意

参考資料

library/mysql - Docker Hub

MYSQL_DATABASE

This variable is optional and allows you to specify the name of a database to be created on image startup. If a user/password was supplied (see below) then that user will be granted superuser access (corresponding to GRANT ALL) to this database.

環境

[mapk0y@kona:~/tmp/docker/mysqlv]$ docker version
Client:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:        Wed Oct 26 21:39:14 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:        Wed Oct 26 21:39:14 2016
 OS/Arch:      linux/amd64

検証(composeのわな)

  • docker-compose の stop -> start ではコンテナの生成はされない

環境変数 MYSQL_DATABASE を設定せずに一度起動してそのまま停止

[mapk0y@kona:~/tmp/docker/mysql]$ cat docker-compose.yml 
version: '2'

services:
    mysql:
        image: mysql
        environment:
#           MYSQL_DATABASE: "newdb"
            MYSQL_ROOT_PASSWORD: "rootpass"
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose up -d
Creating network "mysql_default" with the default driver
Creating mysql_mysql_1
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose exec mysql mysql -prootpass -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose stop
Stopping mysql_mysql_1 ... done

環境変数の修正

[mapk0y@kona:~/tmp/docker/mysql]$ cp docker-compose{,.bak}.yml
[mapk0y@kona:~/tmp/docker/mysql]$ vi docker-compose.yml
[mapk0y@kona:~/tmp/docker/mysql]$ diff -U1 docker-compose.*
--- docker-compose.bak.yml      2016-11-03 18:25:20.480122926 +0900
+++ docker-compose.yml  2016-11-03 18:26:26.616120180 +0900
@@ -6,3 +6,3 @@
         environment:
-#           MYSQL_DATABASE: "newdb"
+            MYSQL_DATABASE: "newdb"
             MYSQL_ROOT_PASSWORD: "rootpass"

この状態で再度コンテナを起動(初回は creating~ となっていたのが、Recreating になっている)

[mapk0y@kona:~/tmp/docker/mysql]$ cat docker-compose.yml 
version: '2'

services:
    mysql:
        image: mysql
        environment:
            MYSQL_DATABASE: "newdb"
            MYSQL_ROOT_PASSWORD: "rootpass"
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose up -d
Recreating mysql_mysql_1
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose exec mysql mysql -prootpass -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose exec mysql env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=ac2bcd3a6b4d
MYSQL_ROOT_PASSWORD=rootpass
affinity:container==a39b0c9589a2396ffddd1cc994ae73078cc98048ca9a3d1b6cdce91a88c79861
MYSQL_DATABASE=newdb
GOSU_VERSION=1.7
MYSQL_MAJOR=5.7
MYSQL_VERSION=5.7.16-1debian8
HOME=/root

環境変数 MYSQL_DATABASE はきちんと渡されているが、newdb は作成されていない事がわかる。

検証(ボリュームのわな)

  • volume 有り無しでの挙動確認

ボリューム設定無しの場合

[mapk0y@kona:~/tmp/docker/mysql]$ cat docker-compose.yml 
version: '2'

services:
    mysql:
        image: mysql
        environment:
            MYSQL_DATABASE: "newdb"
            MYSQL_ROOT_PASSWORD: "rootpass"
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose up -d                                                                                                                                                                                   
Creating network "mysql_default" with the default driver
Creating mysql_mysql_1
[mapk0y@kona:~/tmp/docker/mysql]$ docker-compose exec mysql mysql -prootpass -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| newdb              |
| performance_schema |
| sys                |
+--------------------+

ボリューム設定ありでボリュームがない場合

  • volumes を設定する
  • volumes の対象はホストの ./data ディレクトリとする
[mapk0y@kona:~/tmp/docker/mysqlv]$ ls -l
total 4
-rw-r--r-- 1 mapk0y mapk0y 211 11月  3 18:05 docker-compose.yml
[mapk0y@kona:~/tmp/docker/mysqlv]$ cat docker-compose.yml 
version: '2'

services:
    mysqlv:
        image: mysql
        environment:
            MYSQL_DATABASE: "newdb"
            MYSQL_ROOT_PASSWORD: "rootpass"
        volumes:
            - ./data:/var/lib/mysql
[mapk0y@kona:~/tmp/docker/mysqlv]$ ls -l
total 4
-rw-r--r-- 1 mapk0y mapk0y 211 11月  3 18:05 docker-compose.yml
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose up -d
Creating network "mysqlv_default" with the default driver
Creating mysqlv_mysqlv_1
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose exec mysqlv mysql -prootpass -e 'show databases'                                                                                                                                    
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| newdb              |
| performance_schema |
| sys                |
+--------------------+
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose stop
Stopping mysqlv_mysqlv_1 ... done
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose down
Removing mysqlv_mysqlv_1 ... done
Removing network mysqlv_default

ボリューム設定ありでボリュームがすでにある場合

  • volumes を設定する
  • volumes の対象はホストの ./data ディレクトリとする
  • 1回目は MYSQL_DATABASE の設定無しで起動する
  • その後、一度停止及びコンテナの削除を実施して(データは消えない)MYSQL_DATABASE の設定を追加して起動する。

1回目のコンテナ作成(MySQL の初期設定)

[mapk0y@kona:~/tmp/docker/mysqlv]$ ls -l
total 4
-rw-r--r-- 1 mapk0y mapk0y 211 11月  3 18:05 docker-compose.yml
[mapk0y@kona:~/tmp/docker/mysqlv]$ cat docker-compose.yml 
version: '2'

services:
    mysqlv:
        image: mysql
        environment:
            MYSQL_ROOT_PASSWORD: "rootpass"
        volumes:
            - ./data:/var/lib/mysql
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose up -d
Creating network "mysqlv_default" with the default driver
Creating mysqlv_mysqlv_1
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose exec mysqlv mysql -prootpass -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose exec mysqlv mysql -prootpass -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

この時点では、当然 newdb は作成されていない

コンテナの停止、削除

[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose down
Stopping mysqlv_mysqlv_1 ... done
Removing mysqlv_mysqlv_1 ... done
Removing network mysqlv_default

ディレクトリの確認

[mapk0y@kona:~/tmp/docker/mysqlv]$ ls -l
total 8
drwxr-xr-x 5        999 docker     4096 11月  3 18:10 data/
-rw-r--r-- 1 mapk0y mapk0y  175 11月  3 18:09 docker-compose.yml

環境変数の修正

[mapk0y@kona:~/tmp/docker/mysqlv]$ cp docker-compose{,.bak}.yml
[mapk0y@kona:~/tmp/docker/mysqlv]$ vi docker-compose.yml 
[mapk0y@kona:~/tmp/docker/mysqlv]$ diff -U1 docker-compose.*
--- docker-compose.bak.yml      2016-11-03 18:12:23.424155184 +0900
+++ docker-compose.yml  2016-11-03 18:12:54.196153906 +0900
@@ -6,2 +6,3 @@
         environment:
+            MYSQL_DATABASE: "newdb"
             MYSQL_ROOT_PASSWORD: "rootpass"

コンテナの起動

[mapk0y@kona:~/tmp/docker/mysqlv]$ cat docker-compose.yml 
version: '2'

services:
    mysqlv:
        image: mysql
        environment:
            MYSQL_DATABASE: "newdb"
            MYSQL_ROOT_PASSWORD: "rootpass"
        volumes:
            - ./data:/var/lib/mysql
[mapk0y@kona:~/tmp/docker/mysqlv]$ ls -l
total 12
drwxr-xr-x 5        999 docker     4096 11月  3 18:10 data/
-rw-r--r-- 1 mapk0y mapk0y  175 11月  3 18:12 docker-compose.bak.yml
-rw-r--r-- 1 mapk0y mapk0y  211 11月  3 18:12 docker-compose.yml
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose up -d
Creating network "mysqlv_default" with the default driver
Creating mysqlv_mysqlv_1
[mapk0y@kona:~/tmp/docker/mysqlv]$ docker-compose exec mysqlv mysql -prootpass -e 'show databases'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

何が起こっているか

利用されている起動スクリプトでは、/var/lib/mysql/mysql/ があるかどうかで初期設定を行うかどうか判断しているため

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment