network_mode: service:vpn ve kaybolan db ana bilgisayar adı
VPN ad alanını paylaşmak bir topoloji seçimidir. Ya db kendi adresini korur ve vpn o ağa katılır, ya da her şey loopback üzerinde yanıt verir.
Uygulamaya network_mode: service:vpn eklersiniz, yığını yeniden başlatırsınız ve uygulama ölür çünkü db artık çözümlenmez. compose dosyasında hiçbir şey yeniden adlandırılmadı, bu yüzden bariz şüpheliler DNS ve veritabanıdır. Gerçek değişiklik daha küçük ve daha tuhaf: uygulama, o adın bulunduğu Compose ağının üyesi olmayı bıraktı. Veritabanının hangi ad alanından yanıt vermesi gerektiğine karar verene kadar her ana bilgisayar adı düzeltmesi bir tahmindir.
db ana bilgisayar adı neden çözümlenmeyi bıraktı
network_mode kullanan bir hizmetin Compose ağında kendi adresi yoktur; adlandırılmış hizmetin ad alanını ödünç alır. Bu ad alanı kendi arayüzlerini, rotalarını, bağlantı noktası alanını ve çözümleyicisini getirir ve uygulamanın backend ağına bağlantısının yerini alır. db adı hiçbir zaman soyut değildi: o ağda yaşıyordu ve gömülü DNS'i aracılığıyla çözümleniyordu. Bağlantıyı kaldırın, adın çözümlenecek yeri kalmaz.
Bunu ana bilgisayardan değil, kapsayıcıların içinden doğrulayın. Uygulamada başarısız olup veritabanı kapsayıcısında başarılı olan bir sorgu, adın doğru olduğu ve üyeliğin olmadığı anlamına gelir. Bu sonuç aynı zamanda düzeltmeyi uygulamanın çözümleyici ayarlarına değil compose topolojisine yerleştirir.
Dosyayı düzenlemeden önce üç soru
Bunları sırayla yanıtlayın, çünkü her biri topolojiyi daraltır. Veritabanı neye yanıt vermeli: diğer kapsayıcıların kullandığı bir ana bilgisayar adına mı, yoksa yalnızca loopback üzerindeki uygulamaya mı? Uygulama ana bilgisayara bir bağlantı noktası yayımlamalı mı, ve hangi hizmet ona sahip olurdu? Veritabanı ana bilgisayardan veya başka bir makineden erişilebilir olmalı mı, yoksa yalnızca tünelin içinden mi?
Veritabanının kendi adına ihtiyacı varsa ve uygulama hiçbir şey yayımlamıyorsa, onları ayrı bağlantılarda tutun. Uygulama bir bağlantı noktası yayımlamak zorundaysa ve her şey tünelden geçiyorsa, veritabanını VPN ad alanına koyun ve loopback kullanın. İkisini karıştırmak temiz başlayan ve bağlanma anında başarısız olan bir yığın üretir.
Veritabanını olduğu yerde bırakın
Daha küçük değişiklik, ad alanının sahibini veritabanını zaten içeren ağa bağlar. Uygulama bu bağlantıyı vpn yığınını paylaştığı için devralır ve db tam olarak eskisi gibi çözümlenir.
services:
vpn:
networks:
- backend
app:
network_mode: service:vpn
db:
networks:
- backend
networks:
backend:networks öğesini uygulamaya da eklemeyin. Compose aynı hizmette network_mode ile birlikte bu özelliği reddeder ve hata çifte değil dosyaya işaret eder. VPN istemcisi backend hedefini kendi ad alanı içinde filtreliyorsa, desteklenen yerel ağ ilkesini de ayarlayın; paylaşılan bağlantı bir yol sunar ama o filtreyi geçersiz kılmaz.
Veritabanını ad alanına taşıyın
Daha büyük değişiklik veritabanını aynı ad alanına koyar ve uygulamayı gerçek bağlantı noktasıyla 127.0.0.1 adresine yönlendirir. İki süreç yalnızca farklı kapsayıcılarda başladıkları için aynı adresi ve bağlantı noktasını birlikte bağlayamaz, bu yüzden wildcard adresinde de dinleyen bir veritabanı bunu yapan başka her şeyle çakışır. Taşımadan önce dinleyiciyi kontrol edin.
Yayımlanan bağlantı noktaları ad alanına sahip hizmete aittir. Uygulamaya ports eklemek network_mode ile birlikte reddedilir ve ayrı bir uygulama adresi uydurmak var olmayan bir arayüzü tanımlar.
Hazırlık, engelleme ve çözümleyici
depends_on kapsayıcı başlangıcını sıralar; tünelin çalıştığının kanıtı değildir ve tünel düştüğünde trafiği durdurmaz. Erişilebilirliği, tünel hazırlığını ve hata engellemeyi üç ayrı gereksinim olarak ele alın. Yalnızca ilkini karşılayan bir yığın iyi bir günde elle testi geçer ve kötü bir günde sızdırır. Üç yanıtı compose dosyasının yanına yazın, sıradaki kişinin bakacağı yere.
Ad alanını paylaşmak aynı zamanda uygulamanın VPN kapsayıcısının çözümleyicisini devraldığı anlamına gelir; bu, tünel DNS sunucularını dayattığında yardımcı olur ve dayatmadığında kafa karıştırır. Ana bilgisayarın çözümleyicisinin geçerli olduğunu varsaymak yerine ad alanının gerçekte ne içerdiğini kontrol edin. Compose hizmetleri başvurusu network_mode, ports ve bağımlılık davranışını tek bir yerde belgeler; bir network_mode hizmetinin neden kendi adresi olmadığı da dahil.