docker 1.12 の衝撃
TRANSCRIPT
Docker 1.12 の衝撃M3 Tech Talk 2016/6/28 (@yteraoka)
Docker 1.11 の Swarm クラスタを Production 環境に投入すべく、ほぼほぼ構成が出来上がったところでそれはやって来ました
導入予定の構成
● 各サーバーが TLS 通信(サーバー、クライアントの証明書も確認)するための証明書発行機能
● Swarm Cluster を構成するための Swarm Manager ( 3 台 or 5 台)+ Key / Value ストア( Consul )
● コンテナを実行する Docker サーバーとその各サーバー上の Swarm Agent
● Docker の Overlay network を構成するための Key-Value ストア( Consul )(別々の Docker サーバー上のコンテナが同一ネットワークとして稼働)
● 外部からコンテナにアクセスするための Reverse Proxy / Load Balancer としての nginx または HAProxy
● nginx / HAProxy の設定をコンテナの起動停止に合わせて更新するための Consul-Template ( Consul も必要)
● Consul-Template のために Docker Engine のイベントを監視してサービスを登録、削除する Registrator
● 様々な用途で使われる Consul は単一のクラスタ
これがなんと!
たったのこれだけ
● 分散 Key-Value ストア● それを必要としていた Overlay Network● TLS 証明書発行機能● 外部からのアクセス用 Proxy
全部取り込まれました!!
# 1台目$ docker swarm init --listen-addr 192.168.99.121:2377
# 2台目$ docker swarm join --manager \ --listen-addr 192.168.99.122:2377 192.168.99.121:2377
# 3台目$ docker swarm join --manager \ --listen-addr 192.168.99.123:2377 192.168.99.121:2377
# 知らない node が join してくると困るので leader node で# accept する$ docker node accept <node name>
マネージャは3台あれば冗長構成となるので、 Docker の実行ノードがもっと欲しい場合は
$ docker swarm join \ --listen-addr 192.168.99.124:2377 192.168.99.121:2377
$ docker swarm join \ --listen-addr 192.168.99.125:2377 192.168.99.121:2377
と、どんどん追加ですれば OK減らすのも簡単、稼働中のコンテナは別 node に移してくれる
コマンドもたったのこれだけ
あの構成にどれだけの ...
が
これだけではない!
さらに、これまでの Swarm には無かった Service という概念、機能が加わりました
これは Kubernetes などに存在し、これまでの Swarm には無い辛いところでした
$ docker service create \ --replicas 3 -p 3000 \ --name myapp myapp:1.0
$ docker service create \ --replicas 3 -p 3000 \ --name myapp myapp:1.0
これで myapp コンテナを 3 つ起動してくれます、不意に落ちても 3 つをキープするように起動してくれます。実行していた Docker node が H/W 障害などで停止しても別の node で実行してくれます
https://docs.docker.com/engine/swarm/swarm-tutorial/deploy-service/
$ docker service scale myapp=5
$ docker service scale myapp=5
これでさらに 2 つのコンテナを追加して 5 つのコンテナの実行を維持してくれます
ピークを過ぎたら減らせば OK
https://docs.docker.com/engine/swarm/swarm-tutorial/scale-service/
Rolling update
$ docker service update \ --image myapp:1.1 myapp
$ docker service update \ --image myapp:1.1 myapp
これで myapp の実行イメージを順番に切り替えてくれます同時にいくつ切り替えるのか、間隔をどれだけ開けるのかは create / update で指定する --update-parallelism, --update-delay で調整可能
https://docs.docker.com/engine/swarm/swarm-tutorial/rolling-update/
Load Balancing
3000/tcpmyapp
3000/tcpmyapp
3000/tcpmyapp
32767/tcp 32767/tcp 32767/tcp
Docker外サービスのポートはどの node でも同じ番号に map され、各 node に振り分けられる(ラウンドロビン)
この図ではおまかせ設定のポート番号だが、任意の番号を指定可能
こういうわけなので Consul-Template と組み合わせた nginx / HAProxy というものは必須ではなくなりますConsul いなくなっちゃったし
bundle / stack
https://github.com/docker/docker/blob/master/experimental/docker-stacks-and-bundles.md
bundle は複数のコンテナをまとめた定義ファイル(アプリと Redis のセットなど)( Kubernetes の Pod とは違いそう)
stack は bundle から起動されたコンテナの集合
Docker 1.12正式リリースが待ち遠しい