имя хоста не работает в режиме роя Docker - PullRequest
0 голосов
/ 30 августа 2018

Я использую докер версии 18.06.1-ce и создаю версию 1.22.0.

Согласно docker , должна быть возможность вызывать сервисы, используя имена сервисов. Это работает для меня с docker compose без режима роя, но в режиме роя это не работает. Я даже пытался установить псевдонимы в моем compose, но безрезультатно.

Ниже мой докер-compose.yml

version: "3"

networks:
  my_network:
    external:
      name: new_network


services:
  config-service:
    image: com.test/config-service:0.0.1
    deploy:
      placement:
        constraints: [node.role == manager]
      resources:
        limits:
          memory: 1024M
        reservations:
          memory: 768M
      restart_policy:
        condition: on-failure
    healthcheck:
      test: ["CMD", "curl", "-f", "http://config-service:8888/health"]
      interval: 5s
      timeout: 3s
      retries: 5
    ports:
      - 8888:8888
    networks:
      my_network:
        aliases:
          - config-service

  eureka-service:
    image: com.test/eureka-service:0.0.1
    deploy:
      placement:
        constraints: [node.role == manager]
      resources:
        limits:
          memory: 1536M
        reservations:
          memory: 1024M
      restart_policy:
        condition: on-failure
    healthcheck:
      test: ["CMD", "curl", "-I", "http://eureka-service:8761/health"]
      interval: 5s
      timeout: 3s
      retries: 5
    ports:
      - 8761:8761
    depends_on:
      - config-service
    networks:
      my_network:
        aliases:
          - eureka-service

Когда я проверяю свою сеть, я обнаружил

[
    {
        "Name": "new_network",
        "Id": "s2m7yq7tz4996w7eg229l59nf",
        "Created": "2018-08-30T13:58:59.75070753Z",
        "Scope": "swarm",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.20.0.0/16",
                    "Gateway": "172.20.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "355efe27067ee20868455dabbedd859b354d50fb957dcef4262eac6f25d10686": {
                "Name": "test_eureka-service.1.a4pjb3ntez9ly5zhu020h0tva",
                "EndpointID": "50998abdb4cd2cd2f747fadd82be495150919531b81a3d6fb07251a940ef2749",
                "MacAddress": "02:42:ac:14:00:02",
                "IPv4Address": "172.20.0.2/16",
                "IPv6Address": ""
            },
            "5cdb398c598c1cea6b9032d4c696fd1581e88f0644896edd958ef59895b698a4": {
                "Name": "test_config-service.1.se8ajr73ajnjhvxt3rq31xzlm",
                "EndpointID": "5b3c41a8df0054e1c115d93c32ca52220e2934b6f763f588452c38e60c067054",
                "MacAddress": "02:42:ac:14:00:03",
                "IPv4Address": "172.20.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

Теперь, если я подключаюсь к терминалу контейнеров и пингую, используя длинное имя 'test_config-service.1.se8ajr73ajnjhvxt3rq31xzlm', он может пропинговать, но не 'config-service'.

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Это известная проблема с версией 18.06:

https://github.com/docker/for-win/issues/2327

https://github.com/docker/for-linux/issues/375

Попробуйте 18.03

0 голосов
/ 30 августа 2018

Я полагаю, что проблема, с которой вы сталкиваетесь, заключается в том, что вы используете сеть моста роевой области вместо наложенной сети. Я не уверен, что эта конфигурация поддерживается. Запись DNS для службы при развертывании в режиме роя находится на уровне службы, а не на отдельных контейнерах. Судя по моему тестированию, эта запись DNS вместе с кодом для настройки VIP, похоже, работает только с оверлейными сетями. Вы можете решить эту проблему, если вам действительно необходимо настроить сеть как мост: https://github.com/moby/moby/issues/37672

В противном случае простое решение - заменить сеть наложенной сетью. Вы можете удалить сетевые псевдонимы, поскольку они являются избыточными. И если у вас есть другие контейнеры на хосте, которые также должны быть в этой сети, вне режима роя, убедитесь, что ваша оверлейная сеть настроена как «присоединяемая». Если у вас есть другие приложения, подключенные к сети, вы можете заменить их новой сетью или, если вам нужно сохранить то же имя сети, поменять его местами в два этапа:

# create a temporary network to free up the new_network name
docker network create -d overlay --attachable temp_network
docker network connect temp_network $container_id # repeat for each container
# finish the above step for all containers before continuing
docker network disconnect new_network $container_id #repeat for each container
# remove the old bridge network
docker network rm new_network

# now create a new_network as overlay
docker network create -d overlay --attachable new_network
docker network connect new_network $container_id # repeat for each container
# finish the above step for all containers before continuing
docker network disconnect temp_network $container_id #repeat for each container
# cleanup the temporary network
docker network rm temp_network

Если все работает в режиме роя, тогда --attachable не требуется. После этого вы сможете запустить свой стек режимов роя.

0 голосов
/ 30 августа 2018

Попробуйте составить список своих услуг с помощью команды docker service ls. Потому что, если вы используете стек и даете имя своему стеку, имя службы будет nameofstack_config-service

И я вижу в вашей проверке test_eureka-service.1xxxxxx, поэтому имя службы должно быть test_eureka-service

...