Ana bilgisayarın dışından bir docker kapsayıcısına nasıl bağlanılır (aynı ağ) [Windows]


89

İlk docker container'ımı oluşturdum, Go kullanarak bir sunucu çalıştırıyor ancak ona ana bilgisayarın dışından erişemiyorum. Docker ile yeni başladım, bu yüzden burada biraz kayboldum.

Bu yüzden, bir sunucuyu başlatan çok basit bir Go kodum var, Go'yu kuran ve kodu bir Linux temel görüntüsünde oluşturan docker görüntüsünü oluşturdum. Sunucuyu 8080 numaralı bağlantı noktasında çalıştırıyorum, bu nedenle bu bağlantı noktasını kapsayıcıyı şu şekilde çalıştıran ana bilgisayara gösteriyorum:

docker run -p 8080:8080 dockertest

Bu işe yarıyor ve sunucuya docker'in makine IP'si ( başlatıldığında Docker Quickstart Terminalinde görünen) aracılığıyla erişiyorum, sorun şu ki barındırdığım web sitesine ana bilgisayarın dışından erişemiyorum, bu yüzden denersem telefonumda aynı IP adresini açmak bana bir hata veriyor: Bu web sayfası kullanılamıyor (ERR_CONNECTION_TIMED_OUT).

IP'yi de şu şekilde belirtmeyi denedim:

docker run -p 192.168.0.157:8080:8080 dockertest

Ancak bunu yaptığımda web sitesine ne docker makinesinin IP'si ne de yukarıdaki komut satırında belirtilen IP üzerinden erişebiliyorum. Ayrıca bu komutta hangi IP'yi yazmam gerektiğinden emin değilim, bilgisayarımın IP'sini kullandım, 127.0.0.1'i (localhost) da denedim ama bu bana aynı sonucu verdi: web sitesine herhangi bir Her neyse IP.

Bu sorunu googledim ve birçok StackOverflow sorusu buldum, ancak sorunumu çözmeme yardımcı olmadı, çoğu Linux veya Mac'e yönelikti, bu yüzden çözüm durumuma uygulanmadı.

Ayrıca, Go kodunu bilgisayarımda çalıştırabilir ve web sitesine aynı ağdaki başka bir cihazdan bilgisayarımın IP'si aracılığıyla erişebilirim. Docker makinesinde çalıştırdığımda neden ona erişemediğimi anlamıyorum, IP yönlendirme veya başka bir şeyle ilgisi olabileceği aklıma geldi ama ağ oluşturma konusunda tam bir çaylakım, ben Çoğunlukla bir web geliştiricisiyim ve yerel olarak neredeyse hiç tecrübem yok.


Dockerfile'ınızda -p seçeneği ile birlikte EXPOSE 8080 kullandınız mı? Ayrıca, kapsayıcınızın çalıştığı kutudaki 8080 numaralı bağlantı noktasının güvenlik kurallarınız tarafından engellenmediğini kontrol edin.
keda

@keda Evet, Dockerfile EXPOSE 8080 içeriyor. Konteyneri bilgisayarımda Docker Quickstart Terminali üzerinden yerel olarak çalıştırıyorum, ayrıca Windows güvenlik duvarını devre dışı bırakmayı denedim ama bu da işe yaramadı, bazı ayarlar var mı bilmiyorum eksik
redsalt

Yanıtlar:


91

TL; DR VirtualBox ana makinenizin ağ modunu kontrol edin - bridgedsanal makinenin (ve barındırdığı Docker konteynerinin) yerel ağınızda erişilebilir olmasını istiyorsanız bu olmalıdır .


Sizin kafa karışıklığınız, uygulamanıza HTTP aracılığıyla erişmek için hangi ana bilgisayara bağlanacağınızdan kaynaklanıyor gibi görünüyor. Yapılandırmanızın ne olduğunu gerçekten açıklamadınız - etiketlerinizde "Windows" ve "VirtualBox" olduğu gerçeğine dayanarak bazı tahminlerde bulunacağım.

Bir Windows ana bilgisayarında VirtualBox'ta çalışan bir Linux çeşidi üzerinde çalışan Docker'ınız olduğunu tahmin ediyorum. IP adreslerini aşağıdaki gibi etiketleyeceğim:

D = Docker konteynerinin IP adresi

L = VirtualBox'ta çalışan Linux ana bilgisayarının IP adresi

W = Windows ana bilgisayarının IP adresi

