Docker_compose.yml içindeki bağlantılar ve depends_on arasındaki fark


292

Docker Compose'un oluşturma dosyası belgelerine göre :

  • depends_on - Hizmetler arasında hızlı bağımlılık.
  • links- Başka bir hizmetteki kapsayıcılara bağlantı ve aynı zamanda hizmetler arasındaki bağımlılığı depends_on ile aynı şekilde ifade edin .

Diğer kaplara bağlamanın amacını anlamıyorum, bu yüzden iki seçenek arasındaki fark benim için hala oldukça zor görünüyor.

Bir örnek olsaydı çok daha kolay olurdu ama ben bulamıyorum.

B kabını A kabına bağladığımda B kabının A kabının kabuğunda "pinglenebilir" olacağını fark ettim.

ping BA kabının içinde koştum bashve böyle bir sonuç aldım (sadece referans için, internetten görüntü)

resim açıklamasını buraya girin


6
--linkBayrak şimdi Docker bir kullanımdan kaldırılmış eski bir özelliktir ve dokümantasyon "Bu sonuçta kaldırılmış olabilir" düşündürmektedir Docker: Legacy konteyner bağlantıları . Docker ağları özelliğini veya docker oluşturma yöntemini kullanmamanız önerilir . Bunun burada bu özelliği öğrenen herkes için yararlı olacağını düşündüm.
Bir Yıldız

Yanıtlar:


122

linksSeçenek kullanımdan kaldırıldıktan sonra yayının güncellenmesi gerekiyor .

Temel olarak, linksartık gerekli değildir çünkü ana amacı, ortam değişkeni ekleyerek kabın başka biri tarafından erişilebilir olmasını sağlamak, dolaylı olarak dahil edilmiştir network. Kapsayıcılar aynı ağa yerleştirildiğinde, kapsayıcı adlarını ve ana bilgisayar olarak diğer diğer adlarını kullanarak birbirlerine ulaşabilirler.

Çünkü docker run, --linkkullanımdan kaldırılmıştır ve özel bir ağ ile değiştirilmesi gerekir.

docker network create mynet
docker run -d --net mynet --name container1 my_image
docker run -it --net mynet --name container1 another_image

depends_oniyi bir yan etkisi olan başlangıç ​​sırasını (ve dolaylı olarak görüntü çekme sırasını) ifade eder links.


13
ortak StackOverflow, neden en iyi 1 puanlık bir cevap bulmak için 147 ve 43 puan cevapları aşağı kaydırmak zorundayım.
u8it

3
@ u8it Zamanın ve internetin doğası.
Michael Cole

Docker-compose'de aynı şey nasıl yapılır? Docker compose ile tüm hizmetlerin zaten aynı ağda olduğunu ve herhangi bir şey eklemeye gerek olmadığını düşünüyorum. Kaplardan biri Hazır durumunda olmayan bir kaba bağlanmaya çalışıyorsa, kaplar arasında bağlantı yine de çalışmaz.
makkasi

Docker -compose sürüm 3 docs'ta kullanımdan kaldırılan bağlantılar hakkındaki bilgileri göremiyorum: docs.docker.com/compose/compose-file/#links . Ağları ve depends_on paylaştığımız için seçeneği çok kullanışlı görmüyorum, ancak dokümanları doğru okuduğumda kullanımdan kaldırılmıyor (sadece bahsettiğimiz docker kapsayıcısındaki bağlantı bayrağı).
rideronthestorm

Not: Aynı ağdaki kapsayıcılara (aslında hizmetler) kapsayıcı adıyla değil, hizmet adıyla erişilebilir. Resmi belgeler: docs.docker.com/compose/networking/#links
GarryOne

194

Bu cevap, docker-compose sürüm 2 içindir ve ayrıca sürüm 3'te de çalışır

Depends_on komutunu kullanırken verilere erişmeye devam edebilirsiniz.

Docker dokümanlar Docker Compose ve Django'ya bakarsanız, yine de veritabanına şu şekilde erişebilirsiniz:

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

Links ve depends_on arasındaki fark nedir?

links:

Bir veritabanı için kapsayıcı oluşturduğunuzda, örneğin:

docker run -d --name=test-mysql --env="MYSQL_ROOT_PASSWORD=mypassword" -P mysql

docker inspect d54cf8a0fb98 |grep HostPort

Ve bulabilirsiniz

"HostPort": "32777"

Bu, veritabanını localhost bağlantı noktası 32777'den (kapsayıcıda 3306) bağlayabileceğiniz anlamına gelir, ancak kapsayıcıyı her yeniden başlattığınızda veya kaldırdığınızda bu bağlantı noktası değişecektir. Bu nedenle, her zaman veritabanına bağlanacağınızdan ve hangi bağlantı noktasının olduğunu bilmek zorunda olmadığınızdan emin olmak için bağlantıları kullanabilirsiniz.

web:
  links:
   - db

depends_on:

Giorgio Ferraris Docker-compose.yml'den güzel bir blog buldum: V1'den V2'ye

