読者です 読者をやめる 読者になる 読者になる

Docker上でDockerUIを試してみる

Dockerの仕組みはすばらしいですよね。簡単に仮想環境を作成できるのでポコポココンテナを作成しまくっちゃいます。ただ、これらの操作はすべてCUIから行わないといけないので、う〜んと思っていました。じゃあここらでお父さんNode.jsでGUI作っちゃうぞーって思って、Amazonで下記の書籍をポチりました。

Node.js面白いなぁと思いながらDocker調べてたら、DockerUIというソフトウェアがあるではありませんか。いったい俺のNode.jsの勉強はどこに向かえば良いのだと。。。とりあえずNode.jsはおいておいて、DockerUIを試してみることにします。

インストール

サイトに書いてあるように、Dockerのイメージが既にレポジトリに登録されているのでそれをそのまま利用させてもらいます。

$ sudo docker pull crosbymichael/dockerui

またDockerUIはDocker Remote APIを利用するので、それの準備もします。以下のように/etc/init/dockerd.confで-Hオプションと-api-enable-corsオプションを指定してdockerdを起動するように設定します。

description "Docker daemon"
start on filesystem or runlevel [2345]
stop on runlevel [!2345]
respawn
exec /usr/local/bin/docker -d -H="unix://var/run/docker.sock" -H="tcp://172.16.35.134:4243" -api-enable-cors

ファイルを書き換えたらdockerdを一度ストップした後スタートします。

$ sudo stop dockerd
$ sudo start dockerd

あとは、DockerUIのコンテナを起動します。上記の例だとIPは172.16.35.134なので、それを指定してコンテナを立ち上げます。

$ sudo docker run -d crosbymichael/dockerui /dockerui -e="http://172.16.35.134:4243"
68de52ae510f
$ sudo docker port 68de52ae510f 9000
49153

あとはブラウザでアクセスするだけ。 http://172.16.35.134:9000

ダッシュボード

f:id:cpw:20130829224742p:plain

今はDockerのページへのリンクが張られているだけですね。。。

コンテナ一覧

f:id:cpw:20130829224746p:plain

コンテナの一覧を見ることが出来ます。IDをクリックすると下記のページが表示されます。

f:id:cpw:20130829225258p:plain

このページではコンテナの停止や、開始、kill、コンテナの削除などが行えます。

イメージ一覧

f:id:cpw:20130829224921p:plain

イメージの一覧が見れ、削除などもできますね。さらにここで、イメージをビルドすることも出来るようです。

Docker情報

f:id:cpw:20130829224922p:plain

Dockerの情報が一覧できます。

Dockerでmroongaを動かす

docker

ほぼ前回と同様なのでDockerfileだけ記載しておきます。

From ubuntu:quantal

# my.cnfをコピー
ADD my.cnf /etc/mysql/my.cnf

# security updateを追加
RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ quantal-updates main restricted" >> /etc/apt/sources.list
RUN echo "deb-src http://us.archive.ubuntu.com/ubuntu/ quantal-updates main restricted" >> /etc/apt/sources.list
RUN apt-get update

# /sbin/initctlが原因でmysql-serverが起動しない問題へのhack
RUN dpkg-divert --local --rename --add /sbin/initctl
RUN ln -s /bin/true /sbin/initctl

# mysql-serverのインストール
RUN echo 'mysql-server-<version> mysql-server/root_password password password' | debconf-set-selections
RUN echo 'mysql-server-<version> mysql-server/root_password_again password password' | debconf-set-selections
RUN apt-get install -y -o Dpkg::Options::="--force-confold" mysql-common
RUN apt-get install -y mysql-server
RUN (/usr/bin/mysqld_safe &); sleep 3; echo "grant all privileges on *.* to root@'%';" | mysql -u root -ppassword


RUN echo "deb http://packages.groonga.org/ubuntu/ quantal universe" > /etc/apt/sources.list.d/groonga.list
RUN echo "deb-src http://packages.groonga.org/ubuntu/ quantal universe" >> /etc/apt/sources.list.d/groonga.list

RUN apt-get update; apt-get -y --allow-unauthenticated install groonga-keyring
RUN apt-get update
RUN (/usr/bin/mysqld_safe &); sleep 3; apt-get -y install mysql-server-mroonga
RUN apt-get -y install groonga-tokenizer-mecab
RUN apt-get -y install groonga-normalizer-mysql

EXPOSE 3306

CMD ["/usr/bin/mysqld_safe"]

DockerでMySQLを動かす

docker

Dockerでデーモンを動かそうとするとinitctlがうまく動かないので、service start mysqlとか出来ないんです。だから直接mysqld_safeを起動するのですが、baseイメージからDockerfileでインストールすと、簡単にインストールできない。というのも、apt-get install mysql-serverしたときにいろいろオプションを対話的に入力しろといわれるので、Dockerfileで素直には出来ないんです。

