Docker Swarm에서 Consul을 사용한 DNS 서비스 검색

영사 DNS를 사용하여 서비스 검색을 작동 시키려고합니다. swarm에 필요한 키 / 값 쌍 백엔드로 작동하고 다른 컨테이너에 대한 서비스 검색 백엔드로 작동하는 consul 클러스터가있는 도커 스웜을 설정했습니다.

Docker 엔진이 설치된 3 개의 베어 서버로 시작합니다. ansible을 사용하여 클러스터를 프로비저닝하고 있습니다.

지금까지이 클러스터를 설정하는 프로세스는 다음과 같습니다.

  • docker를 설치할 때 --cluster-store=consul://127.0.0.1:8500docker 데몬 opts에서 설정 하십시오.
  • “기본”클러스터 노드에서 “-bootstrap-expect 3″모드로 영사 서버 컨테이너를 시작하십시오.
  • “보조”클러스터 노드에서 “-join”모드로 영사 서버 컨테이너를 시작하십시오.
  • 각 클러스터 노드에서 웜 마스터 및 웜 에이전트 컨테이너를 시작하여 동일한 호스트의 로컬 영사 서버를 가리 킵니다.

영사 서버를 시작할 때 다음과 같이 모든 영사 포트를 호스트에 매핑합니다.

version: '2'

services:
    consul:
        image: progrium/consul
        hostname: "{{ ansible_hostname }}"
        ports:
            # Explanation of ports needed: http://stackoverflow.com/a/30692226/1514089
            - "8300:8300" # This is used by servers to handle incoming requests from other agents
            - "8301:8301/tcp" # This is used to handle gossip in the LAN. Required by all agents
            - "8301:8301/udp" # This is used to handle gossip in the LAN. Required by all agents
            - "8302:8302/tcp" # This is used by servers to gossip over the WAN to other servers
            - "8302:8302/udp" # This is used by servers to gossip over the WAN to other servers
            - "8400:8400" # This is used by all agents to handle RPC from the CLI
            - "8500:8500" # This is used by clients to talk to the HTTP API
            - "8600:8600" # Used to resolve DNS queries
         restart: always
         command: "{{ consul_command }}"

이것은 나에게 일하는 도커 떼를 얻는다. 클러스터 노드 중 하나에 로그인하고 도커 작성을 사용하여 응용 프로그램을 가져올 수 있으며, 웜은 서버간에 투명하게 균형을 유지합니다.

이제는 웜의 각 컨테이너 내부에서 서비스를 해결하기 위해 영사 DNS 기능을 사용하기 시작하고 싶습니다.

$ docker run -it ubuntu dig consul.service.consul

몇 가지를 시도했지만 작동하지 않아 도커 네트워크와 관련이 있다고 생각합니다. 설명하겠습니다 …

consul 서버를 시작하면 docker-compose로 시작하기 때문에 자체 docker-compose 네트워크에 연결됩니다. 그러나 스웜이 아직 작동하지 않기 때문에 아직 멀티 호스트 오버레이 네트워크가 설정되어 있지 않습니다. 따라서 각 영사 컨테이너는 자체 호스트 전용 브리지 네트워크에있게됩니다. 웜 이 부트 스트랩 된 후에 만 도커 네트워크를 만듭니다 . 떼가 올라온 후 오버레이 컨테이너에 영사 컨테이너를 추가 할 수 없었습니다.

Error response from daemon: No such container: swarm-node-1/swarmconsul_consul_1

컨테이너 내에서 DNS 기반 서비스 검색을 수행하려면 어떻게해야합니까?



답변

결국 나는 그것을 작동시킬 수있었습니다. 나는 몇 가지 잘못하고 있었다.

가장 큰 실수는 호스트의 포트 53을 영사 컨테이너 내부의 포트 53 / udp에 매핑하지 않았다는 것입니다. 전체 포트 매핑은 이제 다음과 같습니다.

services:
    consul:
        image: progrium/consul
        hostname: "{{ ansible_hostname }}"
        ports:
          # Explanation of ports needed: http://stackoverflow.com/a/30692226/1514089
          - "8300:8300" # This is used by servers to handle incoming requests from other agents
          - "8301:8301/tcp" # This is used to handle gossip in the LAN. Required by all agents
          - "8301:8301/udp" # This is used to handle gossip in the LAN. Required by all agents
          - "8302:8302/tcp" # This is used by servers to gossip over the WAN to other servers
          - "8302:8302/udp" # This is used by servers to gossip over the WAN to other servers
          - "8400:8400" # This is used by all agents to handle RPC from the CLI
          - "8500:8500" # This is used by clients to talk to the HTTP API
          - "8600:8600" # Used to resolve DNS queries
          - "172.17.0.1:53:53/udp"
        restart: always
        command: "{{ consul_command }}"

여기에서 docker0 인터페이스의 포트 53에 바인딩합니다. 그러나 docker0 브리지의 IP가 변경 될 수 있다는 것을 알았으므로 조금 하드 코딩 --bip=172.17.0.1하여 docker 데몬 옵션에서 지정하여 docker0 브리지에 항상이 IP를 사용 하도록 docker 에 지시 했습니다. 다음 단계는 docker 데몬의 기본 DNS를 동일한 IP로 설정하는 것입니다. 내 전체 도커 데몬은 다음과 같습니다.

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon \
    -H tcp://0.0.0.0:2375 \
    -H unix:///var/run/docker.sock \
    --bip=172.17.0.1/16 \
    --dns=172.17.0.1 \
    --dns-search=service.consul \
    --storage-driver=overlay \
    --cluster-store=consul://127.0.0.1:8500

이제 나는 이것을 할 수 있습니다 :

$ sudo docker -H :4000 run -it joffotron/docker-net-tools
/ # dig +short consul.service.consul
10.0.0.93
10.0.0.95
10.0.0.94

큰!