Perbedaan antara tautan dan depend_on di docker_compose.yml

292

Menurut dokumentasi file penulisan Docker Compose :

  • depends_on - Ketergantungan ekspres antar layanan.
  • links- Tautan ke kontainer di layanan lain dan juga mengekspresikan ketergantungan antara layanan dengan cara yang sama seperti depend_on .

Saya tidak mengerti tujuan menghubungkan ke wadah lain sehingga perbedaan antara dua opsi masih tampak sulit bagi saya.

Akan lebih mudah jika ada contoh, tetapi saya tidak dapat menemukannya.

Saya perhatikan, ketika saya menautkan wadah B dengan wadah A maka wadah B akan "pingable" di dalam cangkang wadah A.

Saya berlari ping Bdi dalam wadah A bashdan mendapat hasil seperti ini (hanya untuk referensi, gambar dari Internet)

masukkan deskripsi gambar di sini

itu jef
sumber
6
The --linkflag sekarang fitur warisan ditinggalkan dari Docker dan dokumentasi menunjukkan "Ini mungkin akhirnya akan dihapus" Docker: Legacy link kontainer . Disarankan untuk tidak menggunakan fitur jaringan Docker atau metode penulisan docker. Saya pikir ini akan membantu siapa pun di sini yang mempelajari fitur ini.
Bintang

Jawaban:

122

Pos perlu diperbarui setelah linksopsi tersebut tidak digunakan lagi.

Pada dasarnya, linkstidak diperlukan lagi karena tujuan utamanya, membuat wadah dapat dijangkau oleh orang lain dengan menambahkan variabel lingkungan, dimasukkan secara tersirat dengan network. Ketika kontainer ditempatkan di jaringan yang sama, mereka dapat dijangkau oleh satu sama lain menggunakan nama wadah mereka dan alias lainnya sebagai tuan rumah.

Sebab docker run, --linkjuga sudah usang dan harus diganti oleh jaringan kustom.

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

depends_onmengekspresikan urutan awal (dan urutan penarik gambar secara implisit), yang merupakan efek samping yang baik links.

Siyu
sumber
13
StackOverflow umum, mengapa saya harus gulir ke bawah di bawah 147 dan 43 jawaban poin untuk menemukan jawaban 1 poin yang sebenarnya yang terbaik.
u8it
3
@ u8it Ini sifat waktu dan internet.
Michael Cole
Bagaimana melakukan hal yang sama dalam menulis buruh pelabuhan? Saya pikir bahwa dengan buruh pelabuhan menulis semua layanan sudah dalam jaringan yang sama dan tidak perlu menambahkan apa pun Masih menghubungkan antar wadah tidak berfungsi jika salah satu wadah mencoba terhubung ke wadah yang tidak dalam status Siap.
makkasi
Saya tidak dapat melihat informasi tentang tautan yang tidak digunakan lagi di dok versi dok doker : doks.docker.com/compose/compose-file/#links . Saya tidak melihat opsi ini terlalu berguna, karena kami telah berbagi jaringan dan depend_on, tetapi itu tidak usang jika saya membaca dokumen dengan benar (mereka hanya menyebutkan flag -link pada wadah buruh pelabuhan).
rideronthestorm
Catatan: wadah (sebenarnya layanan) dalam jaringan yang sama dapat diakses dengan nama layanan, bukan nama wadah. Dokumentasi resmi: docs.docker.com/compose/networking/#links
GarryOne
194

Jawaban ini untuk versi docker-compose 2 dan ini juga berfungsi pada versi 3

Anda masih dapat mengakses data saat menggunakan depend_on.

Jika Anda melihat dokumen buruh pelabuhan Docker Compose dan Django , Anda masih dapat mengakses database seperti ini:

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

Apa perbedaan antara tautan dan depend_on?

tautan:

Saat Anda membuat wadah untuk basis data, misalnya:

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

docker inspect d54cf8a0fb98 |grep HostPort

Dan Anda mungkin menemukan

"HostPort": "32777"

Ini berarti Anda dapat menghubungkan database dari port host lokal Anda 32777 (3306 dalam wadah) tetapi port ini akan berubah setiap kali Anda me-restart atau menghapus wadah. Jadi Anda bisa menggunakan tautan untuk memastikan Anda akan selalu terhubung ke database dan tidak harus tahu port mana itu.

web:
  links:
   - db

tergantung pada:

Saya menemukan blog yang bagus dari Giorgio Ferraris Docker-compose.yml: dari V1 ke V2

Ketika docker-compose mengeksekusi file V2, maka secara otomatis akan membangun jaringan antara semua kontainer yang ditentukan dalam file, dan setiap kontainer akan segera dapat merujuk ke yang lain hanya menggunakan nama yang ditentukan dalam file docker-compose.yml.