Go uygulamanızı Windows ana makinenizde çalıştırdığınızda, ona http://W:8080/yerel ağınızın herhangi bir yerinden bağlanabilirsiniz . Bu, Go uygulamasının Windows makinesinde 8080 numaralı bağlantı noktasını ve IP adresinde 8080 numaralı bağlantı noktasına erişmeye çalışan herkesi bağladığı için çalışır.W bağlanır.

Ve işte burada daha karmaşık hale geliyor:

VirtualBox, bir sanal makine (VM) kurduğunda, ağı birkaç farklı moddan birinde yapılandırabilir. Farklı seçeneklerin ne olduğunu hatırlamıyorum ama senin istediğin şey bridged. Bu modda VirtualBox, sanal makineyi ağınızdaki bağımsız bir makineymiş gibi yerel ağınıza bağlar, tıpkı ağınıza takılı diğer makineler gibi. In bridgedmodunda sanal makine başka bir makine gibi ağınızdaki görünür. Diğer modlar işleri farklı şekilde ayarlar ve makine ağınızda görünmez.

Dolayısıyla, Linux ana bilgisayarı ( bridged) için ağı doğru bir şekilde kurduğunuzu varsayarsak, Linux ana bilgisayarı yerel ağınızda bir IP adresine (192.168.0.x gibi bir şey) sahip olacak ve Docker konteynerinize adresinden erişebileceksiniz http://L:8080/.

Linux ana bilgisayarı bridgedsizden farklı bir moda ayarlanmışsa , olabilir , Windows ana bilgisayardan erişmek mümkün, ancak bu İçinde tam olarak ne modu bağlıdır gidiyor.

DÜZENLE - Aşağıdaki yorumlara dayanarak, yukarıda anlattığım durumun doğru olduğuna çok benziyor.

Biraz yedekleyelim: Docker'ın bilgisayarımda nasıl çalıştığı burada (Ubuntu Linux).

Elinizde aynı komutunu çalıştırın düşünün: docker run -p 8080:8080 dockertest. Bunun yaptığı şey, dockertestgörüntüye dayalı yeni bir kapsayıcı başlatmak ve Linux ana bilgisayarındaki (benim bilgisayarım) 8080 numaralı bağlantı noktasını kapsayıcıdaki 8080 bağlantı noktasına iletmektir. Docker, Docker daemon'un iletişim kurmasına ve konteynerlerin birbiriyle iletişim kurmasına izin vermek için kendi dahili ağını (kendi IP adresleri kümesiyle) kurar. Yani temelde bununla yaptığınız -p 8080:8080şey Docker'ın dahili ağını "harici" ağa bağlamaktır - yani. ana bilgisayarın ağ bağdaştırıcısı - belirli bir bağlantı noktasında.

Şimdiye kadar benimle? Tamam, şimdi bir adım geri gidip sisteminize bakalım. Makineniz Windows çalıştırıyor - Docker (şu anda) Windows üzerinde çalışmıyor, bu nedenle kullandığınız araç bir VirtualBox sanal makinesinde bir Linux ana bilgisayarı kurdu. Bunu docker runortamınızda yaptığınızda, tam olarak aynı şey olur - Linux ana bilgisayarındaki 8080 bağlantı noktası, kapsayıcıdaki 8080 bağlantı noktasına bağlanır. Buradaki en büyük fark, Windows ana makinenizin, konteynerin çalıştığı Linux ana bilgisayarı olmamasıdır, bu nedenle burada başka bir katman vardır ve bu katman boyunca sorunla karşılaştığınız iletişim.

İhtiyacınız olan şey iki şeyden biridir:

  1. Docker konteynerini ana bilgisayar bağlantı noktasına bağladığınız gibi, VirtualBox VM'deki 8080 numaralı bağlantı noktasını Windows ana bilgisayarındaki 8080 numaralı bağlantı noktasına bağlamak için.

  2. VirtualBox VM'yi doğrudan yerel ağınıza bridgedyukarıda anlattığım ağ modu ile bağlamak için .

İlk seçeneğe giderseniz, kapsayıcıya Windows ana bilgisayarının IP adresi veya ana bilgisayar adının http://W:8080olduğu yerden erişebileceksiniz W. İkincisini seçerseniz, kapsayıcıya Linux VM'nin IP adresi veya ana bilgisayar adı http://L:8080olduğu yerden erişebileceksiniz L.

