TL; DR Kiểm tra chế độ mạng của máy chủ VirtualBox - phải là bridged
nếu bạn muốn máy ảo (và vùng chứa Docker lưu trữ) có thể truy cập được trên mạng cục bộ của bạn.
Dường như sự nhầm lẫn của bạn nằm trong máy chủ lưu trữ kết nối để truy cập ứng dụng của bạn qua HTTP. Bạn đã không thực sự đánh vần cấu hình của bạn là gì - tôi sẽ thực hiện một số dự đoán, dựa trên thực tế là bạn đã có "Windows" và "VirtualBox" trong thẻ của mình.
Tôi đoán rằng bạn có Docker chạy trên một số hương vị của Linux đang chạy trong VirtualBox trên máy chủ Windows.Tôi sẽ đặt tên các địa chỉ IP như sau:
D
= địa chỉ IP của container Docker
L
= địa chỉ IP của các máy chủ Linux chạy trong VirtualBox
W
= địa chỉ IP của máy chủ Windows
Khi bạn chạy ứng dụng Go trên máy chủ Windows, bạn có thể kết nối với nó bằng http://W:8080/
từ bất kỳ đâu trên mạng cục bộ của bạn. Điều này làm việc vì ứng dụng Go liên kết cổng 8080 trên máy Windows và bất kỳ ai cố gắng truy cập cổng 8080 tại địa chỉ IP W
sẽ được kết nối.
Và đây là nơi mà nó trở nên phức tạp hơn:
VirtualBox, khi nó đặt lên một máy ảo (VM), có thể cấu hình mạng trong một trong những phương thức khác nhau. Tôi không nhớ tất cả các tùy chọn khác nhau là gì, nhưng tùy chọn bạn muốn là bridged
. Trong chế độ này, VirtualBox kết nối máy ảo với mạng nội bộ của bạn như thể nó là một máy độc lập trên mạng, giống như bất kỳ máy nào khác đã được cắm vào mạng của bạn. Ở chế độ bridged
, máy ảo xuất hiện trên mạng của bạn giống như bất kỳ máy nào khác. Các chế độ khác thiết lập mọi thứ khác nhau và máy sẽ không hiển thị trên mạng của bạn. Vì vậy, giả sử bạn thiết lập mạng chính xác cho máy chủ Linux (bridged
), máy chủ Linux sẽ có địa chỉ IP trên mạng cục bộ của bạn (như 192.168.0.x) và bạn sẽ có thể truy cập vào Docker của mình vùng chứa tại http://L:8080/
.
Nếu các máy chủ Linux được thiết lập để một số chế độ khác hơn bridged
, bạn thể có thể truy cập từ các máy chủ Windows, nhưng điều này sẽ phụ thuộc vào chính xác chế độ nào nó trong.
EDIT - dựa trên các ý kiến bên dưới, có vẻ như tình huống tôi đã mô tả ở trên là chính xác.
Hãy sao lưu một chút: dưới đây là cách Docker hoạt động trên máy tính của tôi (Ubuntu Linux).
Hãy tưởng tượng tôi chạy cùng một lệnh bạn có: docker run -p 8080:8080 dockertest
. Điều này có nghĩa là bắt đầu một vùng chứa mới dựa trên hình ảnh dockertest
và chuyển tiếp (kết nối) cổng 8080 trên máy chủ Linux (PC của tôi) đến cổng 8080 trên vùng chứa. Docker thiết lập mạng nội bộ riêng của nó (với bộ địa chỉ IP của riêng nó) để cho phép trình nền của Docker giao tiếp và cho phép các thùng chứa giao tiếp với nhau. Vì vậy, về cơ bản những gì bạn đang làm với điều đó -p 8080:8080
đang kết nối mạng nội bộ của Docker với mạng "bên ngoài" - tức là. bộ điều hợp mạng của máy chủ - trên một cổng cụ thể.
Với tôi cho đến nay? OK, bây giờ chúng ta hãy lùi lại một bước và nhìn vào hệ thống của bạn. Máy của bạn đang chạy Windows - Docker không (hiện tại) chạy trên Windows, do đó công cụ bạn đang sử dụng đã thiết lập máy chủ Linux trong máy ảo VirtualBox. Khi bạn thực hiện docker run
trong môi trường của mình, chính xác điều tương tự đang xảy ra - cổng 8080 trên máy chủ Linux được kết nối với cổng 8080 trên vùng chứa. Sự khác biệt lớn ở đây là máy chủ Windows của bạn không phải là máy chủ Linux mà trên đó thùng chứa đang chạy, vì vậy có một lớp khác ở đây và giao tiếp của nó trên lớp này nơi bạn đang gặp sự cố.
gì bạn cần là một trong hai điều:
để kết nối cổng 8080 trên VirtualBox VM đến cổng 8080 trên máy chủ Windows, giống như bạn kết nối container Docker vào cổng máy chủ.
để kết nối máy ảo VirtualBox trực tiếp với mạng cục bộ của bạn với chế độ mạng bridged
tôi đã mô tả ở trên.
Nếu bạn đi cho tùy chọn đầu tiên, bạn sẽ có thể truy cập vào container tại http://W:8080
nơi W
là địa chỉ IP hoặc hostname của các máy chủ Windows. Nếu bạn chọn thứ hai, bạn sẽ có thể truy cập vào vùng chứa tại http://L:8080
trong đó L
là địa chỉ IP hoặc tên máy chủ của máy ảo Linux.
Vì vậy, đó là tất cả các giải thích cấp cao hơn - bây giờ bạn cần phải tìm ra cách thay đổi cấu hình của VirtualBox VM. Và đây là nơi tôi thực sự không thể giúp bạn - Tôi không biết bạn đang sử dụng công cụ nào để làm tất cả điều này trên máy tính Windows của mình và tôi hoàn toàn không quen với việc sử dụng Docker trên Windows.
Nếu bạn có thể vào cửa sổ cấu hình VirtualBox, bạn có thể thực hiện các thay đổi được mô tả bên dưới. Ngoài ra còn có một máy khách dòng lệnh sẽ sửa đổi các máy ảo, nhưng tôi không quen thuộc với điều đó.
Chế độ bridged
(và đây thực sự là lựa chọn đơn giản nhất), tắt máy ảo của bạn, nhấp vào nút "Cài đặt" ở trên cùng và thay đổi chế độ mạng thành bridged
, sau đó khởi động lại VM và bạn tốt đi. VM sẽ nhận địa chỉ IP trên mạng cục bộ của bạn thông qua DHCP và sẽ hiển thị với các máy tính khác trên mạng tại địa chỉ IP đó.
bạn có sử dụng EXPOSE 8080 trong Dockerfile cùng với tùy chọn -p không? Ngoài ra, hãy kiểm tra xem cổng 8080 trên hộp có vùng chứa của bạn đang chạy không bị chặn bởi các quy tắc bảo mật của bạn. – keda
@keda Có, Dockerfile có chứa EXPOSE 8080. Tôi đang chạy vùng chứa cục bộ trên máy tính của mình thông qua Trạm khởi động nhanh của Docker, tôi cũng đã cố gắng vô hiệu hóa tường lửa của Windows nhưng không hoạt động, tôi không biết nếu có một số cài đặt Tôi thiếu – raulsntos