Por padrão, o docker não permite que o ambiente externo acesse algum serviço rodando dentro de uma imagem.
Para que isso possa ser feito, é necessário expor a porta do container para o ambiente externo e, para fazer isso, primeiramente, é preciso que a imagem que esteja querendo rodar exponha a porta desejada.
Isso é feito com o comando EXPOSE do Dockerfile
, como no exemplo:
EXPOSE 3000 8080 9999
Uma imagem Docker pode expor uma série de portas!
Se a imagem que está sendo rodada seja de autoria do desenvolvedor, basta adicionar a porta desejada ao EXPOSE.
Caso o desenvolvedor esteja rodando uma imagem pronta, do docker-hub, por exemplo, geralmente a documentação das portas expostas pela imagem ficam na própria página da mesma no docker-hub!
Tendo as portas expostas na imagem, basta expor elas para o ambiente externo ao executar, algo que pode ser feito de duas formas:
-
Via interface do docker desktop
Digamos que o desenvolvedor queira executar um container e, dentro dele, ele rodará duas aplicações, uma rodando na porta 4200, e outra na porta 3000.
E ele queira acessar essas duas aplicações da máquina local dele.
Ele poderá fazer isso facilmente pela interface do docker desktop, basta mapear a porta do container para a porta da máquina local:


-
Via linha de comando:
O mesmo pode ser feito via linha de comando, usando o parâmetro-p
.
Por exemplo, para o exemplo acima, poderíamos rodar:
docker run -p 4200:4200 -p 3000:3000 minha_imagem
Em ambos os casos, o docker mapeará a porta de dentro do container, para a porta da máquina aonde o container está sendo rodado.
No caso da linha de comando, a porta do lado da esquerda do :
é a porta local, e da direita, é a porta dentro do container.
É possível mapear uma porta dentro do container a uma porta diferente da máquina, por exemplo:
docker run -p 3000:4200 minha_imagem
Mapeará a porta 4200 do container para a porta 3000 da máquina local.