Bagaimana menghubungkan ke kontainer buruh pelabuhan dari luar host (jaringan yang sama) [Windows]

89

Saya telah membuat kontainer buruh pelabuhan pertama saya, itu menjalankan server menggunakan Go tetapi saya tidak dapat mengaksesnya dari luar komputer host. Saya baru saja mulai dengan buruh pelabuhan jadi saya sedikit tersesat di sini.

Jadi saya memiliki kode Go yang sangat sederhana yang memulai server, saya telah membangun image buruh pelabuhan yang menginstal Go dan membangun kode dalam image dasar Linux. Saya menjalankan server pada port 8080 jadi saya mengekspos port itu ke host yang menjalankan wadah seperti ini:

docker run -p 8080:8080 dockertest

Itu berfungsi dan saya dapat mengakses server melalui IP mesin buruh pelabuhan (yang muncul di Terminal Mulai Cepat Docker saat dimulai), masalahnya adalah saya tidak dapat mengakses situs web yang saya hosting dari luar host, jadi jika saya mencoba untuk membuka alamat IP yang sama di ponsel saya, ini hanya memberi saya kesalahan: Halaman web ini tidak tersedia (ERR_CONNECTION_TIMED_OUT).

Saya juga mencoba menentukan IP seperti ini:

docker run -p 192.168.0.157:8080:8080 dockertest

Tetapi ketika saya melakukannya, saya tidak dapat mengakses situs web melalui IP mesin buruh pelabuhan atau IP yang ditentukan pada baris perintah di atas. Saya juga tidak yakin IP mana yang harus saya tulis dalam perintah itu.Saya menggunakan IP komputer saya, saya juga mencoba 127.0.0.1 (localhost) tetapi itu memberi saya hasil yang sama: tidak dapat mengakses situs web melalui apa pun IP apa pun.

Saya telah mencari masalah ini di Google dan menemukan banyak pertanyaan StackOverflow tetapi tidak membantu saya memecahkan masalah saya, kebanyakan dari mereka berorientasi ke Linux atau Mac sehingga solusinya tidak berlaku untuk situasi saya.

Selain itu, saya dapat menjalankan kode Go di komputer saya dan mengakses situs web dari perangkat lain di jaringan yang sama melalui IP komputer saya. Saya tidak mengerti mengapa saya tidak dapat mengaksesnya ketika saya menjalankannya di mesin buruh pelabuhan, terpikir oleh saya bahwa itu mungkin ada hubungannya dengan penerusan IP atau sesuatu tetapi saya benar-benar noob dalam jaringan, saya kebanyakan adalah pengembang web dan hampir tidak memiliki pengalaman dalam bahasa asli.

garam merah
sumber
apakah Anda menggunakan EXPOSE 8080 di Dockerfile Anda bersama dengan opsi -p? Juga, periksa untuk melihat bahwa port 8080 pada kotak di sana wadah Anda berjalan tidak diblokir oleh aturan keamanan Anda.
keda
@keda Ya, Dockerfile memang mengandung EXPOSE 8080. Saya menjalankan kontainer secara lokal di komputer saya melalui Terminal Mulai Cepat Docker, saya juga mencoba menonaktifkan firewall Windows tetapi tidak berhasil juga, saya tidak tahu apakah ada beberapa pengaturan hilang
redsalt

Jawaban:

91

TL; DR Periksa mode jaringan host VirtualBox Anda - seharusnya bridgedjika Anda ingin mesin virtual (dan kontainer Docker yang dihostingnya) dapat diakses di jaringan lokal Anda.


Sepertinya kebingungan Anda terletak pada host mana yang akan disambungkan untuk mengakses aplikasi Anda melalui HTTP. Anda belum benar-benar menjelaskan apa konfigurasi Anda - Saya akan membuat beberapa tebakan, berdasarkan fakta bahwa Anda memiliki "Windows" dan "VirtualBox" di tag Anda.

Saya menduga Anda memiliki Docker yang berjalan pada beberapa rasa Linux yang berjalan di VirtualBox pada host Windows. Saya akan memberi label alamat IP sebagai berikut:

D = alamat IP wadah Docker

L = alamat IP dari host Linux yang berjalan di VirtualBox

W = alamat IP dari host Windows

