Bagaimana cara menghubungkan layanan Docker di seluruh host?

115

Docker memungkinkan server dari beberapa kontainer untuk terhubung satu sama lain melalui tautan dan penemuan layanan . Namun, dari apa yang saya lihat, penemuan layanan ini bersifat lokal-host. Saya ingin menerapkan layanan yang menggunakan layanan lain yang dihosting di komputer berbeda.

Ada beberapa pendekatan untuk menyelesaikan masalah ini di Docker, seperti CoreOSjumpers , layanan host-lokal yang pada dasarnya melakukan proxy ke mesin lain, dan sejumlah besar proyek github untuk mengelola penerapan Docker yang tampaknya berusaha mendukung kasus penggunaan ini. .

Mengingat kecepatan perkembangan, sulit untuk mengikuti praktik terbaik saat ini. Oleh karena itu pertanyaan saya pada dasarnya adalah:

  1. Apa (jika ada) adalah metode utama saat ini untuk menghubungkan antar host di Docker, dan
  2. Apakah ada rencana untuk mendukung fungsionalitas ini secara langsung di sistem Docker?
lyschoening
sumber

Jawaban:

58

Memperbarui

Docker baru -baru ini mengumumkan alat baru yang disebut Swarm untuk orkestrasi Docker.

Kawanan memungkinkan Anda melakukan "bergabung" dengan beberapa daemon buruh pelabuhan: Anda pertama kali membuat swarm, memulai swarm manager di satu mesin, dan meminta daemon buruh pelabuhan "bergabung" dengan swarm manager menggunakan pengenal swarm. Klien buruh pelabuhan terhubung ke swarm manager seolah-olah itu adalah server buruh pelabuhan biasa.

Ketika sebuah kontainer dimulai dengan Swarm, itu secara otomatis ditetapkan ke node gratis yang memenuhi batasan apa pun yang telah ditentukan. Contoh berikut diambil dari postingan blog:

$ docker run -d -P -e constraint:storage=ssd mysql

Salah satu batasan yang didukung adalah "node"memungkinkan Anda menyematkan container ke nama host tertentu. Gerombolan itu juga menyelesaikan tautan di seluruh node.

Dalam pengujian saya, saya mendapat kesan bahwa Swarm belum bekerja dengan volume di lokasi tetap dengan sangat baik (atau setidaknya proses menautkannya tidak terlalu intuitif), jadi ini adalah sesuatu yang perlu diingat.

Swarm sekarang dalam fase beta.


Hingga saat ini, Pola Ambassador adalah satu-satunya pendekatan bawaan Docker untuk penemuan layanan host jarak jauh. Pola ini masih dapat digunakan dan tidak memerlukan sihir apa pun selain Docker biasa karena pola tersebut terdiri dari satu atau beberapa kontainer tambahan yang bertindak sebagai proxy.

Selain itu, ada beberapa ekstensi pihak ketiga untuk membuat Docker berkemampuan cluster. Solusi pihak ketiga meliputi:

  • Menghubungkan jembatan jaringan Docker pada dua host, solusi ringan dan beragam ada, tetapi umumnya dengan beberapa peringatan
  • Penemuan berbasis DNS misalnya dengan skydock dan SkyDNS
  • Alat manajemen Docker seperti Shipyard , dan alat orkestrasi Docker. Lihat pertanyaan ini untuk daftar lengkap: Bagaimana menskalakan kontainer Docker dalam produksi
lyschoening
sumber
2
Jadi pada dasarnya masih ada cara untuk menghubungkan kontainer lintas host yang tidak melibatkan pola ambasador atau melewati buruh pelabuhan dan berbicara langsung dengan lxc?
pengguna3012759
@ user3012759 Pola Duta adalah satu-satunya cara asli yang ditetapkan, tetapi Swarm (dalam alfa) adalah cara asli lain yang bekerja dengan mengganti penjadwal Docker. Maaf atas tanggapan yang terlambat.
lyschoening
SkyDock belum (belum: 03/2015) menyertakan dukungan multi-host . Registrator (proyek sederhana yang dapat bekerja dengan SkyDNS) melakukannya, tetapi konfigurasinya lebih manual (layanan harus memiliki port yang dipetakan ke port host).
turtlemonvh
6
Investigasi sepintas saya tentang swarm menunjukkan bahwa itu difokuskan pada manajemen cluster dan bukan konektivitas antar-host. Kekurangan ini dengan jelas dinyatakan oleh demo Docker sendiri youtube.com/watch?v=M4PFY6RZQHQ&t=3m37s
Bruno Bronosky
1
@lyschoening Docker mengumumkan jaringan multi host asli yang mungkin ingin Anda perbarui jawabannya
Thomasleveil
15

PERBARUI 3

Libswarm telah diubah namanya menjadi swarm dan sekarang menjadi aplikasi terpisah.

Berikut adalah demo halaman github untuk digunakan sebagai titik awal:

# create a cluster
$ swarm create
6856663cdefdec325839a4b7e1de38e8

