web-dev-qa-db-ja.com

Docker +ブリッジ+ DHCP

ホストと同じ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がありませんでした。次に、dhclientを呼び出すことによって、Fedoraでそれを実現することに成功した オンライン投稿 からアドバイスを受けました。残念ながら、これはubuntuベースのコンテナ内では私には機能しません。

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

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

    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またはネットワーク接続はまだありません。

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

追加情報

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

これは未解決の問題です のようであり、これは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が取得され、ネットワークを使用できるようになります。
3
Programster

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

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

それはまさにあなたが望んでいることを行います(Programsterによって言及された回避策)。

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

1
Dmitriusan

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

  1. dockerデーモンコマンドに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アドレスが取得されます
1
user99240