ドッカー+ブリッジ+ DHCP

ドッカー+ブリッジ+ 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

私が知った後農業、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

さまざまな条件で表示されるエラーメッセージは次のとおりです。

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

IPを追跡することなく複数のホストにコンテナを展開できるように、Dockerコンテナがホストと同じサブネットから動的IPを取得できるようにするにはどうすればよいですか。

追加情報

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

答え1

そうだこれは公開質問ですこれはUbuntuコンテナとApparmorに固有のものです。

bprodoehlは次の回避策を公開しました。

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

答え2

スクリプトが見つかりました。

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

これがあなたが望むものです(プログラマーが言及した解決策)。

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

答え3

Ubuntu Dockerコンテナからdhcpアドレスを取得したい場合は、次の手順を実行します。

  1. --dns <my_dns_ip>dockerデーモンコマンド()でdnsオプションを設定します。
  2. その単語を含む行を開き、編集して/etc/dhcp/dhclient.conf削除request subnet-mask, broadcast-address...します。domain-name, domain-name-servers
  3. その後、適用した後service networking restartは新しいDHCPアドレスを取得し、エラーメッセージは表示されません。

答え4

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

関連情報