Pull to refresh

Comments 35

А вот как при запуске контейнера в Винде узнать его адрес с точки зрения винды, не парзя вывод ipconfig?

С точки зрения винды у всех контейнеров будет адрес VM с линукс, где эти контейнеры запускаются.

Странно что мой вопрос никто не понимает.

Я запускаю контейнер. В нем apache server. Я хочу к нему (внутрь) обратиться в Chrome на моей Винде. Какой адрес мне указать?

Если делаете docker run с ключем -p, то localhost.
Можно еще ip vm, которую использует докер.

По localhist я попаду на iis своей винды, а не внутрь докера! Винда докеру даёт отдельный IP, который можно выцепить в выводе ipconfig.

IIS слушает конкретный порт.
Если он занят, то чуда не произойдет. Опубликуйте докер приложение на другом порту.

Если у вас докердесктоп, то он при установке прописывает себя в hosts в виде:
192.168.31.54 host.docker.internal
192.168.31.54 gateway.docker.internal

у меня прописал:

Added by Docker Desktop

192.168.1.6 host.docker.internal
192.168.1.6 gateway.docker.internal

To allow the same kube context to work on the host and the container:

127.0.0.1 kubernetes.docker.internal

End of section

То есть не то.

В смысле не то? Я пошел в свой докер-десктоп, и запустил там контейнер nginx заэкспоузив порт 30600:80, после чего вбил в адресную строку хрома host.docker.internal:30600 и получил ожидаемую «Welcome to nginx!». Я чего-то не понял в вопросе?

да, так как узнать этот адрес виртуалки?

вот какой у меня костыль

# find container IP
&ipconfig >tmp.tmp
$n = 0
ForEach ($line in (Get-Content "tmp.tmp")) {
  if ($n -gt 0) { $n = $n + 1 }
  if ($line -eq 'Ethernet adapter vEthernet (WSL):') { $n = 1}
  if ($n -eq 5) { break }
}
$http = 'http://' + $line.split(':')[1].trimStart().trimEnd() + ':8080'

А он вам зачем?
Со своей машины ходите через локалхост.
С других машин - по айпи своей машины.
У вм скорее всего адрес динамический.

Есть некая система, которая очень сложно конфигурируется. Соответственно демо где надо выполнить 30 пунктов никто выполнять не будет.

Я сделал все эти шаги в убунту для докера. Теперь можно скачать image, запустить и коннектиться к этой системе. Только вот незадача, выяснить ip без костылей никак(

Опять таки, у виртуалки докера ip НЕ localhost. Это какой то динамически выделенный новый IP в домашней сетке.

Вас несколько раз спросили зачем вам адрес в подсети докера, который каждый раз будет разный? Чтобы пробиться с хоста в докер образ - используем localhost или например ipv6 ::1

Блин, да, адрес разный. И localhost НЕ РАБОТАЕТ - это локальная машина а не докер. Придется делать картинки. итак, запускаю докер.

Внутри убунта и Apache на 8080 порту. Запускаю ipconfig чтгобы понять IP контейнера:

Обращаемся по этому адресу. Все в порядке:

Для проверки зайдем на 8080 localhost:

Потому что этот однострочный сайт я только что сляпал для IIS. Это не удивительно, потому что IP моей виндовой машины:

И мой вопрос, как без костылей (парзинг вывода ipconfig) узнать у самого докера его адрес (172.19.112.1), он может меняться.

Если порт контейнера проброшен на хост через -p 8000:8000, то на хосте docker api будет слушать порт 8000 на всех интерфейсах (0.0.0.0) и перенаправлять запросы на 8000 порт контейнера. Тогда запросы на localhost:8000 в браузере будут отправляться в контейнер, и при этом не нужно знать постоянно меняющийся IP виртуалки. Если запускать контейнер с -p 127.0.0.1:8000:8000, то docker api будет слушать 8000 порт на localhost, и это все также будет работать, но при этом в контейнер нельзя будет обратиться из других машин в той же локальной сети, что и хост.

А вот зачем пытаться обратиться в контейнер без проброса соответвующего порта, гадая какой там IP, и придумывая для каждой ОС свой набор костылей, я решительно не понимаю.

Да. Я рассматривал докер как виртуалку, и не пробрасывал порты из-за конфликтов. Я не знал что это является нестандартным кейсом.

Я вас убедил картинками что по localhost НЕ ПРОБИТЬСЯ в докер образ?

localhost = 192.168.1.6

docker = 172.19.112.1

"используем localhost или например ipv6 ::1 " - идет на виндовую машину но никак ни на докер

тебе уже несколько раз ответили, что если в случае docker-desktop на винде, порт контейнера выставленный наружу доступен на localhost винды.

И мои скриншоты показывают, что это не так)

