Docker +ブリッジ+ DHCP


13

ホストと同じLAN上でアドレス指定が必要なdockerコンテナーがたくさんあります。これまで、ブリッジ設定して手動でIPを割り当て、自分でIPを管理することで、これを達成してきました。スタートアップの例は次のようになります。

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]

/etc/network/interfaces(ubuntu)で定義されたブリッジを持つホストの場合:

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

serfを発見して以来、DHCPがIPを追跡してコンテナーに渡すことができるように、コンテナー内で自動検出の使用に移行しようとしています。それ以来、起動コマンドを次のように変更しました。

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

とへの橋:

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

これにより、コンテナが起動しましたが、IPがありませんでした。次に、を呼び出して、Fedoraでそれを成し遂げたオンライン投稿からアドバイスを受けましdhclient。残念ながら、これはubuntuベースのコンテナ内では機能しません。

以下は、さまざまな条件下で表示される次のエラーメッセージです。

  • コンテナの起動dhclientを有効に--privilegedしたときに実行する:

    dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    
  • sudo dhclient eth0いないときの実行--privileged

    RTNETLINK answers: Operation not permitted
    mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
    
  • 実行中sudo dhclientまたはdhclient(インターフェイスが指定されていない)。

    すぐに戻り、IPまたはネットワーク接続はまだありません。

Dockerコンテナーを取得して、ホストと同じサブネットから動的IPを取得し、IPを追跡せずに複数のホストにコンテナーを展開できるようにするにはどうすればよいですか?

追加情報

  • 実行DOCKER_OPTS="-e lxc"/etc/default/docker
  • ホストはUbuntu 14.04です
  • Dockerコンテナはfrom ubuntu:14.04、Dockerfile を使用して構築されます。

回答:


3

と思われる、これが開い問題であり、これはUbuntuの容器やAppArmorのに固有です。

回避策がbprodoehlから投稿されました。

  • コンテナを特権付きで起動します --privileged
  • dockerfileに次の行を追加します。 RUN mv /sbin/dhclient /usr/sbin/dhclient
  • 実行dhclient eth0しても、エラーメッセージが表示されます:mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busy、IPがあり、ネットワークを使用できます。

それは私の場合の魅力のように機能しますが、なぜそのMVが必要なのですか?説明してください。
フェデリコボネリ14年

それは、その人が投稿したソリューション(私がリンクした)にあったもので、うまくいくようです。おそらく他の誰かが説明できます。
Programster

1
@Federico Bonelli:Apparmorは、管理するアプリケーションにセキュリティ制限を適用します。ポリシー定義があるアプリケーションのみを管理します。これらのポリシーは、パスに基づいてアプリケーションを照合します。Apparmorに移動dhclientする/sbin/usr/sbin、ポリシー定義は一致しなくなり、Apparmorはこの「不明な」アプリケーションにセキュリティ制限を適用しなくなります。
パプリカ

回避策がなかったため、「sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient」に頼らなければなりませんでした。これはubuntu 14.04コンテナfyiでした。ただし、上記のエラーメッセージが表示され、IPアドレスが割り当てられました。
ニールマクギル

1

スクリプトを見つけました

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

それはまさにあなたが望むことを行います(Programsterが言及した回避策)。

Dockerコンテナを特権モードで実行すると、DockerはコンテナのAppArmorプロファイルを定義しないため、mvコマンドが必要です。そのため、マシンデフォルトのAppArmorプロファイルが使用され、デフォルトのパスでdhclientを実行できなくなります。


1

Ubuntu Dockerコンテナでdhcpアドレスを取得しようとしている場合は、次の手順を実行します。

  1. docker daemonコマンドでdnsオプションを設定します(--dns <my_dns_ip>
  2. 単語/etc/dhcp/dhclient.confを含む行を開いて編集request subnet-mask, broadcast-address...しますdomain-name, domain-name-servers
  3. その後、service networking restartエラーメッセージなしで新しいdhcpアドレスを取得します。

-2

他の可能性は、「パイプワーク」を使用することです。コンテナの外部で実行する必要があります。https://github.com/jpetazzo/pipework


5
こんにちは、サイトへようこそ。ここでは、回答をもう少し包括的にしたいです。何を編集しpipework、どこで見つけることができるか、どのようにインストールできるかを説明してください。おそらくその使用例を示してください。現状では、あなたの答えはコメントであり、答えではありません。
テルドン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.