Docker hizmetleri ana bilgisayarlar arasında nasıl bağlanır?


115

Docker , birden çok kapsayıcıdaki sunucuların bağlantılar ve hizmet keşfi yoluyla birbirine bağlanmasına izin verir . Ancak, görebildiğim kadarıyla bu hizmet keşfi ana bilgisayar yerel. Farklı bir makinede barındırılan diğer hizmetleri kullanan bir hizmet uygulamak istiyorum.

Bu sorunu Docker'da çözmek için CoreOS'larjumpers , esasen diğer makineye vekil olan ana bilgisayar yerel hizmetleri ve bu kullanım durumunu desteklemeye çalışmış gibi görünen Docker dağıtımlarını yönetmek için bir sürü github projesi gibi çeşitli yaklaşımlar mevcuttur. .

Gelişimin hızı göz önüne alındığında, mevcut en iyi uygulamaların ne olduğunu takip etmek zordur. Bu nedenle sorum şu:

  1. Docker'daki ana bilgisayarlar arasında bağlantı kurmak için mevcut baskın yöntem (varsa) nedir ve
  2. Bu işlevselliği doğrudan Docker sisteminde desteklemek için herhangi bir plan var mı?

Yanıtlar:


58

Güncelleme

Docker, yakın zamanda Docker orkestrasyonu için Swarm adlı yeni bir aracı duyurdu .

Swarm , birden çok docker arka planını "birleştirmenize" izin verir: Önce bir sürü yaratırsınız, bir makinede bir sürü yöneticisi başlatırsınız ve sürünün tanımlayıcısını kullanarak sürü yöneticisine "katılır". Docker istemcisi, sürü yöneticisine normal bir docker sunucusuymuş gibi bağlanır.

Bir konteyner Swarm ile başladığında, tanımlanmış olan tüm kısıtlamaları karşılayan ücretsiz bir düğüme otomatik olarak atanır. Aşağıdaki örnek blog gönderisinden alınmıştır:

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

Desteklenen kısıtlamalardan biri "node", bir konteyneri belirli bir ana bilgisayar adına sabitlemenize izin vermesidir. Sürü ayrıca düğümler arasındaki bağlantıları da çözer.

Testlerimde, Swarm'ın henüz sabit bir konumda hacimlerle çok iyi çalışmadığı izlenimini edindim (veya en azından onları bağlama süreci çok sezgisel değil), bu yüzden bu akılda tutulması gereken bir şey.

Swarm artık beta aşamasındadır.


Yakın zamana kadar, Büyükelçi Modeli , uzak ana bilgisayar hizmeti keşfine yönelik tek Docker yerel yaklaşımıydı. Bu model hala kullanılabilir ve düz Docker'ın ötesinde bir sihir gerektirmez, çünkü model proxy olarak hareket eden bir veya daha fazla ek kaptan oluşur.

Ek olarak, Docker kümesine uygun hale getirmek için çeşitli üçüncü taraf uzantıları vardır. Üçüncü taraf çözümleri şunları içerir:

  • Docker ağ köprülerini iki ana bilgisayarda bağlamak, hafif ve çeşitli çözümler mevcuttur, ancak genellikle bazı uyarılar vardır
  • DNS tabanlı keşif, ör. Skydock ve SkyDNS ile
  • Tersane ve Docker düzenleme araçları gibi Docker yönetim araçları. Kapsamlı bir liste için bu soruya bakın: Üretimde Docker konteynerleri nasıl ölçeklendirilir

2
Yani temelde, konteynırları ambasador modelini içermeyen veya docker'ı atlayıp doğrudan lxc ile konuşmayan ana bilgisayarları birbirine bağlamanın hala bir yolu yok mu?
user3012759

@ user3012759 Ambassador Pattern tek yerleşik yerel yöntemdir, ancak Swarm (alfa olarak) Docker zamanlayıcısını değiştirerek çalışan başka bir yerel yoldur. Geç cevap için özür dilerim.
2014

SkyDock (henüz 03/2015) çoklu ana bilgisayar desteği içermiyor . Registrator (SkyDNS ile çalışabilen basit bir proje) yapar, ancak yapılandırma daha manueldir (hizmetler, ana bilgisayar bağlantı noktalarına eşlenmiş bağlantı noktalarına sahip olmalıdır).
turtlemonvh

6
Sürü üzerine üstünkörü araştırmam, bunun ana bilgisayarlar arası bağlantıya değil, küme yönetimine odaklandığını gösteriyor. Bu eksiklik,
Docker'ın

1
@lyschoening Docker , cevabınızı güncellemek isteyebileceğiniz yerel çoklu ana bilgisayar ağını duyurdu
Thomasleveil

15

GÜNCELLEME 3

Libswarm, swarm olarak yeniden adlandırıldı ve artık ayrı bir uygulama.

İşte başlangıç ​​noktası olarak kullanılacak github sayfası demosu:

# 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>

GÜNCELLEME 2

Resmi yaklaşım şimdi libswarm kullanmaktır burada bir demo görün

GÜNCELLEME

Docker'da aynı yaklaşımı kullanan openvswitch ana bilgisayarlarının iletişiminin güzel bir özü vardır .

Hizmet keşfine izin vermek için skydock adı verilen DNS'ye dayalı ilginç bir yaklaşım vardır .

Ayrıca bir ekran yayını da var .


Bu aynı zamanda bulmacanın aynı parçalarını kullanan ancak üstüne vlans ekleyen güzel bir makale:

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

Yama uygulamasının çözümün sağlamlığıyla hiçbir ilgisi yoktur. Docker, aslında Linux Kapsayıcıları üzerinde sadece bir tür DSL'dir ve bu makalelerdeki her iki çözüm de bazı Docker otomatik ayarlarını atlar ve doğrudan Linux Kapsayıcılarına geri döner.

Böylece çözümleri güvenli bir şekilde kullanabilir ve Docker bunu uyguladığında daha basit bir şekilde yapabilmeyi bekleyebilirsiniz.


2
Son zamanlarda libswarm'da pek hareket olmadı. Liman işçisi ekibi başka bir yönde mi ilerliyor acaba?
Raman

12

Weave , TCP / UDP üzerinden sanal bir ethernet anahtarı görevi gören yeni bir Docker sanal ağ teknolojisidir - tek ihtiyacınız olan şey, ana makinenizde Weave çalıştıran bir Docker konteyneridir.

Burada ilginç olan şey

  • Bağlantılar yerine, sanal ağınızda statik IP'ler / ana bilgisayar adları kullanın
  • Ana bilgisayarlar tam bağlantıya ihtiyaç duymazlar, mevcut eşlere bağlı olarak bir ağ oluşturulur ve paketler gitmeleri gereken yere çok atlamalı olarak yönlendirilir.

Bu, aşağıdaki gibi ilginç senaryolara yol açar

  • WAN üzerinden sanal bir ağ oluşturun, Docker konteynerlerinin hiçbiri hangi gerçek ağda bulunduklarını bilmeyecek veya önemsemeyecek
  • Konteynerlerinizi farklı fiziksel liman ana bilgisayarlarına taşıyın, Weave eşleri buna göre algılar

Örneğin, dizüstü bilgisayarınızda çok düğümlü Cassandra kümesinin nasıl oluşturulacağına dair örnek bir kılavuz ve ana bilgisayar başına iki komutla birkaç bulut (EC2) ana bilgisayarı var. AWS CloudFormation ile bir CoreOS kümesi başlattım, her bir / ev / çekirdekte örgü ve ayrıca dizüstü bilgisayar serseri docker sanal makinemi kurdum ve bir saatin altında bir küme oluşturdum. Dizüstü bilgisayarım güvenlik duvarına sahip ancak Weave bununla iyi görünüyor, sadece EC2 eşlerine bağlanıyor.


Anladığım kadarıyla weave, hizmet bağlantısı için kapsayıcıların içinde çalışan bir ağ katmanı iken, swarm, docker CLI'yi altyapı düzenlemesi için genişleten bir kümeleme teknolojisidir. İnfra bağlantısının sürü dışında yapılması (örneğin normal anahtarlar kullanılarak) ve örgü dışında hizmet düzenlemesi (örneğin Mesos / Kubernetes kullanılarak) gerekir. Bu nasıl çalıştığına dair fikrinize uyuyor mu?
Henrik

Buna şöyle bakacağım: docker compose, konteyner bağlama ve orkestrasyonla ilgili, docker swarm, docker'ı birçok docker ana bilgisayarında çalıştırmakla ilgilidir, socketplane (şimdi docker'a aittir) ve weave, her ikisi de overlay ağlarıdır. Soket düzlemi, genellikle sanal makinelerde yer paylaşımları için kullanılan openvswitch'e dayanır (ör. Openstack); Öte yandan Weave, yalnızca docker içindir. tüm bunların dışında, Mesos / Kubernetes / Lattice, docker CLI'den biraz farklı kullanıcı deneyimleri ve ölçeklenebilirlik seviyeleri ile docker sürüsünün yerini alıyor.
Stuart Charlton

7

Güncelleme

