Docker for Mac で Rancher を動かす

More than 1 year has passed since last update.

image

Rancher が Docker for Mac をサポートしていないらしいのですが、Virtualboxで別なDockerを無駄に立ち上げたくないし、なぜMacだと駄目なのか納得もできなかったので試してみました。:kissing:

動かすことができたら、そのRancherを使って簡単なサービスを構築してみたいと思います。

先ずは以下の記載。Docker for Mac はサポートされてないと明記されていますが、理由は書いてありません。。

image

see: Quick Start Guide - docs.rancher.com


Docker for Mac で Rancher を動かす


結論

結論から言うと動きました。これと言って問題は出ていません。

気を付ける所は、以下ぐらいでした。



  • rancher/server コンテナのMac側ボリュームマウントPATHを変更する

  • Rancherのホスト登録URLに 127.0.0.1 は使わない(Docker for Mac の原因かは未だ確かめてません)


環境


  • Mac: OS X EI Capitan (Version 10.11.6)

  • Docker for Mac: 1.12.6 (14937)

  • Rancher: v1.3.0


Rancherサーバーのインストールと設定

Quick Start Guide - docs.rancher.com を参考に進めていきます。


Rancherサーバーの起動

Rancher自身もコンテナとして動くので起動させます。

$ sudo docker run -d -p 8080:8080 rancher/server

※ 正式手順では、--restart=unless-stopped オプションをつけますが、Mac上で立ち上げて置く必要もないので省略しています。


登録URLを設定する

Rancherサーバーが起動したら、ブラウザで http://localhost:8080 を開きいてHost Registration URLを設定します。設定ページは、「ADMIN」->「Settings」にあります。

image

今回は、http://172.31.0.1:8080 に設定しました。

このURLは、Rancherエージェント(また別なコンテナ)がRancherサーバーへ接続するAPIエンドポイントとして使われます。このURLがlocalhost127.0.0.1だったりコンテナから接続できないアドレスだとエージェントからの接続が失敗してしまいます。


Tips - 専用のIPを用意する

MacだとWi-FiネットワークでIPアドレスが環境によって変わってしまうことが多いと思います。これだと登録URLも変わり都合が悪いのでMacで固定IPを設定しました。


  • Network設定(メニューバーのWiFi -> Open Network Preferences..)を開きます。

  • 左下の「+」ボタンでネットワークを追加します。

  • Interfaceに「Wi-Fi」を選択して作成します。名前は任意で。

  • 作成したネットワークを選択し「Advanced...」の設定項目に入ります。

  • 「TCP/IP」タブを選び固定IPを設定します。以下参照。

image

ターミナルで以下の様になっていれば成功です。


Macターミナルでインターフェースの確認

$ ifconfig en0

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 3c:15:c2:d3:5e:34
inet6 fe80::3e15:c2ff:fed3:5e34%en0 prefixlen 64 scopeid 0x4
inet 172.31.0.1 netmask 0xffffff00 broadcast 172.31.0.255
inet 192.168.3.7 netmask 0xffffff00 broadcast 192.168.3.255
nd6 options=1<PERFORMNUD>
media: autoselect
status: active


Tips - もっと簡単なIPをつかう

実は、Host Resistration URLのIPのはMacのIPでなくて良いので、以下でRancherコンテナのIPを調べてそれを設定することもできます。ただし再起動すると変わってしまうので注意が必要です。

$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' <rancherのコンテナ名>

172.17.0.2


Rancherホストの追加

次にRancherが管理するホストを登録します。

UIの「INFRASTRUCTURE」->「Hosts」->「Add Host」画面で、Rancherエージェントのコンテナ作成用のコマンドをコピーします。

image

コピーしたまま実行すると起動に失敗するので、以下の様に変更して実行します。

$ sudo docker run -d --privileged \

> -v /var/run/docker.sock:/var/run/docker.sock \
> -v $HOME/rancher:/var/lib/rancher \ # ここを"-v /var/lib/rancher:/var/lib/rancher"から変更する
> rancher/agent:v1.1.3 \
> http://172.31.0.1:8080/v1/scripts/EE883A8F4ED4B48F6B1E:1484319600000:FRYynPCEDcMyiIo14lxJSxYD4TM

$HOME/rancherの部分は環境に応じて変更してください。