# on each of your nodes, start the swarm agent
#  <node_ip> doesn't have to be public (eg. 192.168.0.X),
#  as long as the other nodes can reach it, it is fine.
$ swarm join --token=6856663cdefdec325839a4b7e1de38e8 --addr=<node_ip:2375>

# start the manager on any machine or your laptop
$ swarm manage --token=6856663cdefdec325839a4b7e1de38e8 --addr=<swarm_ip:swarm_port>

# use the regular docker cli
$ docker -H <swarm_ip:swarm_port> info
$ docker -H <swarm_ip:swarm_port> run ... 
$ docker -H <swarm_ip:swarm_port> ps 
$ docker -H <swarm_ip:swarm_port> logs ...
...

# list nodes in your cluster
$ swarm list --token=6856663cdefdec325839a4b7e1de38e8
http://<node_ip:2375>

UPDATE 2

Pendekatan resmi sekarang adalah menggunakan libswarm, lihat demo di sini

MEMPERBARUI

Ada intisari yang bagus untuk komunikasi host openvswitch di buruh pelabuhan menggunakan pendekatan yang sama.

Untuk memungkinkan penemuan layanan, ada pendekatan menarik berdasarkan DNS yang disebut skydock .

Ada juga screencast .


Ini juga artikel yang bagus menggunakan potongan puzzle yang sama tetapi juga menambahkan vlan di atas:

http://fbevmware.blogspot.it/2013/12/coupling-docker-and-open-vswitch.html

Penambalan tidak ada hubungannya dengan kekuatan solusi. Docker sebenarnya hanyalah sejenis DSL di Linux Containers dan kedua solusi dalam artikel ini hanya melewati beberapa pengaturan otomatis Docker dan kembali langsung ke Linux Containers.

Jadi Anda dapat menggunakan solusi dengan aman dan menunggu untuk dapat melakukannya dengan cara yang lebih sederhana setelah Docker akan mengimplementasikannya.

tommasop
sumber
2
Belum banyak aktivitas di libswarm akhir-akhir ini. Saya ingin tahu apakah tim buruh pelabuhan bergerak ke arah lain?
Raman
12

Menenun adalah teknologi jaringan virtual Docker baru yang bertindak sebagai sakelar ethernet virtual melalui TCP / UDP - yang Anda butuhkan hanyalah container Docker yang menjalankan Weave di host Anda.

Yang menarik disini adalah

  • Alih-alih tautan, gunakan IP statis / nama host di jaringan virtual Anda
  • Host tidak memerlukan konektivitas penuh, mesh dibentuk berdasarkan peer yang tersedia, dan paket akan dialihkan ke multi-hop ke tempat yang mereka tuju

Ini mengarah ke skenario menarik seperti

  • Buat jaringan virtual di seluruh WAN, tidak ada kontainer Docker yang akan tahu atau peduli di jaringan apa mereka sebenarnya
  • Pindahkan kontainer Anda ke host buruh pelabuhan fisik yang berbeda, Weave akan mendeteksi rekan yang sesuai

Misalnya, ada contoh panduan tentang cara membuat cluster Cassandra multi-node di laptop Anda dan beberapa host cloud (EC2) dengan dua perintah per host. Saya meluncurkan cluster CoreOS dengan AWS CloudFormation, menginstal weave di masing-masing in / home / core, ditambah VM buruh pelabuhan gelandangan laptop saya, dan mendapatkan cluster dalam waktu kurang dari satu jam. Laptop saya memiliki firewall tetapi Weave tampaknya baik-baik saja dengan itu, hanya terhubung ke sesama EC2.

Stuart Charlton
sumber
Dari apa yang saya pahami, weave adalah overlay jaringan yang berfungsi di dalam container untuk konektivitas layanan, sedangkan swarm adalah teknologi pengelompokan yang memperluas CLI buruh pelabuhan untuk orkestrasi infrastruktur. Konektivitas infra perlu dilakukan di luar swarm (misalnya menggunakan sakelar biasa) dan orkestrasi layanan di luar tenunan (misalnya menggunakan Mesos / Kubernetes). Apakah ini sesuai dengan ide Anda tentang cara kerjanya?
Henrik
Begini cara saya melihatnya: docker compose adalah tentang penautan dan orkestrasi container, kumpulan buruh pelabuhan adalah tentang menjalankan buruh pelabuhan di banyak host buruh pelabuhan, socketplane (sekarang dimiliki oleh buruh pelabuhan) dan menenun keduanya adalah jaringan overlay. Socketplane didasarkan pada openvswitch yang biasanya digunakan untuk overlay di VM (misalnya openstack); Di sisi lain, menenun hanya untuk buruh pelabuhan. Dari semua ini, Mesos / Kubernetes / Lattice adalah pengganti untuk kumpulan buruh pelabuhan dengan pengalaman pengguna dan tingkat skalabilitas yang agak berbeda dari CLI buruh pelabuhan.
Stuart Charlton
7