Saat Anda menjalankan aplikasi Go di host Windows, Anda dapat menyambungkannya http://W:8080/dari mana saja di jaringan lokal Anda. Ini berfungsi karena aplikasi Go mengikat port 8080 pada mesin Windows dan siapa pun yang mencoba mengakses port 8080 di alamat IP Wakan terhubung.

Dan di sinilah menjadi lebih rumit:

VirtualBox, ketika menyiapkan mesin virtual (VM), dapat mengonfigurasi jaringan dalam salah satu dari beberapa mode berbeda. Saya tidak ingat apa semua opsi yang berbeda, tetapi yang Anda inginkan adalah bridged. Dalam mode ini, VirtualBox menghubungkan mesin virtual ke jaringan lokal Anda seolah-olah itu adalah mesin yang berdiri sendiri di jaringan, sama seperti mesin lain yang dicolokkan ke jaringan Anda. Dibridged mode, mesin virtual muncul di jaringan Anda seperti mesin lainnya. Mode lain mengatur semuanya secara berbeda dan mesin tidak akan terlihat di jaringan Anda.

Jadi, dengan asumsi Anda mengatur jaringan dengan benar untuk host Linux ( bridged), host Linux akan memiliki alamat IP di jaringan lokal Anda (seperti 192.168.0.x) dan Anda akan dapat mengakses container Docker di http://L:8080/.

Jika host Linux diatur ke beberapa mode selain bridged, Anda mungkin dapat mengakses dari host Windows, tetapi ini akan tergantung pada mode apa yang digunakan.

EDIT - berdasarkan komentar di bawah, sepertinya situasi yang saya jelaskan di atas benar.

Mari kita mundur sedikit: inilah cara kerja Docker di komputer saya (Ubuntu Linux).

Bayangkan saya menjalankan perintah yang sama yang Anda miliki: docker run -p 8080:8080 dockertest. Apa yang dilakukannya adalah memulai penampung baru berdasarkan dockertestgambar dan meneruskan (sambungkan) port 8080 pada host Linux (PC saya) ke port 8080 pada penampung. Docker menyiapkan jaringan internalnya sendiri (dengan kumpulan alamat IP-nya sendiri) untuk memungkinkan daemon Docker berkomunikasi dan mengizinkan kontainer untuk berkomunikasi satu sama lain. Jadi pada dasarnya apa yang Anda lakukan dengan itu -p 8080:8080adalah menghubungkan jaringan internal Docker dengan jaringan "eksternal" - mis. adaptor jaringan host - pada port tertentu.

Denganku sejauh ini? Oke, sekarang mari mundur selangkah dan lihat sistem Anda. Mesin Anda menjalankan Windows - Docker tidak (saat ini) berjalan di Windows, jadi alat yang Anda gunakan telah menyiapkan host Linux di mesin virtual VirtualBox. Ketika Anda melakukan docker rundi lingkungan Anda, hal yang persis sama terjadi - port 8080 pada host Linux terhubung ke port 8080 pada container. Perbedaan besar di sini adalah bahwa host Windows Anda bukanlah host Linux tempat penampung dijalankan, jadi ada lapisan lain di sini dan itu adalah komunikasi di seluruh lapisan ini di mana Anda mengalami masalah.

Yang Anda butuhkan adalah salah satu dari dua hal:

  1. untuk menghubungkan port 8080 pada VirtualBox VM ke port 8080 pada host Windows, seperti Anda menghubungkan kontainer Docker ke port host.

  2. untuk menghubungkan VM VirtualBox langsung ke jaringan lokal Anda dengan bridgedmode jaringan yang saya jelaskan di atas.

Jika Anda memilih opsi pertama, Anda akan dapat mengakses wadah di http://W:8080mana Walamat IP atau nama host dari host Windows. Jika Anda memilih yang kedua, Anda akan dapat mengakses penampung di http://L:8080mana Lalamat IP atau nama host dari VM Linux.

Jadi itu semua penjelasan tingkat yang lebih tinggi - sekarang Anda perlu mencari cara untuk mengubah konfigurasi VM VirtualBox. Dan di sinilah saya benar-benar tidak dapat membantu Anda - Saya tidak tahu alat apa yang Anda gunakan untuk melakukan semua ini di mesin Windows Anda dan saya sama sekali tidak terbiasa menggunakan Docker di Windows.