実行後、1−2分して以下の様にホストが現れていたら成功です。

image

docker psで見ると複数のコンテナが起動されていると思います。

$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5fb926d81a1 rancher/scheduler:v0.5.0 "/.r/r /rancher-entry" 18 hours ago Up 15 minutes r-scheduler-scheduler-1-03c7f2af
17e0bd3e7ce4 rancher/healthcheck:v0.2.0 "/.r/r /rancher-entry" 42 hours ago Up 15 minutes r-healthcheck-healthcheck-1-446e005c
de6689305148 rancher/net:v0.8.1 "/rancher-entrypoint." 42 hours ago Up 15 minutes r-ipsec-ipsec-router-1-d3790cf3
4da693010709 rancher/net:holder "/.r/r /rancher-entry" 42 hours ago Up 15 minutes r-ipsec-ipsec-1-c3301785
557a9cf4a039 rancher/net:v0.8.1 "/rancher-entrypoint." 42 hours ago Up 16 minutes r-ipsec-ipsec-cni-driver-1-752a7b7c
ca94e20b39f1 rancher/dns:v0.13.0 "/rancher-entrypoint." 42 hours ago Up 16 minutes r-network-services-metadata-dns-1-7e74b995
8025f2e8a471 rancher/metadata:v0.7.0 "/rancher-entrypoint." 42 hours ago Up 16 minutes r-network-services-metadata-1-e80cec1f
3178f95f3a73 rancher/network-manager:v0.4.0 "/rancher-entrypoint." 42 hours ago Up 16 minutes r-network-services-network-manager-1-d3660993
efeb30cfc331 rancher/agent:v1.1.3 "/run.sh run" 42 hours ago Up 17 minutes rancher-agent
5c19194b6ee8 rancher/server "/usr/bin/entry /usr/" 43 hours ago Up 17 minutes 3306/tcp, 0.0.0.0:8080->8080/tcp rancher-server


なぜ標準のPATHだと駄目なのか

標準のPATHのまま実行すると以下の様なエラーが出ます。

$ sudo docker run -d --privileged \

> -v /var/run/docker.sock:/var/run/docker.sock \
> -v /var/lib/rancher:/var/lib/rancher \
> rancher/agent:v1.1.3 \
> http://172.31.0.1:8080/v1/scripts/EE883A8F4ED4B48F6B1E:1484319600000:FRYynPCEDcMyiIo14lxJSxYD4TM

...省略...

docker: Error response from daemon: Mounts denied:
The path /var/lib/rancher is not shared from OS X and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
..

/var/lib/rancher は駄目と言われています。これはDockerのFile Sharing設定がされてないからです。

image

ただし、 /var を追加しようとしてもエラーになり使えません。

image

ここまでが Docker for Mac で Rancher を動かす内容でした。次はこの Rancher on Docker for Mac でサービスを作ってみたいと思います。 :smiley:


Rancherで簡単なシステム構築


作るもの

構成は以下の様なものを作ります。

          +----------+    +----------+    +----------+

(Mac)-----| lb |----|rancher-lb|----| webapp |
+----------+ +----------+ +----------+

作成したStack(後述)は以下の様になります。

image

なぜ、ロードバランサー(lbとrancher-lb)が2つあるのかと言うと、rancherが提供するロードバランサー(rancher-lb)はホストのインターフェースIPをバインド出来ないからです。 :scream:

image

see: Load Balancers - docs.rancher.com

MacのIPアドレスをバインドさせるhaproxyを作り、その分散先としてrancher-lbを登録し、さらにそのrancher-lbの分散先をwebappにして最終的にwebappのクラスタ(Rancherでいうサービス)へ分散する構成にしています。


単語の定義説明

UIが分かりやすく出来ているので余り迷うことはないと思いますが、Rancherで使われている単語や定義を簡単に説明します。


  • Service・・用途別のコンテナをグループ化する(Docker Image 単位)。web, application, dbなどのTierを想定。

  • Stack・・Serviceのグループ化。一連のアプリケーションを関連付け。一つのサービスやシステムを想定。

  • Environment・・環境。Production, Staging, Developmentなどの使い分けが想定を想定。


Stackの作成

Stackを作成しておきます。

image


webappサービスを作成

