Less is Best

rubyが好き。技術の話とスタートアップに興味があります。

Mysqlを提供するDockerコンテナを生成する

MySQLをサービスとして提供するコンテナを作成してみました。データの永続化までやりたかったのですが上手く行かず。いい方法あれば教えてくださいorz

ソースはここ

https://github.com/yss44/docker_mysqld

Dockerfileのレシピはこちら

# DOCKER-MYSQLD
#
# VERSION       1

FROM centos

MAINTAINER yoshiso

RUN yum -y update

#Dev tools for all Docker
RUN yum -y install git vim
RUN yum -y install passwd openssh openssh-server openssh-clients sudo

########################################## sshd ##############################################

# create user
RUN useradd yoshiso
RUN passwd -f -u yoshiso
RUN mkdir -p /home/yoshiso/.ssh;chown yoshiso /home/yoshiso/.ssh; chmod 700 /home/yoshiso/.ssh
ADD sshd/authorized_keys /home/yoshiso/.ssh/authorized_keys
RUN chown yoshiso /home/yoshiso/.ssh/authorized_keys;chmod 600 /home/yoshiso/.ssh/authorized_keys
# setup sudoers
RUN echo "yoshiso ALL=(ALL) ALL" >> /etc/sudoers.d/yoshiso

# setup sshd
ADD sshd/sshd_config /etc/ssh/sshd_config
RUN /etc/init.d/sshd start;/etc/init.d/sshd stop

#######################################  Supervisord  ########################################

RUN wget http://peak.telecommunity.com/dist/ez_setup.py;python ez_setup.py;easy_install distribute;
RUN wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py;python get-pip.py;
RUN pip install supervisor

ADD supervisor/supervisord.conf /etc/supervisord.conf

#######################################  Mysql  ########################################

RUN yum -y install mysql-server mysql mysql-devel

ADD mysql/my.cnf /etc/my.cnf
VOLUME ["/var/lib/mysql"]        # mysqlによる書き込みを永続化

RUN touch /etc/sysconfig/network #This file is needed in /etc/init.d/mysqld

ADD mysql/start.sh /start.sh
RUN chmod 700 start.sh

###################################### Docker config #########################################


# expose for sshd,mysqld

EXPOSE 2222 3306

CMD ["/usr/bin/supervisord"]```

    RUN touch /etc/sysconfig/network
これは、mysqlを動かすためにファイルが必要だったため追加しています。

    ADD mysql/secure_installation.sh secure_installation.sh
    RUN chmod 700 secure_installation.sh
    RUN ./secure_installation.sh

ここは、`mysql_secure_installation`がインタラクティブに入力しなければいけないので、その代替を行なっています。

secure_installation.sh

!/bin/bash

/etc/init.d/mysqld start; mysqladmin -u root password "password" mysql -u root -ppassword -e "DELETE FROM mysql.user WHERE User='';" mysql -u root -ppassword -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1');" mysql -u root -ppassword -e "DROP DATABASE test;" mysql -u root -ppassword -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';" mysql -u root -ppassword -e "FLUSH PRIVILEGES;" service mysqld stop

mysqlの設定部分については以下の記事を参考にさせて頂きました。

[さくらVPS/Cent OS 6.3 MySQL 5.5導入[Railsサーバへの道]](http://morizyun.github.io/blog/mysql-setup-sakura-vps-centos63/)

[Dotinstall#16 MySQLの設定をしよう](http://dotinstall.com/lessons/basic_sakura_vps/8016)

mysql_secure_installationの部分とか

[chefでmysql-5.6インストールしようとしたら苦労した話](http://blog.youyo.info/blog/2013/07/11/chef-mysql56/)

あとは、supervisorに起動スクリプトを入力しておくだけ。

````:supervisord.conf
[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

[program:mysql]
command=/start.sh

start.sh

#!/bin/bash

MYSQL_ADMIN="/usr/bin/mysqladmin"
INITDB="/usr/bin/mysql_install_db"

DATADIR="/var/lib/mysql/mysql"


if ! mysql -u root -ppassword -e 'show databases'>/dev/null;then
    echo "Initializing MySQL Database at $DATADIR"
    chown -R mysql $DATADIR
    $INITDB

    echo "Bootstraping MySQL Server..."
    /etc/init.d/mysqld start &
    MYSQL_PID=$!
    wait $MYSQL_PID

    # mysql_secure_installation
    $MYSQL_ADMIN -u root password "password"
    mysql -u root -ppassword -e "DELETE FROM mysql.user WHERE User='';"
    mysql -u root -ppassword -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1');"
    mysql -u root -ppassword -e "DROP DATABASE test;"
    mysql -u root -ppassword -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';"
    mysql -u root -ppassword -e "FLUSH PRIVILEGES;"

    echo "Finish Bootstraping MySQL Server"
else
    echo "Starting Mysql Server"
    /etc/init.d/mysqld start
fi

このレシピをもとにビルド

vagrant@precise64:/vagrant/docker_mysqld$ docker build -t yoshiso/mysqld .

実際に起動してみます。

vagrant@precise64:/vagrant/docker_mysqld$ docker run -d -p 3306 -p 2222 yoshiso/mysqld
1aed0c75e79e4c75c21db9972900c7b8274a7b5060773cf71ec823c56eb63f5a

これで、上手く起動されたはずです。少し確認をしてみましょう。起動されたコンテナに入って、外部からアクセスするためのmysqlユーザーを作成して、ホスト側からコンテナのmysqlを使ってみようと思います。

vagrant@precise64:/vagrant/docker_mysqld$ docker inspect -format="{{ .NetworkSettings.IPAddress }}" 1aed0
172.17.0.56
vagrant@precise64:/vagrant/docker_mysqld$ ssh -p 2222 -i sshd/id_docker_ssh.dev yoshiso@172.17.0.56
[yoshiso@1aed0c75e79e ~]$ mysql -u root -p
mysql> create database sample;
mysql> grant all privileges on sample.* to testuser@'172.17.%.%' identified by 'password';
mysql> exit;
Bye
[yoshiso@1aed0c75e79e ~]$ exit

準備完了。ホストからアクセスしてみます

vagrant@precise64:/vagrant/docker_mysqld$ mysql -h 172.17.0.56 -u testuser -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.

うん、うまくアクセス出来ましたね。

このまま、-vでhost/dir:/var/lib/mysql:rwにマウントして,ホストのディレクトリにデータの永続化を試みましたが失敗。どうやら、マウントしたディレクトリの所有者を変更出来ないようで。。。mysqlパーミッションがしっかりしていないと書き込み出来ないようです。

MySQL Daemon failed to start.
Starting mysqld:                                           [FAILED]

こことか原因の1つかも https://github.com/dotcloud/docker/issues/2702

別の方法を思案していると、ある記事を発見

[Persistent volumes with Docker – Container as Volume pattern](http://www.tech-d.net/2013/12/16/persistent-volumes-with-docker-container-as-volume-pattern/)

ということで、Volumeオンリーのmysql用データコンテナを生成して、そのコンテナのvolumeを継承するようなパターンをお勧めするよ!といっていました。しかし、これだとコンテナを削除してしまった際にVolumeも消えてしまうのでは…?と予想してみます。

マウントしたvolumeの権限を操作可能なのか?それとも別の方法で永続化した方が良いのか?やっているような記事も見掛けますが、何が違うんだろうか。CentOSだと出来ないのでしょうか?

参考 http://cpw.hatenadiary.jp/entry/2013/08/20/220306

スマートにデータベースコンテナのデータの永続化を行なう手法を確立した方は是非教えてください。。。