Docker 1.12, sözde sürü modunu içerir ve ayrıca bir servicesoyutlama ekler . Muhtemelen her kullanım durumu için yeterince olgun değillerdir, ancak onları gözlem altında tutmanızı öneririm. Sürü modu en azından çoklu ana bilgisayar kurulumuna yardımcı olur, bu da bağlantıyı kolaylaştırmaz. Docker-dahili DNS sunucusu (1.11'den beri), eğer iyi biliniyorlarsa, konteyner adlarına erişmenize yardımcı olacaktır - bu, bir Swarm bağlamında üretilen adların adreslenmesi o kadar kolay olmayacağı anlamına gelir.


Docker 1.9 sürümüyle, yerleşik çoklu ana bilgisayar ağına sahip olacaksınız . Ayrıca , çalışan bir kümeyi kolayca sağlamak için örnek bir komut dosyası sağlarlar .

Her ana bilgisayardaki farklı Docker motorları arasında durumu paylaşmanıza izin veren bir K / V deposuna (örneğin Consul) ihtiyacınız olacak. Her Docker motorunun o K / V deposu ile yapılandırılması gerekir ve ardından ana bilgisayarlarınızı bağlamak için Swarm'ı kullanabilirsiniz.

Ardından, bunun gibi yeni bir yer paylaşımlı ağ oluşturursunuz:

$ docker network create --driver overlay my-network

Kapsayıcılar artık çalıştırma parametresi olarak ağ adı ile çalıştırılabilir:

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

Zaten çalışırken bir ağa da bağlanabilirler:

$ docker network connect my-network my-container

Belgelerde daha fazla ayrıntı mevcuttur .


6

Aşağıdaki makale, birden çok ana bilgisayarda docker konteynerlerinin nasıl bağlanacağını güzel bir şekilde açıklamaktadır: http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/


1
Bu gerçekten çok güzel bir çözüm; Ben de karşılaştım. Endişelendiğim şey, makalenin daha dün gönderilmiş olması ve bir Docker yaması gerektirmesi. (Ne kadar yakın zamanda yayınlandığını düşünürsek, bu yamayı Docker ile birleştirip birleştirmediklerini görmek için biraz beklerdim).
2014

Docker erken bir geliştirme aşamasındadır, muhtemelen tüm gereksinimler henüz net değildir ve tanımlanan gereksinimlerin tümü uygulanmamıştır. Bu nedenle yama gerekli.
paweloque

2
Bu bir cevap değil. Cevabı bağlantılı makaleden kopyalayın. SO standardı budur.
Bruno Bronosky

6

Open vSwitch veya Tinc kullanarak birkaç Docker alt ağını birbirine köprülemek mümkündür. Nasıl yapılacağını göstermek için Gists'i hazırladım:

--linkSeçenek ve büyükelçi modeli yerine bu çözümü kullandığım için gördüğüm avantaj , onu daha şeffaf bulmam: ek konteynerlere gerek yok ve daha da önemlisi, ana bilgisayarda bağlantı noktalarını açığa çıkarmaya gerek yok. Aslında --linkDocker çoklu ana bilgisayar (veya çoklu arka plan programı) kurulumları hakkında daha güzel bir hikaye edinmeden önce geçici bir hack seçeneği olduğunu düşünüyorum .

Not: İlk özüme işaret eden başka bir cevap olduğunu biliyorum, ancak bu cevabı düzenlemek veya yorumlamak için yeterli karmam yok.


Hizmet tespitini nasıl yaparsınız? Bir makinede Redis ve başka bir makinede bir istemci uygulamam varsa, istemci uygulaması Redis hizmetinin IP'sini nasıl alır?
2014

Aynı şekilde, bunu tek bir ana bilgisayarda yaparsınız: yeni başlatılan hizmetlere IP / bağlantı noktası sağlamak veya bir anahtar / değer deposu (örn. Etcd) kullanmak veya hizmetlerin sorgulayabileceği bir DNS kullanmak. DNS kullanmayı seviyorum çünkü mevcut birçok servis onu değiştirmeden kullanabilir.
2014, 08:35

1

Yukarıda belirtildiği gibi Weave , Docker konteynerlerini ana bilgisayarlar arasında bağlamak için kesinlikle uygun bir çözümdür. Onunla ilgili kendi deneyimlerime dayanarak, onu kurmak oldukça basittir. Artık, kapsayıcıların DNS adlarına göre adresleyebileceğiniz DNS hizmeti de var .

Öte yandan, konteynerleri ana bilgisayarlara kablolamak için CoreOS Flannel ve Juniper's Opencontrail var.


1

Görünüşe göre docker swarm 1.14şunları yapmanıza izin veriyor:

  • ana bilgisayar adını kapsayıcıya atamak, --hostnameetiketi kullanarak , ancak çalışmasını sağlayamadım, kapsayıcılar atanmış ana bilgisayar adlarıyla birbirlerine ping atamıyorlar .

  • kullanarak makineye hizmet atama --constraint 'node.hostname == <host>'

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.