Webサーバーを作成します。アクセスされたコンテナによって表示を出し分けたいので一番簡単そうなApache+PHPで作成します。

予めindex.phpを準備しておきます。


index.php

<?php

echo date("Y-m-d H:i:s");
echo " hostname: ";
echo gethostname();
echo "\n";

?>


以下の様なレスポンスを期待しています。コンテナ名を表示してどのコンテナにアクセスしたか分かるようにするのが目的です。


期待するHTTPレスポンス

YYYY-MM-DD HH:mm:ss hostname: container_hostname


先ほど作成したStackで「Add Service」して、必要な情報を指定して作成します。

image


webappサービスの設定

Name: webapp

Select Image: php:7.0-apache
Volumes: /Users/user/rancher/webapp/index.php:/var/www/html/index.php:ro # 作ったindex.phpをマウント。

コンテナに入って確認してみます。

image

image

上手く動きました :tada:

「Execute Shell」便利ですね〜 :thumbsup:


rancher-lbサービスの作成

rancher-lbは、Rancherが管理してくれるロードバランサー機能で作成します。SSL TerminationやURL分散などUIから設定することが出来き、必要十分な機能が使えます。さらに、haproxy.cfgをアップロードもできるので全ての機能を使うこともできます。

「Add Load Balancer」を選択して作成します。

image


rancher-lbの設定

Name: rancher-lb

Access: public
Protocol: HTTP
Port: 81 # rancher-lbのリッスンポート
Target: webapp # 先ほど作ったwebappサービスを選択
Port: 80 # コンテナのポート


LBサービスの作成

haproxyでMacのIPとrancher-lbを接続するサービスを作ります。

image


lbサービスの作成

Name: lb

Select Image: haproxy:latest
Port Map - Public Host Port: 80
Port Map - Private Container Port: 80
Port Map - Protocol: TCP
Volumes: /Users/user/rancher/lb/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
Networking - Network: Bridge

haproxy.cfgは以下を使いました。


haproxy.cfg

global

daemon
maxconn 4096
maxpipes 1024

defaults
maxconn 4096
mode tcp
option forwardfor
option http-server-close
option redispatch
retries 3

resolvers rancher
nameserver dnsmasq 169.254.169.250:53

frontend 80
bind *:80
mode http
default_backend 81

backend 81
acl forwarded_proto hdr_cnt(X-Forwarded-Proto) eq 0
acl forwarded_port hdr_cnt(X-Forwarded-Port) eq 0
http-request add-header X-Forwarded-Port %[dst_port] if forwarded_port
http-request add-header X-Forwarded-Proto https if { ssl_fc } forwarded_proto
mode http
server rancher-lb 172.17.0.1:81 # rancher-lbサービスのIPとポート


これでMacから接続出来るようになりました。 :clap:


MacターミナルからHTTPアクセス

$ curl localhost

2017-01-13 17:21:06 hostname: bea4f484cef5


スケールさせてみる

Rancherではサービス毎にスケールが簡単にできるので、HTTPリクエストのレスポンスを見てコンテナが増えるのを確認してみます。

webappサービスの画面に入りScaleの「+」を押してコンテナ数を増やします。

image

スケールするときに連続してHTTPアクセスをしておきながら、コンテナ名が変わるのを確認します。


MacコンソールからHTTP連続アクセス

$ while true; do curl localhost ; sleep 2 ; done

2017-01-13 17:28:12 hostname: bea4f484cef5
2017-01-13 17:28:14 hostname: bea4f484cef5
2017-01-13 17:28:16 hostname: bea4f484cef5
2017-01-13 17:28:21 hostname: ad20c7329672 # 1個増えた
2017-01-13 17:28:23 hostname: bea4f484cef5
2017-01-13 17:28:25 hostname: cbdefcc553be # 2個目も増えた
2017-01-13 17:28:27 hostname: ad20c7329672
2017-01-13 17:28:29 hostname: bea4f484cef5
2017-01-13 17:28:31 hostname: cbdefcc553be

分散先が増えてるのが分かります。 :smirk:


最後に

コンテナをサービスとして導入するにはどうやって運用管理や監視をしていくことが課題になってくると思います。Rancherは、分かりやすいUIがあり、かつ、オペレーションをよく考えられて作られているのでとても魅力的です。 :heart_eyes:

それでは :smile: