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.
sumber
Jawaban:
TL; DR Periksa mode jaringan host VirtualBox Anda - seharusnya
bridged
jika 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 DockerL
= alamat IP dari host Linux yang berjalan di VirtualBoxW
= alamat IP dari host WindowsSaat 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 IPW
akan 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 dihttp://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 berdasarkandockertest
gambar 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:8080
adalah 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 run
di 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:
untuk menghubungkan port 8080 pada VirtualBox VM ke port 8080 pada host Windows, seperti Anda menghubungkan kontainer Docker ke port host.
untuk menghubungkan VM VirtualBox langsung ke jaringan lokal Anda dengan
bridged
mode jaringan yang saya jelaskan di atas.Jika Anda memilih opsi pertama, Anda akan dapat mengakses wadah di
http://W:8080
manaW
alamat IP atau nama host dari host Windows. Jika Anda memilih yang kedua, Anda akan dapat mengakses penampung dihttp://L:8080
manaL
alamat 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
bridged
mode (dan ini benar-benar pilihan yang paling sederhana), matikan VM Anda, klik tombol "Pengaturan" di bagian atas, dan ubah mode jaringan kebridged
, 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.sumber
docker run -p 8080:8080 dockertest
saya dapat mengakses situs web saya menggunakanhttp://192.168.99.100:8080
tetapi hanya dari komputer Windows saya ( host) dan bukan dari ponsel saya. Jika saya menggunakan,docker run -p 192.168.0.157:8080:8080 dockertest
saya tidak dapat mengakses situs web dengan IP apa pun dari mana pun. Saya tidak yakin bagaimana mengatur jaringan, saya mencoba menggunakan--net=bridge
tetapi tidak berhasil juga. Apakah saya seharusnya membuka VirtualBox? Tidak bisakah saya melakukannya menggunakan terminal Docker?bridged
di Virtual Box dan sekarang bekerja dengan sangat baik, terima kasih banyak.Sekarang Anda dapat menjelajahi container Anda melalui localhost: 8080 dan your-internal-ip: 8080.
sumber
Setelah mencoba beberapa hal, ini berhasil untuk saya:
Dengan alamat selain
0.0.0.0
saya tidak berhasil.sumber
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 -b
untuk menemukan aplikasi di balik soket pendengaran di komputer saya, saya mengetahui bahwa ituvpnkit.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.sumber
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;
sumber
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.
sumber