Docker + Cầu + DHCP


13

Tôi có rất nhiều container docker mà tôi cần địa chỉ trên cùng mạng LAN với máy chủ của họ. Cho đến bây giờ, tôi đã đạt được điều này bằng cách sử dụng một cây cầu và tự gán IP cho chúng và tự mình quản lý IP. Một ví dụ khởi động sẽ như vậy:

docker run \
--net="none" \ \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.ipv4 = 192.168.1.3/24" \
--lxc-conf="lxc.network.ipv4.gateway = 192.168.1.254" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.name = eth0" \
--lxc-conf="lxc.network.flags = up" \
-d [Docker Image ID]

Với máy chủ có cầu được xác định trong /etc/network/interfaces(ubfox) như vậy:

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.1.2
        netmask 255.255.255.0
        gateway 192.168.1.254
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

Kể từ khi tôi phát hiện ra serf , tôi đã cố gắng chuyển sang sử dụng khám phá tự động trong các container, để DHCP có thể theo dõi IP và đưa chúng ra các container. Tôi đã thay đổi lệnh khởi động thành:

docker run \
--net="none" \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.flags = up" \
-d [Docker Image ID]
/bin/bash

và cây cầu đến:

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

Điều này dẫn đến việc container bắt đầu, nhưng không có IP. Sau đó tôi đã nhận lời khuyên từ một bài đăng trực tuyến , người đã tìm cách hoàn thành nó với Fedora, bằng cách gọi dhclient. Thật không may, điều này không làm việc cho tôi trong các container dựa trên Ubuntu.

Dưới đây là các thông báo lỗi sau tôi nhận được trong các điều kiện khác nhau:

  • Chạy dhclientkhi tôi đã kích hoạt --privilegedkhởi động container:

    dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    
  • Chạy sudo dhclient eth0khi không vào--privileged

    RTNETLINK answers: Operation not permitted
    mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
    
  • Chạy sudo dhclienthoặc dhclient(không có giao diện được chỉ định).

    Trả về ngay lập tức và vẫn không có kết nối IP hoặc mạng.

Làm cách nào tôi có thể nhận các container docker để lấy IP động từ cùng một mạng con với máy chủ của chúng, để tôi có thể triển khai các container trên nhiều máy chủ mà không cần theo dõi IP?

Thông tin thêm

  • Chạy DOCKER_OPTS="-e lxc"vào/etc/default/docker
  • Máy chủ lưu trữ là Ubuntu 14.04
  • Docker container được xây dựng bằng cách sử dụng from ubuntu:14.04trong Dockerfile.

Câu trả lời:


3

Có vẻ như đây là một vấn đề mở và đây là vấn đề cụ thể đối với các bộ chứa và ứng dụng Ubuntu.

Một cách giải quyết đã được đăng trong đó từ bprodoehl:

  • Bắt đầu container như đặc quyền với --privileged
  • Thêm dòng sau vào dockerfile: RUN mv /sbin/dhclient /usr/sbin/dhclient
  • Chạy dhclient eth0và bạn vẫn sẽ thấy thông báo lỗi: mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busynhưng bây giờ bạn sẽ có IP và bạn có thể sử dụng mạng.

nó hoạt động như một bùa mê cho trường hợp của tôi, nhưng tại sao mv đó lại cần thiết? Bạn có thể giải thích được không?
Federico Bonelli

Đó là những gì trong giải pháp mà anh chàng đăng (mà tôi liên kết đến) và nó dường như hoạt động. Có lẽ người khác có thể giải thích.
trình viên

1
@Federico Bonelli: Apparmor áp dụng các hạn chế bảo mật cho các ứng dụng mà nó quản lý. Nó chỉ quản lý các ứng dụng mà nó có định nghĩa chính sách. Các chính sách này phù hợp với các ứng dụng dựa trên đường dẫn của chúng. Khi bạn di chuyển dhclienttừ /sbinđể /usr/sbinđịnh nghĩa chính sách AppArmor sẽ không phù hợp nữa và AppArmor sẽ không áp dụng bất kỳ hạn chế bảo mật để ứng dụng "không rõ" này.
ớt bột

Tôi đã phải dùng đến "sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient" vì cách giải quyết không có, đây là một fyi container 14.04. Tuy nhiên, thông báo lỗi ở trên đã được nhìn thấy và một địa chỉ IP sau đó đã được chỉ định.
Neil McGill

1

Tôi đã tìm thấy một kịch bản

https://github.com/jkrauska/tech-notes/blob/master/docker-dhclient.md

đó là chính xác những gì bạn muốn (cách giải quyết được đề cập bởi Programster).

Lệnh mv là cần thiết, bởi vì khi bạn chạy container docker ở chế độ đặc quyền, docker không xác định hồ sơ AppArmor cho container. Vì vậy, cấu hình AppArmor mặc định của máy được sử dụng và nó ngăn bạn chạy dhclient tại đường dẫn mặc định của nó.


1

Nếu bạn đang cố gắng để có được một địa chỉ dhcp trên một container docker ub Ubuntu, chỉ cần làm như sau:

  1. đặt tùy chọn dns cho bạn lệnh docker daemon ( --dns <my_dns_ip>)
  2. mở /etc/dhcp/dhclient.confvà chỉnh sửa dòng chứa request subnet-mask, broadcast-address...và loại bỏ các từdomain-name, domain-name-servers
  3. sau đó sau khi áp dụng service networking restartbạn sẽ nhận được một địa chỉ dhcp mới mà không có thông báo lỗi

-2

Khả năng khác là sử dụng "pipework." Bạn cần chạy nó bên ngoài container của bạn. https://github.com/jpetazzo/pipework


5
Xin chào và chào mừng đến với trang web. Chúng tôi muốn câu trả lời là toàn diện hơn một chút ở đây. Bạn có thể chỉnh sửa và giải thích những gì pipework, nơi người ta có thể tìm thấy nó, làm thế nào nó có thể được cài đặt, có thể đưa ra một ví dụ về việc sử dụng nó? Khi nó đứng, câu trả lời của bạn là một nhận xét và không phải là một câu trả lời.
terdon
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.