右往左往ブログ

日々よりみち

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-server1IPアドレスは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