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