Как добраться до контейнеров docker по имени вместо IP-адреса?

есть ли способ связаться с контейнерами docker, используя имена вместо ip-адресов?

Я слышал о pipework, и я видел некоторые параметры типа dns и имени хоста для docker, но я все еще не могу собрать все вместе.

Спасибо за ваше время.

Я не уверен, если это полезно, но это то, что я сделал до сих пор:

  • установленный узел контейнера docker с помощью docker-machine и vmwarevsphere водитель!--10-->
  • запустил все службы с docker-compose
  • Я могу связаться со всеми службами с любой другой машины в сети, используя IP и порт

Я добавил запись псевдонима DNS на мой частный сетевой DNS-сервер, и она соответствует имени машины, которая используется docker-machine. Но машина всегда выбирает другой IP-адрес при загрузке и подключении к сети.

Я просто потерял, где решать это:

  • сетевой DNS-сервер
  • docker-имя хоста машины
  • имя хоста контейнера docker
  • вероятно, какая-то комбинация всех них

Я, вероятно, ищу что-то похожее на этот вопрос:

как позволить docker использовать мой сетевой маршрутизатор для назначения dhcp ip контейнерам легко вместо конвейерной работы?

любое общее направление будет удивительным...еще раз спасибо!

6 ответов


настройки 1.10 имеет встроенный DNS. Если ваши контейнеры подключены к тому же пользовательские сеть (создать сеть docker network create my-network и запустите контейнер с --net my-network) они могут ссылаться друг на друга, используя имя контейнера. (Docs).

круто!

одно предостережение если вы используете Docker compose, вы знаете, что он добавляет префикс к именам контейнеров, т. е. <project name>_<service name>-#. Это делает ваши имена контейнеров несколько более трудными для управления, но это может быть нормально для вашего случая. Ты можешь!--13-->переопределите функциональность именования docker compose, вручную установив имя контейнера в шаблоне compose, но тогда вы не сможете масштабироваться с compose.


вы можете попробовать dnsdock. Смотрит прямо вперед и легко(!) для настройки. Взгляните на http://blog.brunopaz.net/easy-discover-your-docker-containers-with-dnsdock/ и https://github.com/tonistiigi/dnsdock .


EDIT 2018-02-17: Docker может в конечном итоге удалить links ключ от docker-compose, поэтому они предлагают использовать пользовательские сети как указано здесь =>https://docs.docker.com/compose/compose-file/#links


предполагая, что вы хотите достичь mysql контейнера web контейнер из ваших , например:

web:
  build: .
  links:
    - mysql

mysqlservice:
  image: mysql

вы будете рады узнать, что Docker Compose уже добавляет mysqlservice домен имя (в web контейнер /etc/hosts), который указывает на mysql контейнер.

вместо того, чтобы искать mysql IP-адрес контейнера, вы можете просто использовать mysqlservice доменное имя.

если вы хотите добавить пользовательские доменные имена, это также возможно с extra_hosts


Если вы хотите из решения коробки, вы можете проверить, например Контена. Он поставляется с технологией сетевого наложения от плетение и эта технология используется для создания виртуальных частных сетей между службами. Благодаря этому каждый сервис / контейнер может быть достигнут service_name.kontena.local.


создайте новую мостовую сеть, отличную от 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 с именем тест прослушивание порта 7000 (просто чтобы он работал). Наконец, мы пингуем тестовый контейнер по его имени, и он должен работать.


Я изменил с --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>