2014-08-31 5 views
8

Próbuję uruchomić wbudowany serwer php (php -S localhost:8080) przez okno dokowane, nie mogę jednak uzyskać dostępu do witryny z hosta - zawsze kończę z resetowaniem połączenia.Docker z wbudowanym serwerem php

Oto prosty Dockerfile buduję na:

FROM centos:centos6 

RUN rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm 
RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm 
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm 

RUN yum --enablerepo=remi,remi-php55 install -y php php-opcache php-cli php-pear php-common && yum clean all 
RUN php -r "readfile('https://getcomposer.org/installer');" | php 
RUN echo "date.timezone = Europe/Prague" >> /etc/php.ini 
RUN mv composer.phar /usr/bin/composer 
RUN php -r "eval('?>'.file_get_contents('http://backend.bolt80.com/piecrust/install'));" 
RUN mv piecrust.phar /usr/bin/chef 

CMD ["/bin/bash"] 

Czy to w ogóle możliwe, aby uruchomić ten serwer z docker? Próbując sprawić, żeby to działało, dowiedziałem się, że gdy nginx został zainstalowany i skonfigurowany do nasłuchiwania na tym samym porcie, jest dostępny z hosta. Wbudowany serwer PHP wydaje się być ukryty przed hostem, więc nie jest w stanie obsłużyć żadnych żądań.

Ktoś odniósł sukces, wykonując tę ​​pracę?

+0

Jak ty rozpoczęciem pojemnik? – Behe

+2

'docker run -it -p 8080: 8080 container/bin/bash' a następnie ręcznie uruchom serwer z' php -S localhost: 8080' w żądanym katalogu –

+0

Pamiętaj, że wewnętrzny serwer sieci Web PHP działa jednowątkowo i nie jest tworzony dla każdego środowiska produkcyjnego! – Paul

Odpowiedz

22

Jeśli z poziomu kontenera dokującego uruchamiasz serwer WWW pod numerem php -S localhost:8080, serwer internetowy akceptuje tylko połączenia pochodzące z samego kontenera dokowanego.

Aby móc komunikować się z serwer od gospodarza Döcker trzeba dokonać dwóch zmian:

  • w swoim Dockerfile, dodać EXPOSE 8080 lub podczas wykonywania pojemnik dodać -p 8080 do linii poleceń docker run. Dzięki temu dowiesz hosta Döcker że pojemnik ma program, który oczekuje komunikacji na porcie 8080
  • uruchomić serwer WWW z php -S 0.0.0.0:8080 dlatego też przyjmuje połączenia spoza samego pojemnika Döcker

Gdy masz uruchomiony kontenera z tymi zmianami otwórz nowy terminal na hoście dokera i użyj polecenia docker ps, aby zobaczyć, który port na hoście dokera jest przekazywany do portu 8080 w kontenerze. Na przykład:

$ docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS      NAMES 
fbccf4058b07  test:latest   "php -S 0.0.0.0:8080 4 minutes ago  Up 4 minutes  0.0.0.0:49153->8080/tcp sad_hawking 

W tym przykładzie portu 49153 gospodarza dokowanym ma być stosowany. Następnie zapytanie do serwera WWW do sprawdzania poprawności można komunikować się z nim:

$ curl http://localhost:49153

+0

Dlaczego 'localhost: 80' nie przyjmuje połączeń ze świata zewnętrznego, ale' 0.0.0.0: 80' będzie? – gvlasov

+3

@Suseika zobacz http://stackoverflow.com/questions/20778771/what-is-the-difference-merween-0-0-0-0-127-0-0-1-and-localhost – Thomasleveil