Как получить доступ к веб-серверу контейнера 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, не получая никуда.
Что я делаю неправильно?
Ответы
Ответ 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, и все будет готово.
Надеюсь, что это поможет