Сделать докер-машину доступной под именем хоста в Windows

Я пытаюсь сделать докер-машину доступной для моей Windows по имени хоста. После создания как

docker-machine create -d virtualbox mymachine

и настроить док-контейнер, который предоставляет порт 80, как я могу дать этой док-машине имя хоста, чтобы я мог ввести «http://mymachine/" в моем браузере, чтобы загрузить веб-сайт? Когда я меняю «mymachine» на фактический IP-адрес, он работает.

Существует ответ на этот вопрос но я хотел бы добиться этого без записи в файле hosts. Это возможно?


person Steffen Harbich    schedule 27.11.2017    source источник
comment
Почему вы не хотите использовать hosts файл? Какое решение вы ожидаете?   -  person Mickael    schedule 27.11.2017
comment
Я стараюсь сделать его максимально простым для нескольких разработчиков, использующих среду разработки. Поэтому я хотел бы избежать ручных шагов.   -  person Steffen Harbich    schedule 27.11.2017
comment
И насколько я знаю, IP-адрес докер-машины может измениться, например. при перезапуске.   -  person Steffen Harbich    schedule 28.11.2017
comment
Если ваша сеть Virtualbox bridged (поэтому виртуальная машина подключена к той же физической сети), в зависимости от вашего маршрутизатора или других механизмов разрешения DNS вы можете добавить запись на своем маршрутизаторе или DNS-сервере. Например. Fritzbox всегда преобразует имя хоста/компьютера в IP-адрес (без дальнейшего администрирования, даже динамически с помощью DHCP), и вы также можете установить Всегда давать этому устройству один и тот же IP-адрес.   -  person arne    schedule 02.12.2017
comment
@arnold, к сожалению, это не вариант в сети моей компании.   -  person Steffen Harbich    schedule 03.12.2017
comment
Какую версию докера вы используете?   -  person fragmentedreality    schedule 06.12.2017
comment
@fragmentedreality 17.07.0-ce, но при необходимости могу обновить.   -  person Steffen Harbich    schedule 06.12.2017


Ответы (6)


Вы можете обратиться к документации по докеру: https://docs.docker.com/engine/userguide/networking/#exposed-and-publishing-ports

Вы предоставляете порты, используя ключевое слово EXPOSE в Dockerfile или флаг --expose для запуска docker. Предоставление портов — это способ документирования используемых портов, но фактически не отображает и не открывает какие-либо порты. Открытие портов не является обязательным.

Вы публикуете порты, используя флаг --publish или --publish-all для запуска docker. Это сообщает Docker, какие порты открывать на сетевом интерфейсе контейнера. Когда порт публикуется, он сопоставляется с доступным старшим портом (выше 30000) на хост-компьютере, если вы не укажете порт для сопоставления на хост-компьютере во время выполнения. Вы не можете указать порт для сопоставления на хост-компьютере при создании образа (в файле Dockerfile), потому что нет способа гарантировать, что порт будет доступен на хост-компьютере, на котором вы запускаете образ.

Я также предлагаю просмотреть флаг -P, так как он отличается от флага -p.

Также я предлагаю вам попробовать «Kitematic» для Windows или Mac, https://kitematic.com/. Это намного проще (но не забывайте делать коммиты после любых изменений!)

Теперь, что касается сети в вашей компании, это не имеет ничего общего с докером, пока вы используете докер локально на своем компьютере, не имеет значения, какую конфигурацию установила ваша компания. Даже вам не нужно менять какую-либо сетевую конфигурацию виртуальной машины, чтобы выставлять вещи на ваш локальный хост, все идет по умолчанию, если вы используете Vbox (адаптер 1 ==> NAT и адаптер 2 ==> только хост)

надеюсь, это то, что вы ищете

