7

Сначала я прошел учебник и запустил приложение фляги из учебника в контейнере. Это сработало.

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

Затем я нашел IP-адрес моей виртуальной машины с

seraf$ boot2docker ip
192.168.59.103

И мог получить доступ к примеру приложения на http://192.168.59.103:49157:

Вот изображение учебника Dockerfile:

FROM ubuntu:12.04
MAINTAINER Docker Education Team <education@docker.com>
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"]

Сейчас я пытаюсь запустить свое собственное колбу в докер-контейнере. Я строю образ:

FROM ubuntu:12.04
MAINTAINER Serafim Suhenky <email@example.com>
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

Тогда я делаю контейнер:

docker run -d -P seraf1m/web-app

Или с более простым изображением:

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

Или это:

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

И все идет хорошо до сих пор; Контейнер запущен, порт открыт, и я вижу журналы приложения.

Но я не могу получить доступ к своему приложению через http://192.168.59.103:49158 или другие порты, которые мне показывает docker ps .

В то же время я мог получить доступ к учебному приложению.

Что может быть не так с моим изображением? Может быть, что-то с виртуальной машиной?

seraf$ docker -v
Docker version 1.5.0, build a8a31ef

Я также попробовал это исправить; не знаю как это работает:

#!/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

Выключил виртуальную машину перед запуском. Затем включите и ничего не изменилось. Я откатился назад.

1 ответ1

7

Это была глупая ошибка. Все работало хорошо с докером.

Проблема была с приложением Flask, по умолчанию оно слушает только localhost. Чтобы заставить его слушать сеть, нужно установить

app.run(host = '0.0.0.0')

Вот как это все работает:

  1. Boot2docker устанавливает виртуальную машину на ваш Mac. Вы можете ssh в него с помощью boot2docker ssh .
  2. Эта виртуальная машина похожа на шлюз для запуска контейнеров. Каждый контейнер представляет собой виртуальный компьютер за этим шлюзом. Если вы подключились к виртуальной машине, вы можете пропинговать контейнеры. Чтобы узнать ip контейнера, вы должны прикрепить к нему

docker exec -it bash

Теперь вы внутри контейнера. Вы можете запустить ifconfig или ip addr show чтобы увидеть ip вашего контейнера.

  1. Как только у вас есть ip контейнера, вы можете пропинговать его из vm. И попробуйте подключиться к выставленному порту. (если вы видите 0.0.0.0:49155->5000/tcp в Docker docker ps то до 5000)

curl container_ip:container_port

Для меня он отказался подключиться, однако я мог подключиться из самого контейнера через curl localhost:5000

Вот как я понял это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .