A porta do Docker expõe falha no Mac OS X

7

Primeiramente eu fui através do tutorial e iniciei o aplicativo de frascos do tutorial no container. Funcionou.

seraf$ docker run -d -P training/webapp python app.py

Então encontrei o ip da minha máquina virtual com

seraf$ boot2docker ip
192.168.59.103

E poderia acessar o aplicativo de exemplo em http://192.168.59.103:49157 :

Aqui está o Dockerfile da imagem do tutorial:

FROM ubuntu:12.04
MAINTAINER Docker Education Team <[email protected]>
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -q curl python-all python-pip wget
ADD ./webapp /opt/webapp/
WORKDIR /opt/webapp
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python", "app.py"]

Agora, estou tentando executar meu próprio aplicativo de frasco dentro do contêiner do Docker. Estou construindo uma imagem:

FROM ubuntu:12.04
MAINTAINER Serafim Suhenky <[email protected]>
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install -y python-dev
RUN apt-get install -y python-pip
RUN pip install gunicorn
RUN pip install flask
#VOLUME /web
ADD ./casa-web /web
WORKDIR /web
EXPOSE 5000
ENTRYPOINT python casa-web.py

Então, estou fazendo um contêiner:

docker run -d -P seraf1m/web-app

Ou com uma imagem mais simples:

docker run -d -P seraf1m/web-app python casa-web.py

Ou isto:

docker run -d -p 5000:5000 seraf1m/web-app python casa-web.py

E tudo vai bem até agora; recipiente iniciado, porta exposta e consigo ver os registros do aplicativo.

Mas não consigo acessar meu aplicativo por meio de http://192.168.59.103:49158 ou outras portas que docker ps me mostra.

Ao mesmo tempo, posso acessar o aplicativo de tutorial.

O que poderia estar errado com minha imagem? Talvez algo com a máquina virtual?

seraf$ docker -v
Docker version 1.5.0, build a8a31ef

Eu também tentei essa correção; não sabe como funciona:

#!/bin/bash
for i in {49000..49900}; do
 VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port$i,tcp,,$i,,$i";
 VBoxManage modifyvm "boot2docker-vm" --natpf1 "udp-port$i,udp,,$i,,$i";
done

Desligou a máquina virtual antes de executá-la. Então ligue e nada mudou. Eu rolei de volta.

    
por Serafim Suhenky 17.02.2015 / 06:52

1 resposta

7

Esse foi um erro estúpido. Tudo funcionou bem com o docker.

O problema foi com o aplicativo Flask, que está escutando apenas o host local por padrão. Para fazê-lo ouvir a rede, você precisa definir

app.run(host= '0.0.0.0')

Então, aqui está como tudo funciona:

  1. O Boot2docker instala a máquina virtual no seu Mac. Você poderia ssh para ele com boot2docker ssh .
  2. Essa máquina virtual é como um gateway para a execução de contêineres. Cada contêiner é um pc virtual por trás desse gateway. Se você ssh'ed para o vm, você poderia pingar contêineres. Para descobrir o ip do container você deve anexar a ele

docker exec -it bash

Agora você está dentro do contêiner. Você pode executar ifconfig ou ip addr show para ver o ip do seu container.

  1. Depois de ter o ip do container, você pode fazer o ping da vm. E tente se conectar à porta exposta. (se você ver 0.0.0.0:49155->5000/tcp em docker ps a 5000)

curl container_ip:container_port

Para mim, ele se recusou a se conectar, no entanto eu poderia conectar-se do próprio container via curl localhost:5000

É assim que eu descobri.

    
por 17.02.2015 / 07:58

Tags