person Viktova    schedule 06.12.2017
comment
И как это поможет связаться с моей докерной машиной по имени хоста? - person Steffen Harbich; 06.12.2017
comment
контейнер докера должен быть сопоставлен с вашим локальным хостом, чтобы вы могли получить к нему доступ через веб-браузер. он не может работать каким-либо другим способом, но только если вы реплицируете адрес своего адаптера и назначаете его в режим bridge, чтобы он мог напрямую подключаться к физической сети со своим собственным IP-адресом, тогда вы можете получить к нему доступ, набрав его IP-адрес в браузере вместо localhost + если вы хотите ввести имя вместо IP-адреса в браузере, то это другая история, и вам нужно подделать имя для этого IP, используя unbound DNS или dnsmasq и т. д. - person Viktova; 06.12.2017

Если цель состоит в том, чтобы сделать его максимально простым для нескольких разработчиков, localhost будет вашим лучшим выбором. Пока порты, которые вы предоставляете и публикуете, доступны на хосте, вы можете просто использовать http://localhost в браузере. . Если это порт, отличный от 80/443, просто добавьте его, например, http://localhost:8080.

Если вы действительно не хотите идти по маршруту /etc/hosts или localhost, вы также можете приобрести домен и направить его на 127.0.0.1. Эта статья содержит немного больше деталей.

Пример:

dave-mbp:~ dave$ traceroute yoogle.com
traceroute to yoogle.com (127.0.0.1), 64 hops max, 52 byte packets
1  localhost (127.0.0.1)  0.742 ms  0.056 ms  0.046 ms

В качестве альтернативы, если вы не хотите покупать собственный домен и все разработчики находятся в одной сети, и вы можете управлять DHCP/DNS, вы можете настроить свой собственный DNS-сервер, чтобы включить частный маршрут обратно к 127.0.0.1. Концепция аналогична опции Public DNS, но немного более хрупкая, поскольку вы можете позволить своим разработчикам работать удаленно, за пределами контролируемой сети.

person HammerMeetNail    schedule 03.12.2017
comment
Использование localhost является вариантом. Как я могу сопоставить порты виртуальной машины докера виртуального ящика с локальным хостом? Есть ли автоматический способ, например, указать его в команде docker-machine? - person Steffen Harbich; 03.12.2017
comment
Я считаю, что с docker-machine вам нужно будет взаимодействовать с VirtualBox. Это быстрое изменение настроек для сопоставления порта хоста с портом виртуальной машины. Вашим разработчикам нужно просто запустить команду VBoxManage после того, как они установили Docker. Подробности см. в этом комментарии. - person HammerMeetNail; 04.12.2017

Подключение по имени хоста требует, чтобы вы перешли от имени хоста к разрешению IP. Это обрабатывается файлом hosts и возвращается к DNS. Все это происходит еще до того, как вы коснетесь контейнера докера, а сама машина докера не имеет каких-либо внешних крючков, чтобы выйти и настроить файл hosts или DNS-серверы.

В более новых версиях Docker для Windows вы запускаете контейнеры с HyperV, а сеть автоматически сопоставляет порты с локальным хостом, чтобы вы могли подключаться к http://localhost. Это не будет работать с докер-машиной, поскольку она запускает виртуальные машины без сопоставления с локальным хостом.

Если вы не хотите настраивать файл hosts, DNS и не можете использовать более новую версию докера, вам останется подключиться по IP. Что вы можете сделать, так это использовать бесплатный DNS-сервис с подстановочными знаками, такой как http://xip.io/, который сопоставляет любое имя, которое вы хотите, вместе с вашим IP-адресом, обратно на тот же IP-адрес. Это позволяет вам использовать такие вещи, как обратный прокси-сервер на основе имени хоста, для подключения к нескольким контейнерам внутри докера за одним и тем же портом.

Последний вариант — запустить виртуальную машину узла докера со статическим IP-адресом. Docker-machine пока не поддерживает это напрямую, так что вы можете положиться на удачу чтобы сохранить один и тот же IP-адрес из заданного диапазона, или используйте другой инструмент, например Vagrant, для запуска виртуальной машины узла докера со статическим IP-адресом на ноутбуке. Если у вас есть статический IP-адрес, вы можете изменить файл хоста один раз, создать запись DNS для каждого разработчика или использовать один и тот же URL-адрес xip.io для доступа к контейнерам каждый раз.

