Eu extraí uma imagem do Docker:
$ docker pull ghost
E execute um contêiner da imagem:
$ docker run --name test-ghost -p 8080:2368 -d ghost
7d984e974f6a75fe18b3d397b5c8f0a428928a2be9df83f0d61a679aa5f537fc
Meu entendimento é que o -p
switch mapeará uma porta no host (8080) para uma porta dentro do Docker (2368), para que eu possa acessar o servidor web em execução no Docker, de fora do docker, ou seja, do meu host.
No entanto, quando tento navegar para qualquer um dos seguintes endereços no Chrome, a partir do meu host:
http://localhost:8080/
http://0.0.0.0:8080/
http://127.0.0.1:8080/
Estou tendo o erro a seguir:
This webpage is not available
ERR_CONNECTION_REFUSED
Parece que pode ser um problema de conectividade, e não um problema dentro do contêiner, pois quando inspeciono os processos em execução dentro do contêiner, parece que o NodeJS está em execução:
$ docker top test-ghost
UID PID PPID ... CMD
docker 4290 1028 ... npm
docker 4324 4290 ... sh -c node index
docker 4325 4324 ... node index
Mas parece que nada está escutando na porta 8080:
$ sudo lsof -n -i4TCP:8080 | grep LISTEN
$
Também verifiquei e meu firewall do MacOS está desligado.
Não espero uma solução completa aqui, pois sei que as informações que forneci são mínimas.
O que estou pensando é: como alguém resolveria esse problema?
Parece que a porta Docker está inacessível.
Existe alguma maneira de descobrir por que o mapeamento da porta não funcionou? Ou quais portassãosendo exposto pelo Docker? Talvez eu esteja mapeando a porta interna errada?
Ou há alguma outra sugestão geral sobre o que posso estar fazendo de errado aqui?
Responder1
Finalmente descobri como fazer isso funcionar!
Estou executando o Docker no MacOS e usando o 'Docker QuickStart Terminal'.
Acontece que navegar para 'localhost', '127.0.0.1', etc. estava errado, porque parece que o Docker configura seu próprio host:
## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ 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
Quando eu uso o 192.168.99.100
, fornecido acima, tudo funciona bem.
Responder2
Para descobrir o endereço IP do contêiner em execução, você pode usar:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' myContainerID
Responder3
Se você executar o docker, docker-machine
use o seguinte comando para obter o endereço IP (assumindo que default
seja o seu nome):
docker-machine ip default
Responder4
Comecei a brincar com o docker e este é o primeiro problema que encontrei.
Parece que o docker permite especificar se você está usando portas em modos diferentes, como - host, bridge (padrão)
No modo bridge, a janela de encaixe mostra uma mensagem assim que você implanta o ghost - Seu blog agora está disponível emhttp://localhost:2368/mas visitar este URL mostra que a conexão foi recusada.
para corrigir isso você precisa visitar as configurações da instância no kitematic (mais fácil do que usar o console). Vá para a guia nome do host/portas. Crie um mapeamento conforme mostrado na imagem da porta do docker para a porta do host e bingo. agora visite o URL novamente e tudo funcionará conforme o esperado.