Jika Anda dapat membuka jendela konfigurasi VirtualBox, Anda dapat membuat perubahan yang dijelaskan di bawah ini. Ada juga klien baris perintah yang akan memodifikasi VM, tetapi saya tidak terbiasa dengannya.

Untuk bridgedmode (dan ini benar-benar pilihan yang paling sederhana), matikan VM Anda, klik tombol "Pengaturan" di bagian atas, dan ubah mode jaringan ke bridged, lalu mulai ulang VM dan Anda siap melakukannya. VM harus mengambil alamat IP di jaringan lokal Anda melalui DHCP dan harus terlihat oleh komputer lain di jaringan di alamat IP tersebut.

Kryten
sumber
1
Saya hanya dapat menemukan 2 IP, yang ditampilkan Docker ketika saya membuka Quickstart Terminal (192.168.99.100) dan yang dimiliki komputer saya (192.168.0.157), menggunakan docker run -p 8080:8080 dockertestsaya dapat mengakses situs web saya menggunakan http://192.168.99.100:8080tetapi hanya dari komputer Windows saya ( host) dan bukan dari ponsel saya. Jika saya menggunakan, docker run -p 192.168.0.157:8080:8080 dockertestsaya tidak dapat mengakses situs web dengan IP apa pun dari mana pun. Saya tidak yakin bagaimana mengatur jaringan, saya mencoba menggunakan --net=bridgetetapi tidak berhasil juga. Apakah saya seharusnya membuka VirtualBox? Tidak bisakah saya melakukannya menggunakan terminal Docker?
redsalt
Masalahnya bukan pada Docker, jadi tidak, Docker tidak dapat membantu Anda. Saya akan menambahkan beberapa pengeditan untuk mengilustrasikan apa yang menurut saya sedang terjadi.
Kryten
Oke terima kasih! Sekarang saya mengerti, saya menjadi bingung dengan seluruh bagian mesin virtual Linux. Saya mendapat kesan Docker menggunakan Virtual Box untuk hal-hal internal yang seharusnya tidak saya sentuh. Itu sebenarnya sangat mudah, saya hanya perlu mengubahnya bridgeddi Virtual Box dan sekarang bekerja dengan sangat baik, terima kasih banyak.
redsalt
Apakah tidak ada cara untuk memiliki windows dan container docker di jaringan yang sama, sehingga kita dapat mengakses container secara langsung tanpa port forwarding?
Vituel
Tersandung pada ini ketika mencari untuk menjalankan server Jupyter di buruh pelabuhan dan mencoba mengaksesnya melalui LAN. Apakah saya bisa mengetahui apa itu L setelah mengganti mode ke bridged?
PaulDong
122
  1. Buka Oracle VM VirtualBox Manager
  2. Pilih VM yang digunakan oleh Docker
  3. Klik Pengaturan -> Jaringan
  4. Adaptor 1 harus (default?) Menjadi "Terlampir ke: NAT"
  5. Klik Advanced -> Port Forwarding
  6. Tambahkan aturan: Protocol TCP, Host Port 8080, Guest Port 8080 (biarkan IP Host dan IP Tamu kosong)
  7. Tamu adalah kontainer buruh pelabuhan Anda dan Host adalah mesin Anda

Sekarang Anda dapat menjelajahi container Anda melalui localhost: 8080 dan your-internal-ip: 8080.

Davey Chu
sumber
10
Dikonfirmasi, bagus dan mudah.
Dirk
2
jawaban terbaik, tidak ada deskripsi besar seperti yang dipilih
Amir Qayyum Khan
2
untuk pengguna gelandangan, tambahkan ini di vagrantfile: config.vm.network "forwarded_port", tamu: 8080, host: 8080, protokol: "tcp"
Vince Verhoeven
3
Yo! Ini bekerja dengan sangat baik! Terima kasih!!!! Saya menghabiskan waktu berjam-jam mencoba memikirkan yang satu ini.
Joseph Freeman
2
Ini adalah solusi fantastis bagi siapa saja yang menjalankan Docker melalui VBox!
Mirodinho
7

