Я извлек образ Docker:
$ docker pull ghost
И запустим контейнер из образа:
$ docker run --name test-ghost -p 8080:2368 -d ghost
7d984e974f6a75fe18b3d397b5c8f0a428928a2be9df83f0d61a679aa5f537fc
Насколько я понимаю, коммутатор -p
сопоставит порт на хосте (8080) с портом внутри Docker (2368), чтобы я мог подключиться к веб-серверу, работающему в Docker, извне Docker, то есть с моего хоста.
Однако при попытке перейти по любому из следующих адресов в Chrome с моего хоста:
http://localhost:8080/
http://0.0.0.0:8080/
http://127.0.0.1:8080/
Я получаю следующую ошибку:
This webpage is not available
ERR_CONNECTION_REFUSED
Похоже, что это проблема с подключением, а не проблема внутри контейнера, поскольку при проверке запущенных процессов внутри контейнера выясняется, что NodeJS запущен:
$ docker top test-ghost
UID PID PPID ... CMD
docker 4290 1028 ... npm
docker 4324 4290 ... sh -c node index
docker 4325 4324 ... node index
Но, похоже, порт 8080 никто не прослушивает:
$ sudo lsof -n -i4TCP:8080 | grep LISTEN
$
Я также проверил, и мой брандмауэр MacOS отключен.
Я не ожидаю здесь полного решения, поскольку понимаю, что предоставленная мной информация минимальна.
Мне интересно, как можно решить такую проблему?
Похоже, порт Docker недоступен.
Есть ли способ узнать, почему не сработало сопоставление портов? Или какие портыявляютсяподвергается воздействию Docker? Возможно, я указываю не тот внутренний порт?
Или есть какие-то другие общие предположения относительно того, что я могу делать неправильно?
решение1
Наконец-то понял, как это сделать!
Я запускаю Docker на MacOS и использую «Docker QuickStart Terminal».
Оказывается, переход к «localhost», «127.0.0.1» и т. д. был неправильным, поскольку похоже, что Docker настраивает свой собственный хост:
## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com
Когда я использую 192.168.99.100
то, что указано выше, все работает нормально.
решение2
Чтобы узнать IP-адрес работающего контейнера, вы можете использовать:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' myContainerID
решение3
Если вы запускаете docker, docker-machine
используйте следующую команду, чтобы получить IP-адрес (предполагается, default
что это ваше имя):
docker-machine ip default
решение4
Начал играть с Docker, и это первая проблема/задача, с которой я столкнулся.
Похоже, что Docker позволяет вам указать, используете ли вы порты в разных режимах, таких как - хост, мост (по умолчанию)
В режиме моста Docker показывает вам сообщение после развертывания Ghost - Ваш блог теперь доступен наhttp://localhost:2368/но при посещении этого URL-адреса выводится сообщение об отказе в подключении.
Чтобы исправить это, вам нужно зайти в настройки экземпляра в kitematic (проще, чем использовать консоль). Перейдите на вкладку hostname / ports. Создайте сопоставление, как показано на изображении, из порта docker в порт хоста и бинго. Теперь снова зайдите на URL, и все заработает, как и ожидалось.