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


Docker Compose'a göre derleme dosyası belgeleri:

  • depends_on - Hizmetler arası hızlı bağımlılık.
  • links - Başka bir serviste kaplara bağlantı ve ayrıca hizmetler arasındaki bağımlılığı ifade eder Aynı şekilde depends_on.

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

Bir örnek varsa çok daha kolay olurdu, ama bulamıyorum.

B kapsayıcısını B kapsayıcısı ile bağladığımda, B kapsayıcısının A kabuğunun içinde "pingable" olacağını fark ettim.

Koştum ping B A kabının içinde bash ve bunun gibi bir sonuç aldım (sadece referans için, internetten alınan görüntü)

enter image description here


147
2018-03-06 20:24


Menşei


--link flag artık Docker'ın eski haline getirilmiş eski bir özelliğidir ve belgeler "sonunda kaldırılabilir" önerisinde bulundu Docker: Eski konteyner bağlantıları. Kullanılmaması önerilmektedir Docker ağları özelliği veya docker metodu oluşturur. Bu özellik hakkında öğrenen herkes için yararlı olacağını düşündüm. - A Star


Cevaplar:


Bu cevap docker-compose için versiyon 2 ve ayrıca üzerinde çalışır sürüm 3

Depends_on kullandığınızda yine de verilere erişebilirsiniz.

Docker dokümanlarına bakarsanız Docker Compose ve Djangoveritabanı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 ile depends_on arasındaki fark nedir?

links:

Bir veritabanı için bir kap oluşturduğunuzda, örneğin:

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

docker inspect d54cf8a0fb98 |grep HostPort

Ve bulabilirsin

"HostPort": "32777"

Bu, veritabanını localhost port 32777'den (konteynerde 3306) bağlayabileceğiniz anlamına gelir, ancak bu port her yeniden başlattığınızda veya kabı kaldırdığınızda değişecektir. Bu nedenle, her zaman veritabanına bağlanacağınızdan ve hangi bağlantı noktasını bilmeniz gerektiğinden emin olmak için bağlantıları kullanabilirsiniz.

web:
  links:
   - db

depends_on:

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

Docker-compose, V2 dosyalarını çalıştırdığında, otomatik olarak dosyada tanımlı tüm kaplar arasında bir ağ kurar ve her kapsayıcı, docker-compose.yml dosyasında tanımlanan adları kullanarak diğerlerine hemen başvurabilir.

Ve

Yani artık bağlantıya ihtiyacımız yok; db konteyneri ile web-server konteynırımız arasında bir ağ iletişimi başlatmak için bağlantılar kullanıldı, ancak bu zaten docker-compose tarafından yapıldı

Güncelleştirme

depends_on

İki etkisi olan hizmetler arasındaki hızlı bağımlılık:

  • docker-compose up, bağımlılık sırasına göre hizmetlere başlayacaktır. Aşağıdaki örnekte, db ve redis web'den önce başlatılacaktır.
  • docker-up up SERVICE, SERVICE’ın bağımlılıklarını otomatik olarak ekleyecektir. Aşağıdaki örnekte, docker-compose up web de db ve redis oluşturup başlatacaktır.

Basit örnek:

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

Not: depends_on, web'i başlatmadan önce db ve redis'lerin “hazır” olmasını beklemez - sadece başlatılıncaya kadar. Bir hizmetin hazır olmasını beklemeniz gerekiyorsa, bkz. Bu sorunla ilgili daha fazla bilgi için başlangıç ​​siparişini kontrol etme ve çözme stratejileri.


124
2017-09-23 10:19



Cevabın, v1 dosyası oluşturmak için tasarlandığını netleştirmek için cevabımı güncelledim. - Xiongbing Jin
Bunun için teşekkürler. - Windsooon
Bu hala sürüm 3 için geçerli mi? - faviouz
Evet, bir göz atın https://docs.docker.com/compose/compose-file/compose-versioning/ - Windsooon
"Bu, veritabanını localhost portundan 32777 (konteynerde 3306) bağlayabileceğiniz anlamına gelir. Ancak, docker-compose-dosyasında port bağlantı noktasını belirtirseniz, bu portu yeniden başlattığınızda veya kapsayıcıyı her kaldırdığınızda bu bağlantı noktası değişir. . Ve bu soru özellikle docker-compose ile ilgili olduğundan, docker run Burada tamamen alakasız, bu zaten konteynerin nasıl çalıştırılacağı değil. Neyi kaçırıyorum? - Andrew Savinykh


[Eylül 2016'yı Güncelle]: Bu yanıt, docker dosyası v1 için hazırlandı (aşağıdaki örnek oluşturma dosyasında gösterildiği gibi). V2 için @Windsooon tarafından verilen diğer cevaba bakınız.

[Orijinal cevap]:

Belgelerinde oldukça açık. depends_on bağımlılığın ve konteynerin yaratılma sırasına karar verir ve links sadece bunlar değil, aynı zamanda

Bağlantılı hizmete yönelik kapsayıcılar, takma adla aynı olan bir ana makine adıyla veya takma ad belirtilmemişse hizmet adında erişilebilir.

Örneğin, aşağıdakileri varsayarak docker-compose.yml dosya:

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

db:
  image: postgres:latest

cache:
  image: redis:latest

İle links, içinde kodu web kullanarak veritabanına erişebilecek db:54325432 numaralı bağlantı noktasında db görüntüsü. Eğer depends_on kullanıldı, bu mümkün olmazdı, ancak kapların başlangıç ​​siparişi doğru olurdu.


40
2018-03-06 20:46



Bana bir örnek verebilirmisin? Çünkü bu kısım hala belirsiz olduğum kısım. Belki onu daha özel hale getirebilecek başka bir dosya dosyası seçeneği vardır. Lütfen daha fazla bilgi verin. Teşekkürler! - itsjef
Cevabım için bir örnek ekledim - Xiongbing Jin
Çok teşekkür ederim! Anladım. Son bir soru, lütfen. Öyleyse, özel durumumda, raylarımı uygularım, kullanmalı mıyım? links veya depends_on ya da bunların ikisi iyi mi? Benim akımım docker-compose.yml kullanımları depends_on ve işler iyi çalışıyor gibi görünüyor. :) - itsjef
name: port, ifşa kullandığınızda bile bağlantı oluşturmadan çalışır: - Amit Goldstein
"Eğer eğer variable_on kullanıldıysa, bu mümkün olmazdı, fakat konteynırların başlangıç ​​sırası doğru olurdu." Bu doğru değil. Eğer sadece depends_on kullanırsan işe yarar. Hala erişebilirsin db içinde web veritabanları ana bilgisayar adını kullanarak. - prog.Dusan