ホストと同じ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
を実行していますfrom ubuntu:14.04
を使用して構築されます。これは未解決の問題です のようであり、これはUbuntuコンテナーとapparmorに固有のものです。
回避策がbprodoehlからそこに投稿されました:
--privileged
で特権付きで起動します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が取得され、ネットワークを使用できるようになります。スクリプトを見つけました
https://github.com/jkrauska/tech-notes/blob/master/docker-dhclient.md
それはまさにあなたが望んでいることを行います(Programsterによって言及された回避策)。
Dockerコンテナーを特権モードで実行すると、dockerはコンテナーのAppArmorプロファイルを定義しないため、mvコマンドが必要です。したがって、マシンデフォルトのAppArmorプロファイルが使用され、デフォルトのパスでdhclientを実行できなくなります。
ubuntu DockerコンテナーでDHCPアドレスを取得しようとしている場合は、次の手順を実行します。
--dns <my_dns_ip>
)/etc/dhcp/dhclient.conf
を開き、request subnet-mask, broadcast-address...
を含む行を編集して、単語domain-name, domain-name-servers
を削除しますservice networking restart
を適用すると、エラーメッセージなしで新しいDHCPアドレスが取得されます