İşte tüm üst düzey açıklama bu - şimdi VirtualBox VM'nin yapılandırmasını nasıl değiştireceğinizi bulmanız gerekiyor. Ve işte size gerçekten yardımcı olamayacağım yer - Windows makinenizde tüm bunları yapmak için hangi aracı kullandığınızı bilmiyorum ve Windows üzerinde Docker kullanımına hiç aşina değilim.

VirtualBox yapılandırma penceresine ulaşabilirseniz, aşağıda açıklanan değişiklikleri yapabilirsiniz. Ayrıca VM'leri değiştirecek bir komut satırı istemcisi var, ancak buna aşina değilim.

İçin bridgedmodu (ve bu gerçekten en basit bir seçimdir), senin VM kapatmaya üstündeki "Ayarlar" butonuna tıklayın ve ağ modunu değiştirmek bridged, daha sonra VM yeniden başlatın ve sen iyi gitmek. Sanal makine, DHCP aracılığıyla yerel ağınızdan bir IP adresi almalı ve bu IP adresindeki ağdaki diğer bilgisayarlar tarafından görülebilmelidir.


1
Yalnızca 2 IP bulabiliyorum, Docker'ın Hızlı Başlangıç ​​Terminalini (192.168.99.100) açtığımda ve bilgisayarımın sahip olduğu (192.168.0.157) IP'yi kullanarak docker run -p 8080:8080 dockertestweb siteme http://192.168.99.100:8080yalnızca Windows bilgisayarımdan erişebiliyorum ( ana bilgisayar) ve telefonumdan değil. Kullanırsam docker run -p 192.168.0.157:8080:8080 dockertestherhangi bir IP ile web sitesine herhangi bir yerden erişemiyorum. Ağı nasıl kuracağımdan emin değilim, kullanmayı denedim --net=bridgeama bu da işe yaramadı. VirtualBox'ı açmam gerekiyor mu? Docker terminalini kullanarak yapamaz mıyım?
redsalt

Sorun Docker'da değil, bu yüzden hayır, Docker size yardımcı olamaz. Neler olduğunu düşündüğümü göstermek için bazı düzenlemeler ekleyeceğim.
Kryten

Tamam teşekkürler! Şimdi anlıyorum, bütün Linux sanal makine kısmı kafamı karıştırıyordu. Docker'ın dokunmamam gereken dahili şeyler için Virtual Box kullandığını düşünüyordum. Aslında çok kolaydı, sadece bridgedVirtual Box'a geçmek zorunda kaldım ve şimdi harikalar yaratıyor, çok teşekkür ederim.
redsalt

Aynı ağda pencerelere ve docker konteynerlerine sahip olmanın bir yolu yok mu, böylece konteynerlere port yönlendirme olmadan doğrudan erişebilir miyiz?
Vituel

Jupyter sunucusunu docker'da çalıştırmayı ararken ve ona LAN üzerinden erişmeye çalışırken bu konuda tökezledi. Modu köprülü olarak değiştirdikten sonra L'nin ne olduğunu bulabilir miyim?
PaulDong

122
  1. Oracle VM VirtualBox Manager'ı açın
  2. Docker tarafından kullanılan sanal makineyi seçin
  3. Ayarlar -> Ağ'ı tıklayın
  4. Bağdaştırıcı 1 (varsayılan?) "Eklendi: NAT"
  5. Gelişmiş -> Bağlantı Noktası Yönlendirme'yi tıklayın.
  6. Kural ekleyin: Protokol TCP, Ana Bilgisayar Bağlantı Noktası 8080, Konuk Bağlantı Noktası 8080 (Ana Bilgisayar IP'sini ve Konuk IP'sini boş bırakın)
  7. Misafir, docker konteynırınız ve Host, makineniz

Artık localhost: 8080 ve dahili-ipiniz: 8080 aracılığıyla konteynırınıza göz atabilmelisiniz.


10
Onaylandı, hoş ve kolay.
Dirk

2
en iyi cevap, seçilen gibi büyük bir açıklama yok
Amir Qayyum Khan

2
serseri kullanıcılar için bunu vagrantfile'a ekleyin: config.vm.network "forwarded_port", guest: 8080, host: 8080, protocol: "tcp"
Vince Verhoeven

3
Yo! Bu harika çalıştı! Teşekkürler!!!! Bunu anlamaya çalışmak için saatler harcıyorum.
Joseph Freeman

2
Bu, Docker'ı VBox üzerinden çalıştıran herkes için harika bir çözüm!
Mirodinho

7

