Hateburo: kazeburo hatenablog

SRE / 運用系小姑 / Goを書くPerl Monger

普通のサーバでDocker ContainerをHot DeployしたかったのでProxy書いた

2018年も後半だけど、普通のサーバ上でコンテナをHot Deployしたいと思ってproxy書いた

github.com

任意のラベルがついたDocker containerのpublic portをdocker api経由で取得して、private portをlistenして、proxyを開始するものです。 ラベルがついたコンテナが複数個あると、必ず一番新しいものだけにproxyするようになってます。

これで、みんな大好きserver_starterと組み合わせると、Hot Deployができます。

使い方

コンテナを起動

$ KILL_OLD_DELAY=5 start_server -- docker run -P -l app=nginx nginx

public portが32774、private portが80となります

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
20ff30afc6a9        nginx               "nginx -g 'daemon of…"   7 seconds ago       Up 6 seconds        0.0.0.0:32774->80/tcp   practical_blackwell

この状態で motarei さんを起動

$ sudo ./motarei -l app=nginx
2018/10/09 17:28:50 Start listen 0.0.0.0:80

80番だったので、sudoが必要になりましたが、motareiが port 80をlisten開始しています。 この状態で、curl 127.0.0.1 すれば素敵なnginxのページがでます。

コンテナをアップデートしたくなったので server starter に対してHUPを送ります。

$ kill -HUP 33022

コンテナも入れ替わりました。

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
264bafb478ff        nginx               "nginx -g 'daemon of…"   53 seconds ago      Up 52 seconds       0.0.0.0:32775->80/tcp   agitated_dubinsky

motareiさんは、docker apiに1秒ごとにアクセスし、portの変更を検知して、proxy先を変更します。 古いコンテナ後も、curl 127.0.0.1 は成功するはずです。

もともと、gobetweenというproxyがdocker apiをみてproxy先を切り替える機能をもっていたのですが、新しいコンテナだけにリクエストを行うことができず、hot deployには使えなかったので新しく作った次第です。

github.com

ちなみに、motareiさんはあたま屋さんです