Memperbarui

Docker 1.12 berisi apa yang disebut mode swarm dan juga menambahkan serviceabstraksi. Mereka mungkin tidak cukup dewasa untuk setiap kasus penggunaan, tapi saya sarankan Anda untuk terus mengamati mereka. Mode swarm setidaknya membantu dalam pengaturan multi-host, yang tidak selalu membuat penautan lebih mudah. Server DNS internal Docker (sejak 1.11) akan membantu Anda mengakses nama kontainer, jika mereka terkenal - artinya nama yang dihasilkan dalam konteks Swarm tidak akan mudah untuk diatasi.


Dengan rilis Docker 1.9 Anda akan mendapatkan jaringan multi host yang dibangun . Mereka juga menyediakan contoh skrip untuk menyediakan cluster kerja dengan mudah.

Anda memerlukan penyimpanan K / V (mis. Konsul) yang memungkinkan untuk berbagi status di berbagai mesin Docker pada setiap host. Setiap mesin Docker perlu dikonfigurasi dengan penyimpanan K / V itu dan Anda kemudian dapat menggunakan Swarm untuk menghubungkan host Anda.

Kemudian Anda membuat jaringan overlay baru seperti ini:

$ docker network create --driver overlay my-network

Container sekarang dapat dijalankan dengan nama jaringan sebagai parameter run:

$ docker run -itd --net=my-network busybox

Mereka juga dapat terhubung ke jaringan saat sudah berjalan:

$ docker network connect my-network my-container

Detail selengkapnya tersedia di dokumentasi .

gesellix
sumber
6

Artikel berikut menjelaskan dengan baik bagaimana menghubungkan kontainer buruh pelabuhan pada banyak host: http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/

paweloque.dll
sumber
1
Itu memang solusi yang sangat bagus; Saya telah menemukannya juga. Yang saya khawatirkan adalah bahwa artikel itu baru diposting kemarin dan itu membutuhkan patch Docker. (Mengingat betapa baru-baru ini diposting, saya akan menunggu sedikit untuk melihat apakah mereka menggabungkan tambalan itu ke Docker).
lyschoening
Docker sedang dalam tahap pengembangan awal, mungkin belum semua persyaratan jelas dan persyaratan yang ditentukan tidak semuanya diterapkan. Oleh karena itu perlu dilakukan penambalan.
paweloque
2
Ini bukan jawaban. Salin jawaban dari artikel terkait. Itu adalah standar SO.
Bruno Bronosky
6

Dimungkinkan untuk menjembatani beberapa subnet Docker bersama-sama menggunakan Open vSwitch atau Tinc. Saya telah menyiapkan Gists untuk menunjukkan bagaimana melakukannya:

Keuntungan yang saya lihat menggunakan solusi ini daripada --linkopsi dan pola duta besar adalah saya merasa lebih transparan: tidak perlu memiliki kontainer tambahan dan yang lebih penting, tidak perlu mengekspos port pada host. Sebenarnya saya memikirkan --linkopsi untuk menjadi peretasan sementara sebelum Docker mendapatkan cerita yang lebih baik tentang pengaturan multi-host (atau multi-daemon).

Catatan: Saya tahu ada jawaban lain yang menunjuk ke Inti pertama saya, tetapi saya tidak memiliki cukup karma untuk mengedit atau mengomentari jawaban itu.

perlu
sumber
Bagaimana Anda melakukan deteksi layanan? Katakanlah jika saya memiliki Redis di satu mesin dan aplikasi klien di komputer lain, bagaimana aplikasi klien akan mendapatkan IP layanan Redis?
lyschoening
Dengan cara yang sama Anda akan melakukannya pada satu host: menyediakan sendiri IP / port untuk layanan yang baru dimulai, atau menggunakan penyimpanan kunci / nilai (mis. Etcd) atau menggunakan DNS yang dapat ditanyakan oleh layanan. Saya suka menggunakan DNS karena banyak layanan yang ada dapat menggunakannya tanpa modifikasi.
diperhatikan
1

Seperti disebutkan di atas, Weave jelas merupakan solusi yang layak untuk menghubungkan kontainer Docker di seluruh host. Berdasarkan pengalaman saya sendiri, cukup mudah untuk menyiapkannya. Sekarang juga memiliki layanan DNS yang dapat Anda atasi wadah dengan nama DNS-nya.

Di sisi lain, ada Flanel CoreOS dan Opencontrail Juniper untuk memasang kabel kontainer di seluruh host.

pengguna2661697
sumber
1

Sepertinya kawanan buruh pelabuhan 1.14memungkinkan Anda untuk:

  • Memasukkan nama host ke penampung, menggunakan --hostnametag, tetapi saya belum dapat membuatnya berfungsi, penampung tidak dapat melakukan ping satu sama lain dengan nama host yang ditetapkan.

  • menugaskan layanan ke mesin menggunakan --constraint 'node.hostname == <host>'

saikek
sumber