Как да получите достъп до уеб сървъра на Docker контейнер от хост

Работя под boot2docker 1.3.1.

Имам Docker контейнер, работещ с уеб сървър чрез uwsgi --http :8080.

Ако прикача към контейнера, мога да разглеждам уеб сайта с помощта на lynx http://127.0.0.1:8080, за да знам, че сървърът работи.

Пуснах моя контейнер с:

$ docker run -itP --expose 8080 uwsgi_app:0.2

Има следните подробности:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
5248ad86596d        uwsgi_app:0.2     "bash"              11 minutes ago      Up 11 minutes       0.0.0.0:49159->8080/tcp   cocky_hypatia
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' 5248ad86596d
172.17.0.107

Мислех, че мога да осъществя достъп до този уеб сайт от моя хост, като отида на http://172.17.0.107:49159.

Това не работи. Просто виждам „свързване...“ в Chrome, но не стигам доникъде.

какво правя грешно


person Anentropic    schedule 28.11.2014    source източник
comment
Използвате ли Boot2Docker на Mac или Windows PC? Ще приема Mac заради „$“   -  person Bryan    schedule 28.11.2014


Отговори (9)


Разширяване на Anentropic отговор: boot2docker е старото приложение за Mac и Windows, docker-machine е новото.

Първо, избройте вашите машини:

$ docker-machine ls

NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default   *        virtualbox   Running   tcp://192.168.99.100:2376

След това изберете една от машините (по подразбиране се нарича default) и:

$ docker-machine ip default

192.168.99.100
person HankCa    schedule 05.09.2015
comment
Реших проблемите ми с Windows. - person Zac Grierson; 11.03.2016
comment
Тази информация все още ли е вярна през 2016 г.? Не получавам резултати от изпълнението на docker-machine ls, въпреки че docker ps показва нещата, които работят в момента. - person Trejkaz; 02.09.2016
comment
Все още работи за мен на моя Mac. Няма съобщения за грешка? Опитайте да инсталирате отново docs.docker.com/docker-for-mac / docs.docker.com/docker-for-windows. Необходими са по-стари версии за оценка на някои конфигурации на обвивката като docs.docker.com/machine/get-started. - person HankCa; 07.11.2016
comment
Използвайте docker inspect $MY_CONTAINER | grep IPAddress. Не инсталирайте нищо ново - person JellicleCat; 23.07.2020
comment
docker ps решава проблема ми. Благодаря. - person erdikanik; 08.12.2020

Добре, глупав съм, намерих отговора в документите за boot2docker https://docs.docker.com/installation/mac/#container-port-redirection

Трябваше да използвам ip адреса на boot2docker vm, а не ip на контейнера, т.е.

$ boot2docker ip
192.168.59.103

и мога да разглеждам сайта си от хоста на http://192.168.59.103:49159/

Нямаше нужда да добавям route към хоста

person Anentropic    schedule 28.11.2014
comment
А, не забелязах опцията -P. - person Bryan; 28.11.2014
comment
В моя случай обърнах портове с опция run -p. -p 80:5000. Това ще съпостави порт 5000 вътре в нашия контейнер към порт 80 на нашия локален хост. Аз направих обратното. Вижте docs.docker.com/userguide/usingdocker - person Maxence; 21.10.2015
comment
Това реши проблема ми след 1 ден отстраняване на неизправности - person David; 22.02.2016
comment
boot2docker вече е отменен... вместо това използвайте docker-machine - person guijob; 19.09.2016

За да намерите IP адреса на вашия контейнер, трябва да имате нужда от НЕ допълнителни инсталации:

docker inspect <container>

Това предоставя богата информация. grep го за IPAddress.

person JellicleCat    schedule 10.08.2016
comment
OP вече показва, че той знае как да намери IPAddress с помощта на docker inspect. Въпросът му е конкретно по отношение на това защо изглежда, че връзката е неуспешна, когато се използва този IP адрес. - person Ben Collins; 03.10.2020