Setelah mencoba beberapa hal, ini berhasil untuk saya:

  • gunakan bendera buruh pelabuhan --publish = 0.0.0.0: 8080: 8080
  • setel mode jaringan kotak virtual ke NAT, dan jangan gunakan penerusan port apa pun

Dengan alamat selain 0.0.0.0saya tidak berhasil.

mnieber
sumber
4

TLDR: Jika Anda mengaktifkan Windows Firewall, pastikan bahwa ada pengecualian untuk "vpnkit" di jaringan pribadi.

Untuk kasus khusus saya, saya menemukan bahwa Windows Firewall memblokir koneksi saya ketika saya mencoba mengunjungi port yang diterbitkan penampung saya dari komputer lain di jaringan lokal saya, karena menonaktifkannya membuat semuanya berfungsi.

Namun, saya tidak ingin menonaktifkan firewall sepenuhnya agar saya dapat mengakses layanan penampung saya. Ini menimbulkan pertanyaan tentang "aplikasi" mana yang mendengarkan atas nama layanan penampung saya. Setelah menemukan utas SO lain yang mengajari saya cara menggunakan netstat -a -buntuk menemukan aplikasi di balik soket pendengaran di komputer saya, saya mengetahui bahwa itu vpnkit.exe, yang sudah memiliki entri di pengaturan Windows Firewall saya: tetapi "jaringan pribadi" dinonaktifkan di atasnya, dan setelah saya mengaktifkannya, saya dapat mengunjungi layanan penampung saya dari komputer lain tanpa harus menonaktifkan firewall sepenuhnya.

Atul Varma
sumber
Pak, Anda menyelamatkan saya dari jam dan jam frustrasi. Terima kasih.
Behdad
2

Ini adalah masalah paling umum yang dihadapi oleh pengguna Windows untuk menjalankan Docker Containers. IMO ini adalah "pertanyaan jutaan dolar di Docker"; @ "Rocco Smit" dengan tepat menunjukkan "lalu lintas masuk karena itu dinonaktifkan secara default di firewall mesin host saya"; dalam kasus saya, perangkat lunak McAfee Anti Virus saya. Saya menambahkan port tambahan untuk diizinkan untuk lalu lintas masuk dari komputer lain di LAN Wifi yang sama di Pengaturan Firewall McAfee; lalu itu ajaib. Saya telah berjuang selama lebih dari seminggu menjelajahi seluruh internet, SO, dokumentasi Docker, Tutorial demi Tutorial terkait dengan Jaringan Docker, dan banyak ilustrasi "tidak didukung di Windows" untuk "macvlan", "ipvlan", "pengguna jembatan didefinisikan "dan bahkan benang SO yang sama ini beberapa kali. Saya bahkan mulai menjelajahi Google dengan "ada yang menggunakan Docker di Produksi?", (Ya, saya tahu Linux lebih populer untuk beban kerja Prod dibandingkan dengan server Windows) karena saya tidak dapat mengakses (dari ponsel saya di wifi Rumah yang sama) dan nginx aplikasi yang diterapkan di Docker Container pada Windows. Lagipula, apa gunanya, jika Anda tidak dapat mengakses aplikasi (diterapkan pada Docker Container) dari komputer / perangkat lain setidaknya di LAN yang sama; Pada akhirnya dalam kasus saya, masalahnya hanya dengan firewall yang memblokir lalu lintas masuk; jika Anda tidak dapat mengakses aplikasi (diterapkan pada Docker Container) dari komputer / perangkat lain setidaknya di LAN yang sama; Pada akhirnya dalam kasus saya, masalahnya hanya dengan firewall yang memblokir lalu lintas masuk; jika Anda tidak dapat mengakses aplikasi (diterapkan pada Docker Container) dari komputer / perangkat lain setidaknya di LAN yang sama; Pada akhirnya dalam kasus saya, masalahnya hanya dengan firewall yang memblokir lalu lintas masuk;

banarasi
sumber
0

Saya menemukan bahwa bersama dengan pengaturan nilai -p port, Docker untuk Windows menggunakan vpnkit dan lalu lintas masuk untuk itu dinonaktifkan secara default di firewall mesin host saya. Setelah mengaktifkan aturan TCP masuk untuk vpnkit, saya dapat mengakses penampung saya dari mesin lain di jaringan lokal.

Rocco Smit
sumber