Добавяте network_mode: service:vpn към приложението, рестартирате стека и приложението умира, защото db вече не се резолвва. Във файла compose нищо не е преименувано, затова очевидните заподозрени са DNS и базата данни. Истинската промяна е по-малка и по-странна: приложението престана да бъде член на мрежата на Compose, където това име съществува. Докато не решите от кое пространство на имена трябва да отговаря базата данни, всяка поправка на име на хост е догадка.

Защо името на хост db престана да се резолвва

Услуга, която използва network_mode, няма собствен адрес в мрежа на Compose; тя заема пространството на имена на посочената услуга. Това пространство носи свои интерфейси, маршрути, пространство на портове и резолвер и заменя връзката на приложението към мрежата backend. Името db никога не е било абстрактно: то живееше в тази мрежа и се резолвваше чрез вградения DNS. Махнете връзката и името няма къде да се резолвва.

Проверете това отвътре в контейнерите, а не от хоста. Търсене, което се проваля в приложението, но успява в контейнера на базата данни, означава, че името е наред, а членството не е. Този резултат също така поставя поправката в топологията на compose, а не в настройките на резолвера на приложението.

Три въпроса, преди да редактирате файла

Отговорете им по ред, защото всеки стеснява топологията. На какво трябва да отговаря базата данни: на име на хост, което използват други контейнери, или само на приложението на loopback? Трябва ли приложението да публикува порт към хоста, и коя услуга би го притежавала? Трябва ли базата данни да е достъпна от хоста или от друга машина, или само отвътре в тунела?

Ако базата данни се нуждае от собствено име, а приложението не публикува нищо, дръжте ги на отделни връзки. Ако приложението трябва да публикува порт и всичко минава през тунела, поставете базата данни в пространството на имена на VPN и използвайте loopback. Смесването на двете дава стек, който стартира чисто и се проваля при свързване.

Оставете базата данни там, където е

По-малката промяна свързва собственика на пространството на имена към мрежата, която вече съдържа базата данни. Приложението наследява тази връзка, защото споделя стека vpn, и db се резолвва точно както преди.

services:
  vpn:
    networks:
      - backend
  app:
    network_mode: service:vpn
  db:
    networks:
      - backend
networks:
  backend:

Не добавяйте networks и към приложението. Compose отхвърля това свойство заедно с network_mode в същата услуга, а грешката сочи към файла, а не към двойката. Ако VPN клиентът филтрира дестинацията backend в своето пространство на имена, коригирайте и поддържаната от него политика за локална мрежа; споделената връзка предлага път, но не отменя този филтър.

Преместете базата данни в пространството на имена

По-голямата промяна поставя базата данни в същото пространство на имена и насочва приложението към 127.0.0.1 с истинския порт. Два процеса не могат да заемат един и същ адрес и порт само защото са стартирали в различни контейнери, затова база данни, която също слуша на адреса wildcard, ще се сблъска с всичко друго, което прави това. Проверете слушателя, преди да го преместите.

Публикуваните портове принадлежат на услугата, която притежава пространството на имена. Добавянето на ports към приложението се отхвърля заедно с network_mode, а измислянето на отделен адрес за приложението описва интерфейс, който не съществува.

Готовност, блокиране и резолвер

depends_on подрежда стартирането на контейнерите; това не е доказателство, че тунелът работи, и не спира трафика, когато тунелът падне. Третирайте достъпността, готовността на тунела и блокирането при отказ като три отделни изисквания. Стек, който удовлетворява само първото, минава ръчен тест в добър ден и тече в лош. Запишете трите отговора до файла compose, там, където ще погледне следващият човек.

Споделянето на пространство на имена означава също, че приложението наследява резолвера на VPN контейнера, което помага, когато тунелът налага DNS сървъри, и обърква, когато не го прави. Проверете какво всъщност съдържа пространството на имена, вместо да предполагате, че резолверът на хоста важи. Справочникът за услуги на Compose документира network_mode, ports и поведението на зависимостите на едно място, включително защо услуга с network_mode няма собствен адрес.

Подобни статии