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