Как добраться до контейнеров-докеров по имени вместо IP-адреса?
Есть ли способ добраться до контейнеров докеров, используя имена вместо IP-адресов?
Я слышал о трубопроводе, и я видел некоторые параметры типа dns и hostname для докеров, но я все еще не могу собрать все вместе.
Спасибо за ваше время.
Я не уверен, что это полезно, но это то, что я сделал до сих пор:
- установлен хост контейнера докеров, использующий докер-машину и драйвер vmwarevsphere.
- запустил все службы с помощью docker-compose
- Я могу использовать все службы с любого другого компьютера в сети, используя IP и порт
Я добавил запись псевдонима DNS на свой DNS-сервер частной сети и соответствует имени машины, которое используется докере-машиной. Но при загрузке и подключении к сети аппарат всегда выбирает другой IP-адрес.
Я просто потерял информацию о том, где решить эту проблему:
- сетевой DNS-сервер
- имя хоста docker-machine
- имя хоста контейнера docker
- возможно, какая-то комбинация из них
Я, вероятно, ищу что-то похожее на этот вопрос:
Как разрешить докере использовать мой сетевой маршрутизатор для легкого назначения dhcp ip в контейнеры вместо того, чтобы конвейер?
Любое общее направление будет потрясающим... еще раз спасибо!
Ответы
Ответ 1
Если вы хотите использовать готовое решение, вы можете, например, проверить Kontena. Он поставляется с технологией сетевого оверлея от Weave, и эта технология используется для создания виртуальных частных сетей LAN между службами. Благодаря этому каждый сервис/контейнер может быть достигнут с помощью service_name.kontena.local
.
Ответ 2
Docker 1.10
имеет встроенный DNS. Если ваши контейнеры подключены к одной и той же сети, определенной пользователем (создайте сеть docker network create my-network
и запустите свой контейнер с помощью --net my-network
), они могут ссылаться друг на друга, используя имя контейнера. (Docs).
Круто!
Одно предупреждение, если вы используете Docker, вы знаете, что он добавляет префикс к вашим именам контейнеров, т.е. <project name>_<service name>-#
. Это делает ваши имена контейнеров несколько более сложными для контроля, но это может быть хорошо для вашего варианта использования. Вы можете переопределить docker, создать функцию именования, вручную задав имя контейнера в вашем шаблоне компоновки, но тогда вы не сможете масштабировать с составлением.
Ответ 3
Предполагая, что вы хотите добраться до контейнера mysql
из контейнера web
вашего файла docker-compose.yml
, например:
web:
build: .
links:
- mysql
mysqlservice:
image: mysql
Вам будет приятно узнать, что Docker Compose уже добавляет доменное имя mysqlservice
(в контейнере web
/etc/hosts
), указывающее на контейнер mysql
.
Вместо поиска IP-адреса контейнера mysql
вы можете просто использовать доменное имя mysqlservice
.
Если вы хотите добавить пользовательские имена доменов, это также возможно с параметром extra_hosts.
Ответ 4
Возможно, вы захотите попробовать dnsdock. Выглядит прямо и легко (!), Чтобы настроить. Посмотрите http://blog.brunopaz.net/easy-discover-your-docker-containers-with-dnsdock/ и https://github.com/tonistiigi/dnsdock.
Ответ 5
Создайте новую мостовую сеть, отличную от docker0, запустите в ней свои контейнеры, и вы можете ссылаться на контейнеры внутри этой сети по их именам.
Демон Docker запускает встроенный DNS-сервер для обеспечения автоматического обслуживания обнаружение для контейнеров, подключенных к пользовательским сетям. имя запросы разрешения из контейнеров обрабатываются сначала встроенный DNS-сервер.
Попробуйте следующее:
docker network create <network name>
docker run --net <network name> --name test busybox nc -l 0.0.0.0:7000
docker run --net <network name> busybox ping test
Сначала мы создаем новую сеть. Затем мы запускаем контейнер busybox с именем test, прослушивающий порт 7000 (просто чтобы он работал). Наконец, мы проверяем тестовый контейнер по его названию, и он должен работать.
Ответ 6
Я изменил параметр --net
с помощью параметра --network
и работает как ожидалось:
docker network create <network name>
docker run --network <network name> --name <container name> <other container options>
docker run --network <network name> --name <container name> <other container options>