У меня есть следующие настройки
- Две виртуальные машины
- созданная оверлейная сеть
создано две службы Docker Swarm
служба Docker создать - имя karaf1-служба --replicas 1 - сеть karaf_net karaf1: 2.0.0
служба Docker создать - имя karaf2-служба --replicas 1 - сеть karaf_net karaf2: 2.0.0
Теперь эти контейнеры открывают порт сокета при запуске, я заметил, что некоторое время он успешно мог создавать его много раз, когда он терпит неудачу.
ServerSocketFactory.getDefault().createServerSocket(serverPort)
если оба контейнера запускаются на одном узле, это в основном успешно, но когда контейнеры создаются на другом узле, это почти каждый раз приводит к сбою.
перед устранением неполадок в сети, контейнер по крайней мере должен создать сокеты.
этот контейнер не может открыть сокет
root@bd48643080b2:/opt/apache/apache-karaf-4.1.5# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:8101 0.0.0.0:* LISTEN 61/java
tcp 0 0 127.0.0.1:1099 0.0.0.0:* LISTEN 61/java
tcp 0 0 0.0.0.0:41551 0.0.0.0:* LISTEN 61/java
tcp 0 0 127.0.0.11:44853 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:44444 0.0.0.0:* LISTEN 61/java
Следующий контейнер может создать его на порту 4550, но иногда это наоборот
root@38d26c7dde1a:/opt/apache/apache-karaf-4.1.5# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:37347 0.0.0.0:* LISTEN 61/java
tcp 0 0 0.0.0.0:8101 0.0.0.0:* LISTEN 61/java
tcp 0 0 0.0.0.0:4550 0.0.0.0:* LISTEN 61/java
tcp 0 0 127.0.0.11:37575 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:1099 0.0.0.0:* LISTEN 61/java
tcp 0 0 127.0.0.1:35321 0.0.0.0:* LISTEN 61/java
tcp 0 0 0.0.0.0:44444 0.0.0.0:* LISTEN 61/java
Идентифицирована первопричина:
Как я создаю две службы, так и при создании первой службы я предоставляю вторую службу в качестве имени хоста первой службе, чтобы постоянно проверять состояние, поэтому ошибка выдачи Java для имени хоста, например, "karaf2-service"
java.net.UnknownHostException: karaf2-service: Name or service not known
at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
Теперь я не могу добавить запись службы karaf2 в etc / hosts, чтобы сокет не жаловался, так как не знаю, какой IP будет назначен службе docker-swarm? в оверлейной сети мы в основном общаемся с именами сервисов.
Есть предложения по решению этой проблемы?