Dan

Jadi kita tidak perlu tautan lagi; tautan digunakan untuk memulai komunikasi jaringan antara wadah db kami dan wadah server-web kami, tetapi ini sudah dilakukan oleh pembuat docker

Memperbarui

tergantung pada

Ketergantungan ekspres antar layanan, yang memiliki dua efek:

  • docker-compose upakan memulai layanan dalam urutan ketergantungan. Pada contoh berikut, db dan redis akan dimulai sebelum web.
  • docker-compose up SERVICEakan secara otomatis menyertakan dependensi SERVICE. Pada contoh berikut, web pembuat docker juga akan membuat dan memulai db dan redis.

Contoh sederhana:

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

Catatan: depend_on tidak akan menunggu db dan redis menjadi "siap" sebelum memulai web - hanya sampai mereka sudah dimulai. Jika Anda perlu menunggu layanan siap, lihat Mengontrol pesanan startup untuk lebih lanjut tentang masalah ini dan strategi untuk menyelesaikannya.

Windsooon
sumber
Saya telah memperbarui jawaban saya untuk menjelaskan bahwa jawaban itu dimaksudkan untuk menulis file v1.
Xiongbing Jin
1
Apakah ini masih berlaku untuk versi 3?
fabiomaia
Ya, Anda mungkin melihathttps://docs.docker.com/compose/compose-file/compose-versioning/
Windsooon
"Ini berarti Anda dapat menghubungkan database dari port host lokal Anda 32777 (3306 dalam wadah) Tapi port ini akan berubah setiap kali Anda me-restart atau menghapus wadah" tidak jika Anda menentukan port yang mengikat dalam file komposisi pembuat pelabuhan, itu tidak akan . Dan karena pertanyaan ini secara khusus tentang komposisi buruh pelabuhan, saya merasa bahwa contoh dengan di docker runsini sama sekali tidak relevan, itu bukan bagaimana wadah akan dijalankan. Apa yang saya lewatkan?
Andrew Savinykh
Ya, Anda benar jika Anda menentukan port. docker run Contoh saya ingin menunjukkan mengapa kita perlu menggunakan depend_on atau tautan alih-alih menuliskan nomor port dengan hard-code. Hanya karena jika Anda tidak menentukannya, itu berubah setiap waktu. Saya pikir ini akan membuat orang mengerti lebih banyak tentang depend_on atau tautan.
Windsooon
50

[Pembaruan Sep 2016]: Jawaban ini ditujukan untuk file komposisi buruh pelabuhan v1 (seperti yang ditunjukkan oleh sampel file penulisan di bawah). Untuk v2, lihat jawaban lain oleh @Windsooon.

[Jawaban asli]:

Cukup jelas dalam dokumentasi. depends_onmemutuskan ketergantungan dan urutan pembuatan wadah dan linkstidak hanya melakukan ini, tetapi juga

Kontainer untuk layanan tertaut akan dapat dijangkau dengan nama host yang identik dengan alias, atau nama layanan jika tidak ada alias yang ditentukan.

Misalnya, dengan asumsi docker-compose.ymlfile berikut :

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

db:
  image: postgres:latest

cache:
  image: redis:latest

Dengan links, kode di dalamnya webakan dapat mengakses database menggunakan db:5432, dengan asumsi port 5432 terpapar dalam dbgambar. Jika depends_ondigunakan, ini tidak akan mungkin, tetapi urutan startup wadah akan benar.

Xiongbing Jin
sumber
Bisakah Anda memberi saya contoh? Karena bagian itu masih belum jelas. Mungkin ada opsi file penulisan lainnya yang mungkin membuatnya lebih spesifik. Harap berikan perincian lebih lanjut. Terima kasih!
itsjef
Terima kasih banyak! Saya mendapatkannya. Tolong, satu pertanyaan terakhir. Jadi, dalam kasus tertentu saya, aku penggelaran aplikasi rel saya, harus saya gunakan linksatau depends_onatau salah satu dari mereka ok? docker-compose.ymlKegunaan depends_ondan hal-hal saya saat ini tampaknya berfungsi dengan baik. :)
itsjef
Jika Anda tidak perlu langsung mengakses wadah lain name:portmaka depends_onok.
Xiongbing Jin
9
name: port berfungsi bahkan tanpa menautkan saat Anda menggunakan expose:
Amit Goldstein
7
"Jika depend_on digunakan, ini tidak akan mungkin, tetapi urutan startup dari wadah akan benar." Ini tidak benar. Ini akan berhasil jika Anda hanya menggunakan depend_on. Anda masih dapat mengakses Anda dbdalam webdatabase hostname menggunakan.
prog.Dusan