это не так у тебя. Обратись в тех поддержку.

Образ был запущен с пробросом портов?

Порт был свободен?

Похоже я понял. Это ведь первый эксперимент с докером. Сделал образ, запустил с -p, он ругался что порт занят, потому что у меня такое же стоит на Винде

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

Вы первый спросили про -p вместо повторяющихся мантр "все должно работать по localhost". Спасибо вам

Ну в смысле первый?
https://habr.com/ru/company/southbridge/blog/719412/comments/#comment_25278468
"Если делаете docker run с ключем -p, то localhost. "
Вот тут я сразу говорю про ключ -p же.

И дальше про вашу ситуацию:
"IIS слушает конкретный порт. Если он занят, то чуда не произойдет. Опубликуйте докер приложение на другом порту. "

P.S. Который раз убеждаюсь, что сложнее всего выяснить очевидные вещи.

Если это виртуалка в VirtualBox к примеру, то у нее в настройках сети есть mac-адрес, и он не меняется при перезапусках — в настройках домашнего роутера можно для него прописать конкретный ip в настройках dhcp.

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

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

Это делается так же и в самом Linux между прочим, флагом -p

Тогда в Docker Desktop мы видим такую картину:

Что затем открывается как http://localhost:3001/dashboard, и при настройке фаерволла доступно с других машин.

Если вам нужен адрес контейнера, то тут во всех докерах одинаково все в общем-то.

И да, это не позволит естественно слушать один порт на одном адресе нескольким приложениям

Не успел отредактировать, собственно такая же проблема у вас будет при запуске внутри виртуальной машины, вы должны знать её адрес.

Озвученная вами проблема существует и вне докера в общем-то, и он её не решает.

Спасибо, все заработало.

Остался один вопрос из любопытства: допустим внутри докера есть компонент, у которого есть конфиг файлы, которые должны лежать в его дереве, то есть их не вынесешь в отдельный volume. Как принято их менять? Способов много, но все неудобные

тут зависит от точной структуры директорий.

Вы же можете спокойно любую папку/файл сделать как Volume.

Если директорий должна быть не пуста(скажем конфиг по умолчанию), то можно это сделать подменив точку входа при сборке контейнера, а в ней, инициализировать директорию конфигурацией по умолчанию если она пуста.(например pgSQL контейнер так создает БД в data Volume)

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

Есть случаи(чаще в k8s это встречал правда), когда есть еще процесс что следить за конфигами в отдельной директории, потом конвертирует/копирует что надо основному процессу и дает ему сигнал перечитать.

Лучше же чтоб конфиг был полностью в своей директории, тогда просто монтируете ее как Volume, и проблемы нет.

хорошо если тут не знают значит не где не знают.

Вопрос про настройку контейнера с сетевым интерфейсом бридж - macvlan. Как знаете когда выбираете этот интерфейс , то ваш контейнер получает от вашего DHCP (роутера) динамический IP адрес, и вы можете из любого устройства вашей локальной сети зайти по этому адресу как будто это еще одна физическая машина (ну или виртуальная машина с режиме бридж).

Так вот , есть всетаки одно отличие , когда вы запускаете виртуальная машину то в DHCP вы видите не только выданный IP адрес, но и ИМЯ этой машины, соотвественно вы можете обратиться по имени как http://myvirtualmachine/ вместо IP.

Но когда в docker запускаешь контейнер в режиме macvlan , то имя не подхватывается , а в DHCP на роутере вижу в колонке hostname пустоту.

Как исправить?

Sign up to leave a comment.