Можете да използвате опцията за съпоставяне на порт на boot2docker -L, както е описано тук .

Така че във вашия случай би било така

boot2docker ssh -L 0.0.0.0:8080:localhost:8080

и тогава

docker run -it -p 8080:8080 uwsgi_app:0.2

По този начин не е нужно да използвате IP адреса на boot2docker: можете да използвате localhost или свой собствен IP адрес (и вашият докер контейнер може да бъде достъпен отвън).

person Magic Wand    schedule 01.12.2014

Boot2docker е остарял, но все още може да имате този проблем на Docker за Windows или Mac, въпреки че същият контейнер работи на Linux. Един от симптомите е, че опитът за достъп до страница на сървъра вътре в контейнера дава грешка „не изпрати никакви данни“, за разлика от „не може да се свърже“.

Ако е така, може да е защото на Win/Mac хостът на контейнера има собствен IP, това не е localhost, както е на linux. Опитайте да стартирате Django на IP 0.0.0.0, което означава приемане на връзки от всички IP адреси, като това:

python manage.py runserver 0.0.0.0:8000

Като алтернатива, ако трябва да сте сигурни, че сървърът отговаря само на локални заявки (като например от вашия локален прокси като nginx, apache или gunicorn), можете да използвате IP адреса на хоста, върнат от hostname -i.

И се уверете, че използвате -p опцията за пренасочване на порт правилно в командата docker run.

Ако приемем, че всичко е наред, трябва да имате достъп до вашия сървър на http://localhost в браузър, работещ на хост машината.

person Jonathan Stray    schedule 10.04.2017

[РЕДАКТИРАНЕ: оригиналната версия пренебрегваше въпросния -P]

Ако искате да стигнете до контейнерите, без да се налага да „публикувате“ порта (което променя номера му), има добър преглед тук.

Ключът е този ред:

sudo route -n add 172.17.0.0/16 172.16.0.11

който казва на Mac как да маршрутизира към частната мрежа във VirtualBox VM, на която са включени Docker контейнерите.

person Bryan    schedule 28.11.2014
comment
самото добавяне на този маршрут не се коригира за мен. Чудя се какъв е този IP 172.16.0.11? трябва ли това да е IP на моя контейнер? Пробвах, но и това не работи - person Anentropic; 28.11.2014

Имах същия проблем и в моя случай използвах екземпляр на AWS EC2. Опитвах с IP на контейнера, който не работи. След това използвах действителния публичен IP на AWS хоста като IP, което проработи.

person Siva Dorai    schedule 06.09.2016
comment
О, БОЖЕ МОЙ. Загубих толкова много време зад това. Интересно каква е причината за това поведение - person f-z-N; 15.11.2016

Как да отстраните проблема с хостинг приложението на локален хост браузър

За това стартирайте контейнера с командата по-долу, в моя случай беше:

[root@centoslab3 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
1b81d8a0e3e1        centos:baseweb      "/bin/bash"         8 minutes ago       Exited (0) 24 seconds ago                       webtest
[root@centoslab3 ~]# docker run --name=atul -v /root/dockertest:/var/www/html -i -t -p 5000:8000 centos:baseweb /bin/bash

В httpd конфигурацията:

[root@adb28b08c9ed /]# cd /etc/httpd/conf
[root@adb28b08c9ed conf]# ll
total 52
-rw-r--r--. 1 root root 34419 Sep 19 15:16 httpd.conf

редактирайте файла с порт 8000 в listner и актуализирайте ip адреса и порта на контейнера под име на сървър.

Рестартирайте httpd услугата и сте готови.

Надявам се това да помогне

person Atul    schedule 15.12.2017

docker build -t {imagename}.

docker build -t api-rest-test .

docker run -dp {localport}:{exposeport} image:name

 docker run -dp 8080:8080 api-rest-test:latest

уверете се, че използвате същия порт за yourlocalport and exposeport

след това можете да получите достъп до вашата услуга за почивка във вашата локална машина http://localhost:8080

person muthukumar selvaraj    schedule 26.05.2021