2015-11-19 31 views
43

Tôi đã tạo vùng chứa docker đầu tiên của mình, nó đang chạy máy chủ bằng Go nhưng tôi không thể truy cập nó từ bên ngoài máy chủ. Tôi vừa mới bắt đầu với docker vì vậy tôi bị mất một chút ở đây.Cách kết nối với bộ chứa docker từ bên ngoài máy chủ (cùng một mạng) [Windows]

Vì vậy, tôi có một mã Go rất đơn giản bắt đầu một máy chủ, tôi đã xây dựng hình ảnh docker cài đặt Go và xây dựng mã trong một hình ảnh cơ sở Linux. Tôi đang chạy các máy chủ trên cổng 8080 vì vậy tôi vạch trần rằng cổng để dẫn chương trình chạy container như thế này:

docker run -p 8080:8080 dockertest 

đó làm việc và tôi nhận được để truy cập máy chủ thông qua Docker của máy IP (một trong đó xuất hiện trên thiết bị đầu cuối Docker Quickstart khi được khởi tạo), vấn đề là tôi không thể truy cập trang web tôi đang lưu trữ từ bên ngoài máy chủ, vì vậy nếu tôi cố gắng mở cùng một địa chỉ IP trên điện thoại của mình, nó chỉ mang lại cho tôi lỗi: Trang web này không có sẵn (ERR_CONNECTION_TIMED_OUT).

Tôi cũng đã cố gắng xác định IP như thế này:

docker run -p 192.168.0.157:8080:8080 dockertest 

Nhưng khi tôi làm điều đó tôi không thể truy cập vào trang web thông qua không phải chỉ IP của máy Docker của cũng không phải là IP được chỉ định trên dòng lệnh trên. Tôi cũng không chắc IP nào tôi giả sử viết trong lệnh đó tôi đã sử dụng IP của máy tính, tôi cũng đã thử 127.0.0.1 (localhost) nhưng điều đó đã cho tôi kết quả tương tự: không thể truy cập trang web thông qua bất kỳ IP nào.

Tôi đã giải quyết vấn đề này và tìm thấy nhiều câu hỏi ngăn xếp nhưng không giúp tôi giải quyết được vấn đề của mình, hầu hết trong số chúng được định hướng tới Linux hoặc Mac để giải pháp không áp dụng cho trường hợp của tôi.

Ngoài ra, tôi có thể chạy mã Go trên máy tính của tôi và truy cập trang web từ một thiết bị khác trong cùng một mạng thông qua IP của máy tính của tôi. Tôi không hiểu tại sao tôi không thể truy cập nó khi tôi đang chạy nó trong máy docker, nó xảy ra với tôi rằng nó có thể có một cái gì đó để làm với chuyển tiếp IP hoặc một cái gì đó nhưng tôi là một noob hoàn thành trong mạng, tôi chủ yếu là một nhà phát triển web và hầu như không có kinh nghiệm bản địa.

+0

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

+0

@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

Trả lời

50

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:

  1. để 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ủ.

  2. để 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 đó.

+1

Tôi chỉ có thể tìm thấy 2 IP, Docker hiển thị khi tôi mở Quickstart Terminal (192.168.99.100) và máy tính của tôi có (192.168.0.157), sử dụng dockerest -p 8080: 8080 dockertest 'Tôi có thể truy cập trang web của mình bằng cách sử dụng' http: //192.168.99.100: 8080' nhưng chỉ từ máy tính Windows của tôi (máy chủ) chứ không phải từ điện thoại của tôi. Nếu tôi sử dụng 'docker run -p 192.168.0.157:8080:8080 dockertest' tôi không thể truy cập trang web với bất kỳ IP nào từ bất kỳ đâu. Tôi không chắc chắn làm thế nào để thiết lập mạng, tôi đã thử bằng cách sử dụng '--net = bridge' nhưng điều đó không làm việc không. Tôi có nên mở VirtualBox không? Tôi không thể làm điều đó bằng cách sử dụng thiết bị đầu cuối của Docker? – raulsntos

+0

Vấn đề không phải với Docker, vì vậy không, Docker không thể giúp bạn. Tôi sẽ thêm một số chỉnh sửa để minh họa những gì tôi nghĩ đang diễn ra. – Kryten

+0

Ok, cảm ơn bạn! Bây giờ tôi hiểu, tôi đã bị lẫn lộn bởi toàn bộ phần máy ảo Linux. Tôi đã được ấn tượng Docker đã sử dụng Virtual Box cho nội dung mà tôi đã không giả sử để liên lạc. Nó thực sự rất dễ dàng, tôi chỉ cần thay đổi thành 'bridged' trong Virtual Box và giờ nó hoạt động rất tốt, cảm ơn bạn rất nhiều. – raulsntos

76
  1. mở Oracle VM VirtualBox quản lý
  2. Chọn VM sử dụng bởi Docker
  3. Bấm Settings -> Network
  4. Adaptor 1 nên được "Kèm theo: NAT" (mặc định?)
  5. Nhấn nâng cao -> Chuyển tiếp cổng
  6. Thêm quy tắc: Giao thức TCP, Cổng máy chủ 8080, Cổng khách 8080 (để trống IP máy chủ và IP khách)
  7. Khách là vùng chứa docker và Máy chủ là máy của bạn

Bây giờ bạn có thể duyệt đến vùng chứa của mình qua máy chủ cục bộ: 8080 và your-internal-ip: 8080.

+7

Xác nhận, tốt đẹp và dễ dàng. – Dirk

+1

Phần về việc để trống các trường IP là rất quan trọng! –

+1

Cuối cùng tôi có thể kết nối với vùng chứa docker trên mạng cục bộ! – simo

0

Sau khi thử một vài điều, điều này đã làm việc cho tôi:

  • sử dụng --publish = 0.0.0.0: 8080: 8080 Docker cờ
  • thiết lập các chế độ mạng VirtualBox để NAT, và không sử dụng bất kỳ cổng chuyển tiếp nào

Với địa chỉ khác 0.0.0.0 Tôi đã không thành công.

Các vấn đề liên quan