consulをdockerで動かすときにホストからアクセスするときのメモ
以下の方法でconsulを検証していたのですが、1個だけハマったのでメモ。
Dockerを使って軽くConsulを触ってみる - さくらのナレッジ
基本的に上記方法に従います。
構成
Mac -> CoreOS(VM) -> docker container
docker container上でconsulを起動し、それをmacからアクセスして確認しました。
設定
- Vagrantfile (途中略)
config.vm.network "forwarded_port", guest:28400, host:28400 # consul(remote rpc) config.vm.network "forwarded_port", guest:28500, host:28500 # consul web api config.vm.network "forwarded_port", guest:28600, host:28600 # consul dns
- Dockerfile (途中略)
# consul EXPOSE 8400 EXPOSE 8500 EXPOSE 8600
- 起動時
core@core-01 ~ $ docker run -itd --name="consul-agent1" --hostname="consul-agent1" -p 20022:22 -p 28400:8400 -p 28500:8500 -p 28600:8600 test core@core-01 ~ $ docker run -itd --name="consul-agent2" --hostname="consul-agent2" -p 30022:22 -p 38400:8400 -p 38500:8500 -p 38600:8600 test core@core-01 ~ $ docker run -itd --name="consul-server1" --hostname="consul-server1" -p 40022:22 test core@core-01 ~ $ docker run -itd --name="consul-server2" --hostname="consul-server2" -p 50022:22 test core@core-01 ~ $ docker exec -it consul-server1 /bin/bash [root@consul-server1 /]# consul agent -data-dir=/tmp/consul -server -bootstrap-expect 2 -client=`hostname --ip-address` & [root@consul-server1 /]# exit core@core-01 ~ $ docker exec -it consul-server2 /bin/bash [root@consul-agent1 /]# consul agent -data-dir=/tmp/consul -server -join=10.1.0.3 -client=`hostname --ip-address` & [root@consul-server2 /]# exit core@core-01 ~ $ docker exec -it consul-agent1 /bin/bash [root@consul-agent1 /]# consul agent -data-dir=/tmp/consul -join=10.1.0.3 -client=`hostname --ip-address` & [root@consul-agent1 /]# exit core@core-01 ~ $ docker exec -it consul-agent2 /bin/bash [root@consul-agent2 /]# consul agent -data-dir=/tmp/consul -join=10.1.0.3 -client=`hostname --ip-address` & [root@consul-agent2 /]# exit
ここでは、consul-server1
のIPアドレスは10.1.0.3としています。
これで、docker container上では8400,8500,8600のポートが、CoreOS(VM)上では28400,28500,28600へ変換され、さらにMac上ではPortForwardingにより28400,28500,28600へ変換されます。
接続
mac上から、以下で繋がります。
$ consul members -rpc-addr=127.0.0.1:28400 Node Address Status Type Build Protocol consul-agent1 10.1.0.2:8301 alive client 0.4.1 2 consul-server2 10.1.0.4:8301 alive server 0.4.1 2 consul-server1 10.1.0.3:8301 alive server 0.4.1 2 consul-agent2 10.1.0.5:8301 alive client 0.4.1 2 $ curl -s localhost:28500/v1/catalog/nodes | jq "." [ { "Address": "10.1.0.2", "Node": "consul-agent1" }, { "Address": "10.1.0.5", "Node": "consul-agent2" }, { "Address": "10.1.0.3", "Node": "consul-server1" }, { "Address": "10.1.0.4", "Node": "consul-server2" } ]
ハマったこと
consul agent
コマンド実行時に、-client
オプションを入れないと、localhostからのアクセスしか受け付けません。従って、mac上からipを叩いても結果を取得できません。
例えば、以下のように-client
オプションなしだと、localhost以外からconsulコマンドでアクセスしてもエラーになります。
[root@consul-agent1 /]# consul agent -data-dir=/tmp/consul -join=10.1.0.3 &
普通に、consul agent
コマンドのオプションに書いてあるんですけどね…
-client=127.0.0.1 Sets the address to bind for client access. This includes RPC, DNS and HTTP