Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
OrganizationEventAdvent CalendarQiitadon (β)
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

CoreOS 上の Docker コンテナのサービス情報を registrator を使って SkyDNS2 に自動登録する


registrator というサービス検出・登録・削除専用コンテナを使って、CoreOS 上に起動する Docker サービス(rails や redis, elasticsearch などポートを外部にさらすもの)を skydns2 へ自動登録するという話

registrator の基本については

skydns の基本については


registrator で Docker サービス を skydns2 へ自動登録する

skydns2 コンテナの起動

# on CoreOS machine
# SkyDNS2 の Docker イメージ作成
core@core-01 ~ $ git clone https://github.com/skynetservices/skydns.git
core@core-01 ~ $ cd skydns
core@core-01 ~ $ docker build -t skydns2 .

# SkyDNS のデフォルト設定を etcd にセット
core@core-01 ~ $ curl -L -XPUT -d value='{"nameservers": ["",""]}'

# SkyDNS2 コンテナ起動
# SkyDNS2 の UDP 53 ポートをホストの Private IPの 53 ポートに bind 
core@core-01 ~/skydns $ docker run \
  -d \
  --name skydns2 \
  -p \
  -e ETCD_MACHINES=',,' \
  skydns2:latest \

SkyDNS2 を backend にした registrator コンテナの起動

core@core-01 ~ $ docker run \
  -d \
  --name registrator \
  -h $HOSTNAME \
  -v /var/run/docker.sock:/tmp/docker.sock \
  progrium/registrator \
  -ip= skydns2://

registry-url の詳細については SkyDNS2 backend - progrium/registrator README を参照

redis コンテナを起動してみる

core@core-01 ~ $ docker run -d --name redis.1 -e SERVICE_ID=1 -p 6379:6379 redis

redis コンテナを起動すると registrator がそれを検知して skydns2 が参照する etcd のパスに key-value をセットしてくれる

core@core-01 ~ $ etcdctl ls --recursive /skydns/local

CoreOS マシンで使う DNS を skydns2 に変更する

core@core-01 ~ $ cat /etc/resolv.conf
# This file is managed by systemd-resolved(8). Do not edit.
# Third party programs must not access this file directly, but
# only through the symlink at /etc/resolv.conf. To manage
# resolv.conf(5) in a different way, replace the symlink by a
# static file or a different symlink.

nameserver # -> 書き換え

直に変更してもしばらくすると戻るので注意。永続的に変更するには cloud-config を利用すること。

ping してみる

core@core-01 ~ $ ping 1.redis.skydns.local
PING 1.redis.skydns.local ( 56(84) bytes of data.
64 bytes from icmp_seq=1 ttl=64 time=0.027 ms
64 bytes from icmp_seq=2 ttl=64 time=0.021 ms
--- 1.redis.skydns.local ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.021/0.024/0.027/0.003 ms
core@core-01 ~ $ ping redis.skydns.local
PING redis.skydns.local ( 56(84) bytes of data.
64 bytes from icmp_seq=1 ttl=64 time=0.027 ms
64 bytes from icmp_seq=2 ttl=64 time=0.042 ms
64 bytes from icmp_seq=3 ttl=64 time=0.019 ms
--- redis.skydns.local ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.019/0.029/0.042/0.010 ms



registrator の引数に渡した skydns2:// の部分が SkyDNS に権威があるドメインで、etcd には以下のようにセットされる


registrator skydns2:// を渡して起動すれば、




Docker のイメージがサービス名として利用される。 redis イメージを利用すると


のようにセットされ、logspout という名前のイメージを利用すると



redis.skydns.local が利用可能になる

サービス ID

コンテナ起動時の環境変数 SERVICE_ID の値がサービス ID として利用される。さきほどの例のように

core@core-01 ~ $ docker run -d --name redis.1 -e SERVICE_ID=1 -p 6379:6379 redis




1.redis.skydns.local が利用可能になる

Cloud-Config から SkyDNS2 backend の registrator を起動する

    - name: registrator.service
      command: start
      content: |     

        ExecStartPre=-/usr/bin/docker kill registrator
        ExecStartPre=-/usr/bin/docker rm registrator
        ExecStartPre=/usr/bin/docker pull progrium/registrator:latest
        ExecStart=/usr/bin/docker run --name registrator -h %H -v /var/run/docker.sock:/tmp/docker.sock progrium/registrator:latest -ip=$private_ipv4 skydns2://$private_ipv4:4001/skydns.local
        ExecStop=/usr/bin/docker stop registrator



Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Help us understand the problem. What are the problem?