いろいろ調べてみると、そういったパラメタをあらかじめ設定してインストールする方法があって、debconf-set-selectionsというコマンドがそれに相当するみたいです。もっと簡単にできる方法を id:nkwhr さんに教えてもらいました。DEBIAN_FRONTEND=noninteractiveと環境変数に設定すればいいみたいです。下記のスクリプトは修正済みです。また普通にapt-getすると設定ファイルがあるよとダイアログが表示されてしまうので、これも抑制したい。これにはdpkgに--force-confoldというオプションがあってこれを指定すると古いファイルをそのまま使うようにあらかじめ設定しておけます。また、apt-getにはdpkgに引数を渡すことが出来る仕組みがあったのでこれ経由で引数を渡します。

From ubuntu:quantal

# my.cnfをコピー。 Dockerfileのディレクトリにmy.cnfファイルをおいておく必要があります
ADD my.cnf /etc/mysql/my.cnf

# security updateを追加
RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ quantal-updates main restricted" >> /etc/apt/sources.list
RUN echo "deb-src http://us.archive.ubuntu.com/ubuntu/ quantal-updates main restricted" >> /etc/apt/sources.list
RUN apt-get update

# /sbin/initctlが原因でmysql-serverが起動しない問題へのhack
RUN dpkg-divert --local --rename --add /sbin/initctl
RUN ln -s /bin/true /sbin/initctl

# my.cnfは上書きしない
RUN apt-get install -y -o Dpkg::Options::="--force-confold" mysql-common
RUN DEBIAN_FRONTEND=noninteractive apt-get install -q -y mysql-server
# passwordなしでリモートからrootでログインできるようにする
RUN (/usr/bin/mysqld_safe &); sleep 3; echo "grant all privileges on *.* to root@'%';" | mysql -u root -ppassword

EXPOSE 3306

CMD ["/usr/bin/mysqld_safe"]

my.cnfは下記の通り

