Saya memiliki dua docker-compose.yml
file terpisah di dua folder berbeda:
~/front/docker-compose.yml
~/api/docker-compose.yml
Bagaimana saya bisa memastikan bahwa sebuah wadah front
dapat mengirim permintaan ke sebuah wadah api
?
Saya tahu bahwa --default-gateway
opsi dapat diatur menggunakan docker run
wadah individu, sehingga alamat IP tertentu dapat ditetapkan untuk wadah ini, tetapi tampaknya opsi ini tidak tersedia saat menggunakan docker-compose
.
Saat ini saya akhirnya melakukan docker inspect my_api_container_id
dan melihat gateway di output. Ini berfungsi tetapi masalahnya adalah bahwa IP ini dikaitkan secara acak, jadi saya tidak bisa mengandalkannya.
Bentuk lain dari pertanyaan ini adalah:
- Bisakah saya mengaitkan alamat IP tetap ke wadah tertentu menggunakan docker-compose?
Tetapi pada akhirnya yang saya cari adalah:
- Bagaimana dua proyek yang terdiri dari pekerja pelabuhan yang berbeda dapat berkomunikasi satu sama lain?
networking
docker
docker-compose
Jivan
sumber
sumber
Jawaban:
Anda hanya perlu memastikan bahwa wadah yang ingin Anda bicarakan satu sama lain berada di jaringan yang sama. Jaringan adalah konstruksi buruh pelabuhan kelas satu, dan tidak spesifik untuk menulis.
...
Mereka kemudian dapat berbicara satu sama lain menggunakan nama layanan. Dari
front
yang bisa Anda lakukanping api
dan sebaliknya.sumber
name
properti, yang akan menonaktifkan pra-otomatis dengan nama proyek. Kemudian salah satu proyek dapat menggunakan jaringan itu dan membuatnya secara otomatis jika belum ada.Hanya sedikit jawaban untuk jawaban luar biasa @ johnharris85, ketika Anda menjalankan file penulisan buruh pelabuhan,
default
jaringan dibuat " " sehingga Anda bisa menambahkannya ke file penulisan lainnya sebagai jaringan eksternal:...
Bagi saya pendekatan ini lebih cocok karena saya tidak memiliki file menulis-buruh pelabuhan pertama dan ingin berkomunikasi dengannya.
sumber
services:
tag, sintaxnetworks:
kemudian akan bersarangfront_default:
(menghapus "-") dan kemudian kita membuat IP statis:ipv4_address: '172.20.0.44'
UPDATE: Pada penulisan file versi 3.5:
Ini sekarang berfungsi:
docker-compose up -d
akan bergabung dengan jaringan yang disebut 'custom_network'. Jika tidak ada, itu akan dibuat!Sekarang, Anda bisa melakukan ini:
Ini akan membuat wadah yang akan berada di jaringan eksternal.
Saya belum dapat menemukan referensi di dokumen tetapi itu berhasil!
sumber
Semua kontainer dari
api
dapat bergabung dengan jaringanfront
default dengan konfigurasi berikut:Lihat panduan penulisan buruh pelabuhan: menggunakan jaringan yang sudah ada sebelumnya (lihat di bagian bawah)
sumber
Informasi posting sebelumnya benar, tetapi tidak memiliki rincian tentang cara menautkan wadah, yang harus dihubungkan sebagai "external_links".
Semoga contoh ini memperjelas bagi Anda:
Misalkan Anda memiliki app1 / docker-compose.yml, dengan dua layanan (svc11 dan svc12), dan app2 / docker-compose.yml dengan dua layanan lagi (svc21 dan svc22) dan anggap Anda perlu terhubung dengan mode yang dilintasi:
svc11 perlu terhubung ke wadah svc22
Jadi konfigurasinya harus seperti ini:
ini app1 / docker-compose.yml:
ini app2 / docker-compose.yml:
sumber
Sejak Compose 1.18 (spec 3.5), Anda bisa mengganti jaringan default menggunakan nama kustom Anda sendiri untuk semua file Compose YAML yang Anda butuhkan. Ini sesederhana menambahkan yang berikut kepada mereka:
Jawaban lain menunjuk hal yang sama; ini adalah ringkasan yang disederhanakan.
sumber
Saya akan memastikan semua kontainer berada
docker-compose
di jaringan yang sama dengan menyusunnya bersamaan, menggunakan:sumber
link
ataudepends_on
dari satu wadah depan ke satu wadah api?build path ~/front/api either does not exist or is not accessible
atau dengan sebaliknya,build path ~/api/front either does not exist or is not accessible
UPDATE: Pada penulisan file versi 3.5:
Saya menemukan masalah yang sama dan saya menyelesaikannya dengan menambahkan perubahan kecil di salah satu proyek docker-compose.yml saya.
Misalnya kita memiliki dua api
scoring
danner
.Scoring
api perlu mengirim permintaan kener
api untuk memproses permintaan input. Untuk melakukan itu mereka berdua harus berbagi jaringan yang sama.Catatan: Setiap kontainer memiliki jaringannya sendiri yang secara otomatis dibuat pada saat menjalankan aplikasi di dalam buruh pelabuhan. Misalnya ner jaringan api akan dibuat seperti
ner_default
dan jaringan scoring api akan dinamakan sebagaiscoring default
. Solusi ini akan berfungsi untuk versi: '3'.Seperti dalam skenario di atas api penilaian saya ingin berkomunikasi dengan ner api maka saya akan menambahkan baris berikut. Yang berarti Setiap kali saya membuat wadah untuk ner api maka secara otomatis ditambahkan ke jaringan scoring_default.
ner / docker-compose.yml
scoring / docker-compose.yml
Kita dapat melihat ini bagaimana wadah di atas sekarang menjadi bagian dari jaringan yang sama yang disebut
scoring_default
menggunakan perintah:sumber
Anda dapat menambahkan
.env
file di semua proyek Anda yang berisiCOMPOSE_PROJECT_NAME=somename
.COMPOSE_PROJECT_NAME mengesampingkan awalan yang digunakan untuk menyebutkan sumber daya, karena itu semua proyek Anda akan digunakan
somename_default
sebagai jaringan mereka, sehingga memungkinkan layanan berkomunikasi satu sama lain seperti mereka berada di proyek yang sama.NB: Anda akan mendapatkan peringatan untuk kontainer "yatim" yang dibuat dari proyek lain.
sumber
sumber
docker-compose.yml kedua
sumber
Pilihan lain adalah menjalankan modul pertama dengan 'docker-compose' periksa ip yang terkait dengan modul, dan hubungkan modul kedua dengan jaring sebelumnya seperti eksternal, dan arahkan ip internal
contoh app1 - jaringan baru yang dibuat di jalur layanan, tandai sebagai eksternal: true di bagian bawah app2 - menunjukkan "jaringan baru" yang dibuat oleh app1 ketika naik, tandai sebagai eksternal: benar di bawah, dan atur di config untuk terhubung, ip yang dimiliki app1 di internet ini.
Dengan ini, Anda harus dapat berbicara satu sama lain
* cara ini hanya untuk fokus uji lokal, agar tidak melakukan konfigurasi yang terlalu rumit ** Saya tahu ini sangat 'tambalan' tetapi berfungsi untuk saya dan saya pikir sangat sederhana sehingga beberapa yang lain dapat mengambil keuntungan dari ini
sumber
Jika Anda
Connection refused
sambil mencoba berkomunikasi antara dua wadahDan kamu mau
api_a
berkomunikasi keapi_b
(atau sebaliknya) tanpa "jaringan buruh pelabuhan" yang sama(contoh di bawah)
Anda dapat menggunakan "host" wadah kedua sebagai IP komputer Anda dan port yang dipetakan dari dalam wadah Docker. Anda dapat memperoleh IP komputer Anda dengan skrip ini (dari: Menemukan alamat IP lokal menggunakan stdlib Python ):
Contoh:
project_api_a/docker-compose.yml
:di dalam
api_a
wadah Anda menjalankan aplikasi Django:manage.py runserver 0.0.0.0:8000
dan docker-compose.yml kedua dari proyek lain:
project_api_b/docker-compose-yml
:di dalam
api_b
wadah Anda menjalankan aplikasi Django:manage.py runserver 0.0.0.0:8001
Dan mencoba menghubungkan dari wadah
api_a
keapi_b
URL kemudianapi_b
wadah itu adalah:http://<get_ip_from_script_above>:8001/
Ini bisa sangat berharga jika Anda menggunakan lebih dari dua (tiga atau lebih) proyek pembuatan docker dan sulit untuk menyediakan jaringan bersama untuk semua itu - solusi dan solusi yang baik
sumber