Docker+Packer で MySQLを動かしてみた
最近Dockerが話題なので会社でも利用し始めており、そしてPackerも勉強しようと思い調べてたらDockerで利用できるようだったので組み合わせてみた。
ついでに、MySQL 5.6をインストールしてみた
まずUbuntu Server 13.10にDockerとPackerを導入
# Docker Install sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\ > /etc/apt/sources.list.d/docker.list" sudo apt-get update sudo apt-get install lxc-docker # Packer Install wget https://dl.bintray.com/mitchellh/packer/0.5.2_linux_amd64.zip sudo unzip 0.5.2_linux_amd64.zip -d /usr/local/bin/
packer で利用するjson(mysql.json)はこちら
"builders"
には"type": "docker"
を指定して、Dockerイメージの元となるイメージと、
出力されるDockerイメージのファイル名を指定します。
ここをAWSの設定にしてやればMySQL5.6をAWSで起動するAMIを作れちゃうかな?修正必要ですけど。
"provisioners"
ではSSHのインストールをMySQLインストール用スクリプトを呼び出しています。
{ "builders": [{ "type": "docker", "image": "ubuntu:12.04", "export_path": "mysql.tar" }], "provisioners": [ { "type": "shell", "inline": [ "sleep 30", "apt-get update", "apt-get -y update", "apt-get install -y openssh-server", "mkdir /var/run/sshd /root/.ssh/" ] }, { "type": "file", "source": "ssh/id_rsa.pub", "destination": "/root/.ssh/authorized_keys" }, { "type": "shell", "inline": [ "chmod 600 /root/.ssh/authorized_keys" ] }, { "type": "shell", "script": "mysql-install.sh" } ] }
上記jsonの"provisioners"
の2つ目にSSH-Keyを指定していますが、
Jsonファイルが置いてある場所にDockerで利用するSSHkeyを配置しておりそれを利用しています。
MySQLインストール用のスクリプト(mysql-install.sh)
# Dockerで利用する ubuntu:12.04だと以下をしとかないとMySQLインストールに必要なパッケージがインストールと、 # MySQLのスクリプトが失敗する。 sudo locale-gen en_US.UTF-8 sudo apt-get install -y perl # MySQLのインストール wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.16-debian6.0-x86_64.deb sudo dpkg -i mysql-5.6.16-debian6.0-x86_64.deb sudo apt-get install -y libaio1 sudo cp -p /opt/mysql/server-5.6/support-files/mysql.server /etc/init.d/mysql # MySQLユーザの作成 sudo groupadd mysql sudo useradd -r -g mysql mysql # MySQLユーザに合わせて権限等の変更 sudo chown -R root:root /opt/mysql sudo chown -R mysql:mysql /opt/mysql/server-5.6 sudo install -o mysql -g mysql -d /data/mysql sudo -u mysql /opt/mysql/server-5.6/scripts/mysql_install_db --user=mysql --datadir=/data/mysql # 適当な設定ファイル用意 echo ' [mysqld] basedir = /opt/mysql/server-5.6 datadir = /data/mysql ' |sudo tee /etc/my.cnf # サービスに登録 # 登録してもDocker起動時には動かないけど… sudo update-rc.d mysql defaults sudo /etc/init.d/mysql start # 外部から接続するためのユーザ追加 /opt/mysql/server-5.6/bin/mysql -e "grant all privileges on *.* to root@'172.17.42.1' IDENTIFIED BY 'root';" # MySQLとSSHDを起動するスクリプトを用意 echo ' /etc/init.d/mysql start /usr/sbin/sshd -D ' |sudo tee /usr/local/bin/docker-start.sh
Packer の実行 ※Dockerを利用するのでsudo付きで…
sudo packer build mysql.json
Packerでのイメージ作成後Dockerにイメージを取り込みます
# " - ubuntu/mysql " で Dockerイメージ名の設定 cat mysqlimage.tar |sudo docker import - ubuntu/mysql # 取り込まれたか確認 sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu/mysql latest 3e60e3386690 3 days ago 1.729 GB ubuntu 12.04 9cd978db300e 3 weeks ago 204.4 MB
「REPOSITORY」に「ubuntu/mysql」が表示されているので取り込みは成功です。 続いて起動
# bash /usr/local/bin/docker-start.sh はDockerで実行するコマンドを指定 # 内容はMySQLの起動とSSHDの起動 # sudo docker run -p 22 -p 3386 ubuntu/mysql bash /usr/local/bin/docker-start.sh # 起動確認 sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 78f1af31b25c ubuntu/mysql:latest bash /usr/local/bin/ 3 days ago Up 3 days 0.0.0.0:49161->22/tcp, 0.0.0.0:49162->3306/tcp stoic_torvalds # Dockerのport番号取得 # docker inspect を利用し起動したDockerの情報を取得し jq で整形してPort番号を取り出す mysqlport=`sudo docker inspect \`sudo docker ps |grep ubuntu/mysql | cut -f 1 -d ' '\` | jq '.[].NetworkSettings.Ports["3306/tcp"][].HostPort | tonumber'` # MySQLへの接続 mysql -h 127.0.0.1 -P $mysqlport -u root -p
以上でPakcerを利用したMySQLのDockerイメージの作成手順の終了です。 一応後で直接設定変更したいだとか、ログを確認したいだとかのためにSSH残してあります。 ログだけが心配ならFluentd等を一緒に導入して外出しにしてもいいのかなと思います。
あ、最後にファイル構成
tree . |-- mysql-install.sh |-- mysql.json |-- packer_cache |-- ssh | |-- id_rsa | |-- id_rsa.pub 2 directories, 5 files