[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
key_buffer              = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8
myisam-recover         = BACKUP
query_cache_limit       = 1M
query_cache_size        = 16M
log_error = /var/log/mysql/error.log
expire_logs_days        = 10
max_binlog_size         = 100M

[mysqldump]
quick
quote-names
max_allowed_packet      = 16M
[mysql]

[isamchk]
key_buffer              = 16M

!includedir /etc/mysql/conf.d/

これでmysqlのイメージは作ることが出来ます。

sudo docker build -t="cpw/mysql" .

あとは以下のコマンドを実行してmysql-serverを実行できます。

$ sudo docker run -d cpw/mysql
3ec822a71a3a
$ sudo docker port 3ec822a71a3a 3306
49289
$ mysql -u root -h 172.16.35.134 -P 49289

データを永続化したい

上記の手順だけだとデータが永続化されません。Dockerでコンテナからホストのディレクトリをマウントすると組み合わせて設定をすると永続化することも可能です。下記のようにしてホストマシンのディレクトリをコンテナのディレクトリにマウントします。初めてマウントした状態だとDBは存在しない状態なので、一度コンテナからDBを作成します。

$ sudo run docker run -v /var/docker/mysql:/var/lib/mysql -i -t cpw/mysql /bin/bash
root@048a4c9afd4e:/# mysql_install_db 
root@048a4c9afd4e:/# mysqld_safe &
root@048a4c9afd4e:/# echo "grant all privileges on *.* to root@'%';" | mysql -u root 
root@048a4c9afd4e:/# exit
$ sudo docker run -v /var/docker/mysql:/var/lib/mysql -d cpw/mysql
$ sudo docker port ca9f3b7fc39b 3306
49292
$ mysql -u root -h 172.16.35.134 -P 49292

時間のかかるリダイレクト処理でプログレスバーを出す

linux

Dockerでmroongaを動かすことに成功しました。とりあえず、その記事はまた後ほど書きますが、今パフォーマンス計測のためにデータを投入中です。で、投入するデータが凄くでかいので普通にこんな感じにコマンドを実行すると思います。

mysql -u root -h 172.16.35.134 -P 49194 test2 < dumpForML.sql

でもこれって実行しているときどこまで進んでいるのかまったく分からなくて、動いてるのか動いていないのか分からなくなってしまいますよね。そういうときに使えるのが pv コマンド。パイプで転送した容量と全体の容量を見てるんでしょうねぇ。

pv dumpForML.sql | mysql -u root -h 172.16.35.134 -P 49194 test2
  50MB 0:00:07 [6.41MB/s] [==>                                                                                                       ]  3% ETA 0:03:21

かなり便利です。

Dockerでいらなくなったコンテナを一括削除する

docker

Dockerでいろいろ試しているといろんなパッケージを追加しまくったりして、いがいにすぐディスクが圧迫されていきます。ひとつひとつ削除しているのは結構つらいので、一括で削除したいときがあります。というかさっきそんな感じでした。

mroongaをDockerで動かしたくて、、、、いろいろapt-getを繰り返していたらディスクがいっぱいになっちゃいました。ということで、以下のコマンドを実行すると既に停止しているコンテナを一括で削除できます。

for id in $(docker ps -a | grep Exit | cut -d " " -f 1); do docker rm $id; done

Dockerでコンテナからホストのディレクトリをマウントする

docker

Dockerで作る仮想環境のことをコンテナというんですね。知りませんでした。恥ずかしい。

さてDockerでpersistentボリュームを使いたくて調べていました。とりあえず前回の記事で再利用可能なボリュームを定義できるようになったんですけど、このオプションが -v でした。そして、今回やりたいことはホストのディレクトリをマウントですけど、実はこれも -v オプションなんです。なんじゃそりゃ!

docker0.4.8の頃までは-bで指定していたみたいですが、どうも -b と -v まマージされたようで、同じオプションなのに違うことをやっているようです。しかもさらに混乱したのはDockerfileでVOLUMEコマンドがあるので、もちろんコマンドラインの-vと同じように指定できると思ったらこちらはバインドはできないようです。

違いは -v の引数に<container dir>とするか<host dir>:<container dir>とするかの違いのようです。ということで現状では下記のようにコマンドラインで指定すればホストのディレクトリをマウントできます。

$ sudo mkdir /host_dir # ホストにもディレクトリがないと
$ sudo echo "OK?" > /host_dir/msg # 確認用にファイルをおいておく
$ sudo docker run -v /host_dir:/container_dir base /bin/bash -c "cat /container_dir/msg"
OK?

Dockerで再利用可能なボリュームを定義する

docker

Dockerはまだできたばかりなので、情報が少ないですね。。。再利用可能なボリュームを作りたかったんですけど、なかなか情報を見つけられず。まぁ灯台下暗しだったんですがはまりました。普通にdocker runと実行したときに表示されるヘルプに書かれてた。英語が読めてないなぁ。。。

再利用可能なボリュームを作成するには以下のコマンドを使って仮想環境を起動します。

$ sudo docker run -v /persistent base /bin/bash -c "echo persistent area > /persistent/msg"

-vオプション指定することで上の例で言うと/persistent ディレクトリをマウントします。作成された仮想環境をinspectしてみると

$ sudo docker ps -n=1
ID                  IMAGE               COMMAND                CREATED              STATUS              PORTS
5ebd0478c048        base:latest         /bin/bash -c echo pe   About a minute ago   Exit 0    
$ sudo docker inspect 5ebd0478c048                                                                                                          
[{
    "ID": "5ebd0478c0481688d5ff1554b7004c2357261f78edbd8eb4ff0929b817adecb8",
    "Created": "2013-08-16T06:53:24.786798288-07:00",
    "Path": "/bin/bash",
    "Args": [
        "-c",
        "echo persistent area \u003e /persistent/msg"
    ],
    "Config": {
        "Hostname": "5ebd0478c048",
        "User": "",
        "Memory": 0,
        "MemorySwap": 0,
        "CpuShares": 0,
        "AttachStdin": false,
        "AttachStdout": true,
        "AttachStderr": true,
        "PortSpecs": null,
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": null,
        "Cmd": [
            "/bin/bash",
            "-c",
            "echo persistent area \u003e /persistent/msg"
        ],
        "Dns": null,
        "Image": "base",
        "Volumes": {
            "/persistent": {}
        },
        "VolumesFrom": "",
        "Entrypoint": [],
        "NetworkDisabled": false
    },
    "State": {
        "Running": false,
        "Pid": 0,
        "ExitCode": 0,
        "StartedAt": "2013-08-16T06:53:24.797292061-07:00",
        "Ghost": false
    },
    "Image": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc",
    "NetworkSettings": {
        "IPAddress": "",
        "IPPrefixLen": 0,
        "Gateway": "",
        "Bridge": "",
        "PortMapping": null
    },
    "SysInitPath": "/usr/local/bin/docker",
    "ResolvConfPath": "/var/lib/docker/containers/5ebd0478c0481688d5ff1554b7004c2357261f78edbd8eb4ff0929b817adecb8/resolv.conf",
    "Volumes": {
        "/persistent": "/var/lib/docker/volumes/50a7719c1e7a35a3e1bd3fd7cac0d96fbca7e9824a0d7891a6fff5767fb1f6ab/layer"
    },
    "VolumesRW": {
        "/persistent": true
    }
}]

/var/lib/docker/volumesの下にボリュームが作られていることが分かります。 これを再利用するには以下のコマンドをたたきます。

$ sudo docker run -volumes-from 5ebd0478c048 base /bin/bash -c "cat /persistent/msg"
persistent area

-volumes-from でコンテナを指定することで指定したコンテナのボリュームを参照することが出来ます。まだ動いている仮想環境のボリュームも参照できてしまうので、複数の仮想環境から同時にアクセスするのは気をつけた方が良いかもしれないですね。