У меня много док-контейнеров, которые мне нужно адресовать в той же локальной сети, что и их хосты. До сих пор я достигал этого, используя настройку моста и назначая им 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.
dhclient
от/sbin
к/usr/sbin
определению политики AppArmor не будет соответствовать больше и Apparmor не будут применяться какие - либо ограничения безопасности для этого «неизвестного» приложения.Я нашел скрипт
https://github.com/jkrauska/tech-notes/blob/master/docker-dhclient.md
это именно то, что вы хотите (обходной путь, упомянутый Programster).
Команда mv необходима, поскольку при запуске контейнера Docker в привилегированном режиме Docker не определяет профиль AppArmor для контейнера. Таким образом, используется профиль AppArmor по умолчанию для машины, и он не позволяет запускать dhclient по его пути по умолчанию.
источник
Если вы пытаетесь получить адрес DHCP в Docker-контейнере Ubuntu, просто сделайте следующее:
--dns <my_dns_ip>
)/etc/dhcp/dhclient.conf
и отредактировать строку, которая содержитrequest subnet-mask, broadcast-address...
и удалить словаdomain-name, domain-name-servers
service networking restart
вы получите новый адрес DHCP без сообщений об ошибкахисточник
Другая возможность - использовать «трубопровод». Вам нужно запустить его за пределами вашего контейнера. https://github.com/jpetazzo/pipework
источник
pipework
, где можно найти, как установить, возможно, привести пример его использования? На самом деле ваш ответ - это комментарий, а не ответ.