Docker-compose V2 dosyalarını yürüttüğünde, dosyada tanımlanan tüm kaplar arasında otomatik olarak bir ağ oluşturur ve her kap sadece docker-compose.yml dosyasında tanımlanan adları kullanarak hemen diğerlerine başvurabilir.

Ve

Artık bağlantılara ihtiyacımız yok; bağlantılar, db kapsayıcımız ve web sunucusu kapsayıcımız arasında bir ağ iletişimi başlatmak için kullanıldı, ancak bu zaten docker-compose tarafından yapıldı

Güncelleme

depends_on

İki etkisi olan hizmetler arasında açık bağımlılık:

  • docker-compose uphizmetleri bağımlılık sırasına göre başlatacaktır. Aşağıdaki örnekte, db ve redis web'den önce başlatılacaktır.
  • docker-compose up SERVICESERVICE'in bağımlılıklarını otomatik olarak içerecektir. Aşağıdaki örnekte, docker-compose up web de db ve redis oluşturur ve başlatır.

Basit bir örnek:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

Not: depends_on, web başlatılmadan önce db ve redis'in "hazır" olmasını beklemez - yalnızca başlatılıncaya kadar. Bir hizmetin hazır olmasını beklemeniz gerekiyorsa, bu sorun ve çözme stratejileri hakkında daha fazla bilgi için Başlangıç ​​sırasını denetleme konusuna bakın.


Cevabın v1 dosyası oluşturmaya yönelik olduğunu açıklığa kavuşturmak için cevabımı güncelledim.
Xiongbing Jin

1
Bu hala sürüm 3 için geçerli mi?
fabiomaia

Evet, bir göz https://docs.docker.com/compose/compose-file/compose-versioning/
atabilirsiniz

"Bu, veritabanını localhost bağlantı noktanız 32777'den (kapsayıcıda 3306) bağlayabileceğiniz anlamına gelir, ancak kapsayıcıyı her yeniden başlattığınızda veya kaldırdığınızda bu bağlantı noktası değişecektir" . Ve bu soru özellikle docker-compose ile ilgili olduğundan, buradaki örneğin docker runtamamen alakasız olduğunu düşünüyorum, konteynerin zaten nasıl çalışacağını bulamıyorum. Neyi kaçırıyorum?
Andrew Savinykh

Evet, bağlantı noktasını belirtirseniz haklısınız. Benim docker run bunu belirtmek değilse, her zaman değiştirebilir çünkü kullanım depends_on ya da bağlantılar yerine sabit bir kod liman number.just gerekir neden örnek işaret etmek istiyorum. Bu, insanların depends_on veya bağlantılar hakkında daha fazla anlamalarını sağlayacağını düşünüyorum.
Windsooon

50

[Güncelleme Eylül 2016]: Bu yanıt, liman işçisi oluşturma dosyası v1 için tasarlanmıştır (aşağıdaki örnek oluşturma dosyası tarafından gösterildiği gibi). V2 için @Windsooon'un diğer cevabına bakınız.

[Orijinal cevap]:

Belgelerde oldukça açıktır. depends_onkonteynır yaratmanın bağımlılığına ve sırasına karar verir ve linkssadece bunları değil, aynı zamanda

Bağlı hizmetin kapsayıcılarına, diğer adla aynı olan bir ana bilgisayar adında veya hiçbir diğer ad belirtilmemişse hizmet adında erişilebilir.

Örneğin, aşağıdaki docker-compose.ymldosyayı varsayarak :

web:
  image: example/my_web_app:latest
  links:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest

İle linksiçerideki kod , görüntüde 5432 numaralı bağlantı noktasının açığa çıktığı varsayılarak webveritabanına erişilebilecektir . Eğer kullanıldı, bu mümkün olmazdı, ama konteynerlerin başlangıç sırası doğru olacaktır.db:5432dbdepends_on


Bana bir örnek verebilirmisin? Çünkü o kısım hala net değilim. Belki daha belirgin hale getirebilecek başka oluşturma dosyası seçenekleri de vardır. Lütfen daha ayrıntılı bilgi verin. Teşekkürler!
itsjef

Çok teşekkür ederim! Anladım. Son bir soru lütfen. Yani, benim özel durumda, i kullanmalıyım, benim raylar uygulamayı dağıtmaya ediyorum linksya depends_onya ya bunların yolunda mı? Mevcut docker-compose.ymlkullanımlarım depends_onve işler iyi çalışıyor gibi görünüyor. :)
itsjef

Doğrudan aracılığıyla diğer konteyner erişmek için gerekmiyorsa name:porto zaman depends_ontamam.
Xiongbing Jin

9
isim: ifşa kullanırken bağlantı olmadan bile çalışır:
Amit Goldstein

7
"Depends_on kullanılsaydı, bu mümkün olmazdı, ancak kapların başlangıç ​​sırası doğru olurdu." Bu doğru değil. Sadece depends_on kullanırsanız çalışır. Eğer hala erişebilir dbiçinde webkullanarak veritabanları hostname.
prog.Dusan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.