[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
OpenStack は色々な仮想化基盤をサポートしている。2013年2月リリースの Havana からは Docker をもサポートするようになった。
私が実際に Docker を用いたコンピュートノードを作成し、 Docker イメージを元にインスタンスを作るに際してとった手順や困ったことなどを書き残しておく。
基本的には Docker - OpenStack の手順に従う。
# usermod -aG docker nova$ pip install -e git+https://github.com/stackforge/nova-docker#egg=novadocker$ cd src/novadocker$ git checkout stable/liberty (Liberty を使っている前提。適宜書きかえること!)$ python setup.py installcompute_driver = novadocker.virt.docker.DockerDriver とする。# nova-rootwrap command filters for setting up network in the docker driver
# This file should be owned by (and only-writeable by) the root user
[Filters]
# nova/virt/docker/driver.py: 'ln', '-sf', '/var/run/netns/.*'
ln: CommandFilter, /bin/ln, root# service nova-compute restartcontainer_formats = ami,ari,aki,bare,ovf,docker# service nova-scheduler restart# service glance-api restart$ docker pull cirros$ docker save cirros | \
glance image-create --visibilitty public --container-format docker --disk-format raw --name cirroshypervisor_type を docker にする。hypervisor_type を docker にした理由がこれである。なお、非 Docker ノードとは KVM や QEMU 等、Docker でない仮想化基盤を使ったコンピュートノードである。
nova のモジュール nova-scheduler はインスタンス作成リクエストに従い、インスタンスを作成するのにふさわしいコンピュートノードを検索する。この際、 Liberty の nova-scheduler はイメージの種類をコンピュートノードの持つ supported_instances の情報と照らし合わせて確認する (nova-scheduler の filter である ImagePropertiesFilter がこの役割を担っている) 。
この際、コンピュートノードは Docker をサポートしている旨を発信しているが登録された Docker イメージは自らが Docker イメージであることを主張しない。その為、 ImagePropertiesFilter は Docker を扱えないノードをコンピュートノードの候補から除くことができない。
その結果、Docker をサポートしていない非 Docker ノードに Docker イメージをベースにしたインスタンスを立てようとする。そして、起動に失敗する。
ただし、次のリリースでは確認するプロパティを変更する可能性がある。よく確認すること。
コンピュートノードで Docker インスタンスの起動に失敗する。エラーログを確認すると nova.compute.manager AttributeError: 'dict' object has no attribute 'container_format' というメッセージが出ていた。
これは単純な話で、 novadocker のバージョンを最新にしてしまっていたためであった。Liberty を使っているのだから novadocker のバージョンも Liberty に揃えるべきであった。
スマートフォンから Drag & Drop をちゃんと使えるウェブアプリケーションをを作りたかったのだが、色々やってもうまくいかなかった。が、この jquery.pep.js だとうまくいったので紹介。
Copyright © Brian Gonzalez
Pep is licensed under the https://opensource.org/licenses/MIT
gihub リポジトリからコードを入手し、 src ディレクトリ内の jquery.pep.js を使う。
<div id="pep-js-try" style="width:20px;height:20px;background-color:red;"/> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" type="text/javascript"></script> <script src="lib/jquery.pep.js" type="text/javascript"></script> <script src="callPep.js" type="text/javascript"></script>
// callPep.js
$('#pep-js-try').pep();
内部の座標処理を調べた。どうも CSS の transform プロパティを使って実現しているようだ。そのため、例えば次のようにすると将棋のようなマス目にそってコマを動かすインタフェースのゲームを作るときに便利かもしれない。
function normalizePosition($pepedElement) {
var blockSize = 32; // 例えば 1辺 30px+border 1px のマス目
$pepedElement.pep({
// stop を使うとドロップした際に発生するイベントを設定できる。
// 他にもプロパティがあるので詳細は https://github.com/briangonzalez/jquery.pep.js#usage
stop: function(event, object) {
var $elem = this.$el; // this.$el にドラッグアンドドロップ対象のオブジェクトが格納されている
var position = $elem.position(); // 親要素からの相対位置取得
// 何番目のマスにいるのか計算
var coordinateX = Math.floor((position.left + (blockSize / 2)) / blockSize);
var coordinateY = Math.floor((position.top + (blockSize / 2)) / blockSize);
var normalizedX = (coordinateX * blockSize) - Number($elem.css("left").replace("px", ""));
var normalizedY = (coordinateY * blockSize) - Number($elem.css("top").replace("px", ""));
$elem.css("transform", "matrix(1, 0, 0, 1," + normalizedX + "," + normalizedY +")");
}
});
}
こんな感じのコードを実際に過去に作ったアプリケーションで使っている。
http://sy17.sakura.ne.jp/shunshun/tofChatProto.html
jQuery プラグインの notify.js が何かに使えそうなのでメモがてら紹介。開発者ツールを使えば書いてある JavaScript はすぐに試せるようにしてある。
Copyright © Jaime Pillora <dev@jpillora.com> Released under the MIT license https://opensource.org/licenses/MIT
Notify.js は jQuery のプラグイン。ポップアップで警告や指示などを出すことができる。
<input type="button" id="notify-js-try"/> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" type="text/javascript"></script> <script src="lib/notify.min.js" type="text/javascript"></script> <script src="callNotify.js" type="text/javascript"></script>
// callNotify.js
// jQuery オブジェクトに notify 関数が追加されるので以下のように書ける
$.notify("このように書くと画面右上にポップアップが出る");
$("#notify-js-try").click(function(e){
$("#notify-js-try").notify("#notify-js-try に吹き出しの形でポップアップが出る");
});
デフォルトだと赤いもの (エラー) が出るが、第二引数でコントロールできる。
$.notify("緑","success");
$.notify("青","info");
$.notify("黄","warn");
$.notify("赤","error"); // デフォルトはこれ
第二引数に文字列ではなく連想配列を与えることで様々な設定ができる。
$.notify("色々カスタマイズされている",{
className: "success", // 上記のポップアップの種類
position: "right top", // left, center, right 及び top, middle, bottom。両方書かなくてもいい
autoHide: true, // 自動で消えるか否か
clickToHide: true, // ポップアップをクリックしただけで消えるか否か
autoHideDelay: 3000, // 自動で消えるのにかかる時間。ミリ秒で入れる。デフォルトは5秒。これだと3秒
arrowShow: false, // ポップアップが吹き出しになるか否か。デフォルトは true。
arrowSize: 5, // ポップアップが吹き出しな場合の矢印のサイズ。px 単位
showAnimation: 'slideDown', // ポップアップが出てくるときのアニメーション。faceIn とかでも。
showDuration: 400, // ポップアップが出てくるときのアニメーションにかかる時間
hideAnimation: 'slideUp', // ポップアップが出てくるときのアニメーション。
hideDuration: 200, // ポップアップが消えるときのアニメーションにかかる時間
gap: 2 // ポップアップ元になる要素とポップアップの距離。 px 単位
});
次のようにすると第二引数で指定しなくてもポップアップの種類を指定できる
$.notify.defaults({className:"info"});
$.notify("これは info (青) で出る");
さらにスタイルを拡張したりできるが、それはまた今度書く。