Подтвердить что ты не робот

Как получить доступ к веб-серверу контейнера 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, не получая никуда.

Что я делаю неправильно?

4b9b3361

Ответ 1

Хорошо, глупо мне, я нашел ответ в документах для 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 на хост

Ответ 2

Расширение Anentropic answer: 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

Ответ 3

Чтобы найти IP-адрес вашего контейнера, вам нужно НЕТ дополнительных установок:

docker inspect <container>

Это дает массу информации. grep для IP-адреса.

Ответ 4

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

Ответ 5

Имел ту же проблему, и в моем случае я использовал экземпляр AWS EC2. Я пытался с IP-контейнером, который не работал. Затем я использовал фактический публичный IP-адрес хоста AWS в качестве IP-адреса, который работал.

Ответ 6

[EDIT: исходная версия игнорировала вопрос -P]

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

Ключ этой строки:

sudo route -n add 172.17.0.0/16 172.16.0.11

который сообщает Mac, как перенаправить в частную сеть внутри виртуальной виртуальной машины, в которую включены контейнеры Docker.

Ответ 7

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 в браузере, запущенном на главной машине.

Ответ 8

Как устранить проблему при размещении приложения в локальном хост-браузере

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

[[email protected] ~]# 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
[[email protected] ~]# docker run --name=atul -v /root/dockertest:/var/www/html -i -t -p 5000:8000 centos:baseweb /bin/bash

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

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

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

Перезапустите службу httpd, и все будет готово.

Надеюсь, что это поможет