Comments 35
А вот как при запуске контейнера в Винде узнать его адрес с точки зрения винды, не парзя вывод ipconfig?
С точки зрения винды у всех контейнеров будет адрес VM с линукс, где эти контейнеры запускаются.
Странно что мой вопрос никто не понимает.
Я запускаю контейнер. В нем apache server. Я хочу к нему (внутрь) обратиться в Chrome на моей Винде. Какой адрес мне указать?
Если делаете docker run с ключем -p, то localhost.
Можно еще ip vm, которую использует докер.
По localhist я попаду на iis своей винды, а не внутрь докера! Винда докеру даёт отдельный IP, который можно выцепить в выводе ipconfig.
IIS слушает конкретный порт.
Если он занят, то чуда не произойдет. Опубликуйте докер приложение на другом порту.
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
То есть не то.
да, так как узнать этот адрес виртуалки?
вот какой у меня костыль
# 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. Который раз убеждаюсь, что сложнее всего выяснить очевидные вещи.
я знаю. Но мне нужен докер. Не понимаю, почему самое первое что человеку нужно - 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 пустоту.
Как исправить?
Как работает Docker Desktop Networking