2014-10-24 25 views
21

Tôi đang chạy nó trên ubuntu 14.04 và đã đặt docker0 thành ip tĩnh sau đó được định tuyến đến từ ip công khai thông qua tường lửa. Tôi đang cố gắng để thiết lập API phụ trợ của tôi để chạy trong một container docker và đang bối rối bởi một vài điều.Cho vùng chứa docker địa chỉ IP có thể định tuyến

1.) Làm cách nào để ánh xạ IP của docker0 tới ip của vùng chứa sao cho docker0 sẽ biết gửi gói đến tới vùng chứa (động nếu có thể).

2.) Nếu chưa được thực hiện theo cách như vậy, làm thế nào tôi có thể làm cho nó để tôi không phải thiết lập này mỗi khi tôi làm một tươi chạy của container docker?

Cảm ơn trước!

+1

bạn đã xem xét các --net = tùy chọn máy chủ? xem: https://docs.docker.com/articles/networking/#container-networking –

+0

Bạn có ý gì khi gửi các gói dữ liệu đến một cách động? Giả sử rằng API phụ trợ đáp ứng với HTTP, điều gì về việc thiết lập proxy HTTP cũng có thể xử lý các nội dung khác, ví dụ: SSL offloading vv – andi5

Trả lời

35

Tôi giả sử bạn muốn có một IP được chỉ định cho vùng chứa docker của bạn bên ngoài docker.

Đầu tiên, tạo một IP mới và gán nó vào giao diện của máy chủ của bạn (chúng tôi giả định giao diện của bạn được gọi là eth0.

$> ip addr add 10.0.0.99/8 dev eth0 

Bây giờ, khi bạn cháy lên các container, ghi rõ địa chỉ đó và liên kết nó với bạn chứa Docker:

$> docker run -i -t --rm -p 10.0.0.99:80:8080 base 

đối số -p sẽ làm cho Docker tạo ra một quy tắc NAT iptables mà sẽ nat tất cả các giao thông phù hợp với điểm đến 10.0.0.99:80 để chứa Docker của bạn trên cổng 8080.

Nếu bạn cần để tự động hóa quá trình và quy mô nó ra, tham khảo ý kiến ​​khu vực này: https://github.com/jpetazzo/pipework

Các tài liệu Docker là một khởi đầu tốt: https://docker.github.io/engine/userguide/networking/

+2

Có nhưng làm thế nào để bạn ánh xạ một cổng gửi đi đến một máy chủ lưu trữ IP? –

+1

Tôi không nghĩ rằng bạn cần phải làm điều đó. Trong hầu hết các trường hợp, khi giao tiếp được khởi tạo bởi một ứng dụng nằm trong vùng chứa, cổng nguồn là động, vì vậy bạn không cần ánh xạ. Ứng dụng mà bạn cần để ánh xạ cổng nguồn là gì? Hơn nữa, việc sửa cổng cho ứng dụng của khách hàng gây ra một nguy cơ bảo mật, do đó, các cổng nguồn phải được ngẫu nhiên. Chi tiết hơn tại đây [RFC6056] (https://tools.ietf.org/html/rfc6056) – nucatus

+1

> Ứng dụng mà bạn cần để ánh xạ cổng nguồn là gì? - ví dụ như máy chủ MRCP (RFC 6787). Có cách nào để thực sự gán địa chỉ IP công khai cho vùng chứa không? –

9

Gần đây tôi có cùng một vấn đề và giải quyết nó bằng cách sử Mạng Container :

  • Bắt đầu chứa 'dịch vụ' của tôi mà tôi muốn có sẵn trên IP công cộng
  • Tạo một 'mạng' mới chứa được liên kết với các serv thùng chứa đá và định tuyến đến các cổng được vùng chứa dịch vụ tiếp xúc. Vùng chứa này sẽ có thêm một giao diện mạng được nối với máy chủ để nó có thể có được một IP từ DHCP.
  • Tạo cầu nối mạng từ máy chủ Docker đến vùng chứa bằng cách sử dụng Đường ống của jpetazzo (https://github.com/jpetazzo/pipework)
  • Vùng chứa mạng lấy địa chỉ từ DHCP.

Từ điểm này trên vùng chứa mạng có sẵn trên mạng và định tuyến các cổng đến vùng chứa dịch vụ. Ưu điểm chính là thùng chứa 'dịch vụ' không phải biết về IP công khai, DHCP, v.v. Bằng cách này, mọi thùng chứa đang chạy đều có thể được công khai trên mạng.

Để thuận tiện, tôi đã tạo một tập lệnh thực hiện tất cả điều này cùng một lúc. Làm một container chạy sẵn trên một IP nào cũng đơn giản như:

create-network-container.sh webserver ens32 

Trong trường hợp này bạn sẽ cần phải có một container chạy gọi là "máy chủ web, và một giao diện mạng trên máy chủ 'ens32'.Giao diện là cần thiết để tạo cầu nối vào vùng chứa mạng.

Các kịch bản, thông tin chi tiết hơn và các ví dụ có sẵn trên: https://github.com/jeroenpeeters/docker-network-containers

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