Kết nối Docker container với cả máy chủ và mạng cầu nội bộ


14

Tôi đang cố gắng chạy một container Docker như một bộ định tuyến giữa --internalmạng Docker riêng ( ) và hostmạng được xác định trước . Điều này có nghĩa là bộ chứa cần có hai giao diện mạng: Một giao diện "bên ngoài", có thể truy cập tất cả các địa chỉ IP máy chủ và một giao diện "bên trong", hoạt động như một cổng cho các bộ chứa trong mạng Docker bên trong

Bộ chứa bộ định tuyến sau đó sẽ lưu lượng truy cập mạng NAT từ / đến bộ chứa.

Tôi chưa tìm được cách cấu hình Docker để chạy container với hai giao diện đó. Gần nhất tôi có thể nhận được là có hai bridgegiao diện được gán, đó không phải là chính xác những gì tôi cần.

Đang cố gắng kết nối thủ công dẫn đến lỗi:

# docker network connect host root_router_1
Error response from daemon: Container cannot be disconnected from host network or connected to host network

Bất cứ ai có thể chỉ cho tôi làm thế nào để đạt được điều này, tốt nhất là ngay cả với Docker Compose?


@PunMum Thật không may. Chúng tôi cuối cùng đã kết nối tất cả các container trực tiếp với mạng máy chủ và định cấu hình IP bên trong các container.
Hexaholic

Câu trả lời:


2

Theo Q & A này trên github :

Mạng máy chủ là đặc biệt. Bạn phải sử dụng network_mode: host trên dịch vụ


Các network_modekhông hoạt động nếu bạn cần một cái gì đó kết nối với một mạng nội bộ và mạng máy chủ. Có vẻ điên rồ rằng chúng ta không thể tìm thấy một giải pháp rõ ràng tốt cho vấn đề này.
jv-dev

2

Docker không cho phép kết nối một container với mạng chủ và bất kỳ mạng cầu Docker nào khác cùng một lúc. Tôi sẽ cố gắng minh họa lý do bằng một ví dụ:

  • Hãy để chúng tôi nghĩ về một container C1. Theo giả thuyết, C1 sẽ được kết nối với mạng máy chủ (--net = host) và mạng cầu nối Docker Br1 (--net = Br1).
  • Một container thứ hai, giả sử là C2, được kết nối với Br1.

Với thiết lập ở trên, tôi đoán là mạng máy chủ có thể nhìn thấy từ C2 và tôi cho rằng đây là lý do tại sao Docker tự động ngăn chúng tôi vô tình để lộ mạng máy chủ đến các container không được chỉ định của máy chủ.

Điều đó đang được nói, nếu chúng ta có một bộ container và chúng ta muốn tất cả chúng được kết nối với nhau, chỉ với một container duy nhất có quyền truy cập vào mạng máy chủ, cách tiếp cận của tôi sẽ là:

  • [C2, ..., CN] được kết nối với cầu Docker do người dùng xác định Br1 (--net = Br1)
  • C1 được kết nối với mạng máy chủ (--net = máy chủ)
  • C1 trưng ra một cổng để có thể truy cập từ phần còn lại của container

EDIT: Chúng tôi vẫn sẽ phải điều chỉnh các chính sách của iptables theo cách có thể đạt được C1 từ phần còn lại của các container (xem https://docs.docker.com/network/iptables/ )

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.