なんでDocker...
Dockerの中のirbでdRubyしてほかのコンテナと通信するのと、いつもの複数プロセス、複数マシンでやってるdRubyプログラミングとあまりにも違わない。(複数ユーザーにしてユーザー権限でいろんなサービス動かすとそっくり)
なんで今さらDocker...。
いい話にすり替える
さっきの実験ではゼロコンフィグ風だったけど、さらにゼロコンフィグ感高めたい。
Ringを思い出す
dRubyが標準添付になるどさくさに紛れて、rinda/ringというルックアップサービスを入れた。dRuby本を書くケース以外の利用例を見たことがないが、今日こそ使ってみたい。
Ringは主に二つのパートからなる。一つは、ネットワーク上のRindaのタプルスペースを公開する/探索する部分。もう一つは、タプルスペースをネームサーバーと見立て、そこにサービスとその場所(URI)を書く/自動的に消す部分である。たぶん。
RingはUDPを使ってブロードキャストを行うので、Ring用のタプルスペース(RingServer)は実質的に一つのマシンに一つだけ生成できる。PCが一台しかないと実験しにくいが、Dockerを使えばいい感じ!
タプルスペースを公開する
dRubyを動かして、タプルスペースを作って、RingServerを作れば公開完了。
$ docker run -it test/ruby irb(main):001:0> require 'rinda/tuplespace' irb(main):002:0> require 'rinda/ring' irb(main):003:0> DRb.start_service() irb(main):004:0> ts = Rinda::TupleSpace.new irb(main):005:0> Rinda::RingServer.new(ts)
じゃあもう一つ別のコンテナで検索する。
$ docker run -it test/ruby irb(main):001:0> require 'rinda/ring' irb(main):002:0> DRb.start_service irb(main):003:0> finger = Rinda::RingFinger.finger irb(main):004:0> ts = finger.primary => #<DRb::DRbObject:0x00005629551a1da8 @uri="druby://172.17.0.2:40721", @ref=47391105262580>
ひょー。見つかった。操作できるぞ。*1
irb(main):005:0> ts.write(['hello', 'world']) irb(main):006:0> ts.read(['hello', nil]) => ["hello", "world"]
最初のコンテナでもreadしてみる。
irb(main):006:0> ts.read([nil, nil]) => ["hello", "world"]
おー。ふつうだ!
コンテナ同士がお互いのIPアドレスやポート番号を別の人間などが教えあうことなくつながったんだけど、面白さわかる? *2
サービスをネームサーバーに登録する
今回はなし。使い方は以下のページにあるが、CFP的にそっちには行かない予定。
TODO
絵を描かないとなんの話かわかんないなー。
一度下書きをロストしたら、二度目はかなり投げやりな感じになってちょうどよかった。
なお、ロストしても投げやりにならないように、スライドスポンサー募集してます!
恒例!スライドに名前を入れる券 2018-2019
The right to put your sticker on my MacBookAir, again.