Docker con servidor incorporado php

3 minutos de lectura

avatar de usuario
michal zimmermann

Estoy tratando de ejecutar el servidor incorporado de php (php -S localhost:8080) a través de la ventana acoplable, aunque no puedo acceder al sitio desde el host; siempre termino con el restablecimiento de la conexión.

Aquí hay un Dockerfile simple en el que construyo:

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"]

¿Es posible ejecutar este servidor con docker? Mientras intentaba que funcionara, descubrí que cuando se instaló nginx y se configuró para escuchar en este mismo puerto, se puede acceder a él desde el host. El servidor incorporado de PHP parece estar oculto para el host, por lo que no puede atender ninguna solicitud.

¿Alguien tuvo éxito haciendo este trabajo?

  • ¿Cómo estás iniciando tu contenedor?

    – Behe

    31 de agosto de 2014 a las 16:38

  • docker run -it -p 8080:8080 container /bin/bash y luego inicio manualmente el servidor con php -S localhost:8080 en el directorio deseado

    –Michal Zimmermann

    31 de agosto de 2014 a las 16:58

  • ¡Tenga en cuenta que el servidor web interno de PHP se ejecuta en un solo subproceso y no está hecho para ningún entorno de producción!

    – Pablo

    3 de noviembre de 2014 a las 8:06


  • docker ejecutar -it -p 8080:8080 imagen /bin/bash

    – Alex S.

    12/09/2021 a las 19:26

avatar de usuario
thomasleveil

Si desde el contenedor docker inicia su servidor web con php -S localhost:8080 entonces el servidor web solo aceptará conexiones que se originen desde el propio contenedor docker.

Para poder comunicarse con su servidor web desde el host docker, debe realizar dos cambios:

  • en su Dockerfile, agregue EXPOSE 8080o al ejecutar el contenedor agregar -p 8080 hacia docker run línea de comando. Esto le dirá al host de la ventana acoplable que su contenedor tiene un programa que espera comunicación en el puerto 8080
  • iniciar el servidor web con php -S 0.0.0.0:8080 por lo que también acepta conexiones desde fuera del propio contenedor docker

Una vez que tenga un contenedor ejecutándose con esos cambios, abra una nueva terminal en el host de la ventana acoplable y use el docker ps Comando para ver qué puerto en el host de la ventana acoplable se reenvía al puerto 8080 en el contenedor. Por ejemplo:

$ 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

En este puerto de ejemplo 49153 del docker host se va a utilizar. Luego consulta tu servidor web para validar que puedes comunicarte con él:

$ curl http://localhost:49153

  • Por qué es eso localhost:80 no aceptará conexiones del mundo exterior, pero 0.0.0.0:80 ¿voluntad?

    – gvlasov

    8 de octubre de 2016 a las 0:35

  • @Suseika ver stackoverflow.com/questions/20778771/…

    – Thomaslevel

    8 oct 2016 a las 21:21

  • ¡Gracias! Cambiando localhost a 0.0.0.0 también me lo arreglaron!

    – Giel Berker

    11 de mayo de 2020 a las 10:21

  • También tenga en cuenta que si usa un Dockerfile, comience con CMD [ "php", "-S", "0.0.0.0:8080" ] (como 2 argumentos separados)

    – Laoujin

    27 mayo 2020 a las 23:35

¿Ha sido útil esta solución?