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