person BMitch    schedule 03.12.2017

Если вы работаете на машине с многоадресной рассылкой DNS (это Bonjour на Mac), то подход, который сработал для меня, заключается в запуске контейнер Avahi в vbox Docker Machine. Это позволяет мне обращаться к службам виртуальных машин по адресу <docker-machine-vm-name>.local. Никакого редактирования /etc/hosts, никаких сумасшедших сетевых настроек.

В своей работе я использую разные виртуальные машины Virtualbox для разных проектов, что обеспечивает хорошее разделение задач (предотвращает коллизии портов, позволяет удалить все контейнеры и образы, не затрагивая другие мои проекты и т. д.).

Используя docker-compose, я просто поместил экземпляр Avahi вверху каждого проекта:

version: '2'
services:
    avahi:
        image: 'enernoclabs/avahi:latest'
        network_mode: 'host'

Затем, если я запускаю веб-сервер на виртуальной машине с докер-контейнером, перенаправляющим порт 80, в браузере это просто http://machine-name.local.

person Greg Thole    schedule 16.01.2018

  • Вы можете добавить запись имени домена в свою hosts file:

    X.X.X.X  mymachine # Replace X.X.X.X by the IP of your docker machine
    
  • Вы также можете настроить DNS-сервер в своей локальной сети, если ваше приложение должно быть доступно для ваших коллег на вашем рабочем месте, и если ваш компьютер с Windows должен оставаться в качестве сервера.

    для этого потребуется сделать вашу виртуальную машину доступной из локальной сети, но переадресация портов может быть простым решением, если ваше приложение является единственным веб-сервисом, работающим на вашем хосте Windows. (Обратите внимание, что вы также можете настроить сервер Linux, чтобы избежать использования docker-machine в Windows, но вам все равно придется настроить статический IP-адрес для этого сервера, чтобы убедиться, что разрешение вашего доменного имени работает).

  • Вы также можете купить собственное доменное имя (или получить бесплатное) и назначить ему IP-адрес вашей докер-машины, если у вас нет прав на запись в файл hosts.

Но это решение может перестать работать через некоторое время, если хост приложения не имеет статического IP-адреса и если ваша докер-машина меняется IP). Если вы не настроите статический IP-адрес, это не означает, что он будет автоматически меняться, должно быть некоторое постоянство, если вы не сотрете машину, чтобы создать новую, но это также не гарантируется.

Также обратите внимание, что если вы настроите DNS-сервер, вам также придется разместить его на устройстве со статическим IP-адресом. Затем вашим коллегам придется настроить свою машину для использования этого.

person vmonteco    schedule 03.12.2017

Я предлагаю nginx-proxy. Это то, что я использую все время. Это особенно удобно, когда вы запускаете разные контейнеры, которые должны отвечать на один и тот же порт (например, несколько веб-сервисов).

nginx-proxy запускается отдельно от вашего сервиса и прослушивает события докеров, чтобы обновить свою собственную конфигурацию. После того, как вы запустите свой сервис и запросите порт, который прослушивает nginx-proxy, вы будете перенаправлены на свой сервис. Поэтому вам нужно либо запустить nginx-proxy с флагом DEFAULT_HOST, либо отправить желаемый хост в качестве параметра заголовка с запросом.

Поскольку я запускаю это только с простым докером, я не знаю, работает ли он с докер-машиной.

Если вы выберете этот вариант, вы можете решить, что определенный домен (например, .docker) будет полностью разрешен к локальному хосту. Это можно сделать в рамках всей компании с помощью DNS, локально с помощью файла hosts или промежуточного преобразователя (конкретное решение, конечно, зависит от вашей ОС). Если затем вы попытаетесь получить доступ к http://service1.docker, nginx-proxy направит маршрут к контейнеру, который затем ENV VIRTUAL_HOST=service1.docker . Это действительно удобно, потому что требуется только однократная настройка, и с этого момента она является динамической.

person fragmentedreality    schedule 06.12.2017