Birkaç şeyi denedikten sonra, bu benim için çalıştı:

  • --publish = 0.0.0.0: 8080: 8080 docker bayrağını kullanın
  • sanal kutu ağ modunu NAT olarak ayarlayın ve herhangi bir bağlantı noktası yönlendirme kullanmayın

0.0.0.0Benim dışındaki adreslerle başarılı olamadım.


4

TLDR: Windows Güvenlik Duvarını etkinleştirdiyseniz, özel ağlarda "vpnkit" için bir istisna olduğundan emin olun.

Özel durumum için, yerel ağımdaki başka bir makineden kapsayıcımın yayınlanan bağlantı noktasını ziyaret etmeye çalıştığımda Windows Güvenlik Duvarı'nın bağlantımı engellediğini keşfettim, çünkü devre dışı bırakmak her şeyin çalışmasını sağladı.

Ancak, kapsayıcımın hizmetine erişebilmek için güvenlik duvarını tamamen devre dışı bırakmak istemedim. Bu, konteyner hizmetimin adına hangi "uygulamanın" dinlediği sorusunu akla getirdi. Bana makinemdeki dinleme soketlerinin arkasındaki uygulamaları keşfetmeyi öğreten başka bir SO iş parçacığı bulduktan sonra , bunun Windows Güvenlik Duvarı ayarlarımda zaten bir girişe sahip netstat -a -bolduğunu öğrendim vpnkit.exe: ancak "özel ağlar" üzerinde devre dışı bırakıldı ve Bir kez etkinleştirdikten sonra, güvenlik duvarını tamamen devre dışı bırakmak zorunda kalmadan başka bir makineden kapsayıcımın hizmetini ziyaret edebildim.


Efendim, beni saatler süren hayal kırıklığından kurtardınız. Teşekkürler.
Behdad

2

Bu, Windows kullanıcılarının Docker Container'ları çalıştırırken karşılaştıkları en yaygın sorundur. IMO bu "Docker'daki milyon dolarlık soru"; @ "Rocco Smit" haklı olarak "gelen trafiğin ana makinemin güvenlik duvarında varsayılan olarak devre dışı bırakıldığını" belirtti; benim durumumda, McAfee Anti Virus yazılımım. McAfee'nin Güvenlik Duvarı Ayarlarında aynı Wifi LAN üzerindeki diğer bilgisayarlardan gelen trafiğe izin verilecek ek bağlantı noktaları ekledim; o zaman sihirdi. Tüm internet, SO, Docker belgeleri, Docker Ağı ile ilgili Öğreticilerden Sonra Öğreticiler ve "macvlan", "ipvlan", "için" Windows'ta desteklenmiyor "resimlerini tararken bir haftadan fazla bir süredir mücadele ettim. tanımlı köprü "ve hatta bu aynı SO iş parçacığı birkaç kez. Hatta Google'a "Docker in Production kullanan herkes?" İle göz atmaya başladım, (evet, Linux'un Prod iş yükleri için Windows sunucularına kıyasla daha popüler olduğunu biliyorum) (aynı Ev kablosuz ağındaki cep telefonumdan) ve nginx'e erişemediğim için Windows'ta Docker Container'da dağıtılan uygulama. Sonuçta, uygulamaya (bir Docker Container'da konuşlandırılmış) aynı LAN'daki diğer bilgisayarlardan / cihazlardan erişemiyorsanız, bu ne kadar iyi? Sonuçta benim durumumda, sorun yalnızca gelen trafiği engelleyen bir güvenlik duvarıyla ilgiliydi; En azından aynı LAN'daki diğer bilgisayarlardan / cihazlardan uygulamaya (bir Docker Container'da konuşlandırılmış) erişemiyorsanız; Sonuçta benim durumumda, sorun yalnızca gelen trafiği engelleyen bir güvenlik duvarıyla ilgiliydi; En azından aynı LAN'daki diğer bilgisayarlardan / cihazlardan uygulamaya (bir Docker Container'da konuşlandırılmış) erişemiyorsanız; Sonuçta benim durumumda, sorun yalnızca gelen trafiği engelleyen bir güvenlik duvarıyla ilgiliydi;


0

-P bağlantı noktası değerlerini ayarlamanın yanı sıra Windows için Docker'ın vpnkit kullandığını ve bunun için gelen trafiğin ana makinemin güvenlik duvarında varsayılan olarak devre dışı bırakıldığını gördüm. Vpnkit için gelen TCP kurallarını etkinleştirdikten sonra, konteynerlerime yerel ağdaki diğer makinelerden erişebildim.

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.