network_mode: service:vpn и изгубеното име на домаќин db
Споделувањето на именскиот простор на VPN е избор на топологија. Или db ја задржува сопствената адреса и vpn се приклучува кон таа мрежа, или сето одговара на loopback.
Додавате 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 нема сопствена адреса.