miércoles, 9 de octubre de 2019

Docker en Windows parte 5: Hola Mundo con Apache + PHP

Hola. Veamos como bajar una imagen Apache y PHP y agregar un Script PHP y todo ese conjunto que corra como contenedor.

Ir a Parte 4: https://naldog.blogspot.com/2019/10/docker-en-windows-parte-4-administrando.html
Ir a Parte 6: https://naldog.blogspot.com/2019/10/docker-en-windows-parte-6-dockerfile-y.html
______________________________

Bueno partamos. La imagen oficial de Apache es esta https://hub.docker.com/_/httpd
Juguemos un poco. Escribe como siempre:

docker run -it -p 8080:8080 httpd

Aquí tenemos algo raro, la salida es algo así:

AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Wed Oct 02 01:37:52.268432 2019] [mpm_event:notice] [pid 1:tid 140578472174720] AH00489: Apache/2.4.41 (Unix) configured -- resuming normal operations
[Wed Oct 02 01:37:52.268710 2019] [core:notice] [pid 1:tid 140578472174720] AH00094: Command line: 'httpd -D FOREGROUND'
[Wed Oct 02 01:37:52.557702 2019] [mpm_event:notice] [pid 1:tid 140578472174720] AH00492: caught SIGWINCH, shutting down gracefully

Y si vas al navegador y escribes http://localhost:8080/ da error ya que no levantó.
Esto está raro....

Volvamos a leer. En la página de Docker Hub indica que es la versión sin PHP. Pero si queremos HTTPD (Apache) con PHP dice que veas el sitio de PHP en Docker Hub en la sección con tags -apache. Entonces, vamos a la página de PHP: https://hub.docker.com/_/php y leamos bien.

Partamos deteniendo y borrando el contenedor e imagen

docker stop <nombre de contenedor>
docker rm <nombre de contenedor>

Eliminar imagen

docker rmi <id de imagen>

En la página de PHP sección tag -apache dice que si quieres PHP con Apache usa

php:<version>-apache

Entonces usa
docker run -it -p 8080:8080 php:7.2-apache

Luego dirá:

Status: Downloaded newer image for php:7.2-apache
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Thu Oct 10 01:28:23.004899 2019] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.2.23 configured -- resuming normal operations
[Thu Oct 10 01:28:23.006068 2019] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
[Thu Oct 10 01:28:24.464910 2019] [mpm_prefork:notice] [pid 1] AH00170: caught SIGWINCH, shutting down gracefully

Mismo mensaje...

Si haces un
docker ps -a

Se verá que no está corriendo ya que está en modo Exited (0)

Haz un
docker stop <id>

Vamos de nuevo. Si leemos la documentación de Apache en Docker Hub, nunca dijo que el port es 8080, así que dejémoslo en 80. Para nosotros, afuera si es 8080.

docker rm <nombre>

Corrámoslo de nuevo y le damos un nombre

docker run -d -p 8080:80 --name php_apache <imagen>

Ahora si ves

docker ps -a

Verás la columna PORTS
0.0.0.0:8080->80/tcp

Bien. Y está Up 1 minute.

Si haz a tu navegador y ejecutas
http://localhost:8080

Verás un magnífico error de Apache. Si. levantó.
Dockerfile y build

Pasemos al siguiente nivel, creemos un dockerfile y metámosle un script php adentro del Contenedor.

Crea una carpeta en disco C llamada docker
adentro otra carpeta phpapp
Crea otra carpeta llamada src dentro de phpapp
Crea un archivo llamado dockerfile (sin extensión, usa un editor de texto) y déjalo en C:\docker\phpapp\

Dentro del dockerfile escribe y guarda el archivo

FROM php:7.2-apache
COPY src/ /var/www/html/

Dentro de src crea un archivo llamado index.php
<html>
 <body>
 <?php echo '<p>holaa</p>'; ?> 
 </body>
</html>
Ve por PowerShell 

primero detén y borra el contenedor php_apache ya que lo crearemos de nuevo.

Ve a la carpeta

cd c:\docker\phpapp

Creando la Imagen

Allí adentro ejecuta:

docker build -t php_app .

Saldrá mensaje de que estás armando una imagen a partir Windows y que debes tener ojo con los permisos.

Si haces docker images verás la nueva imagen tuya, pesa 400 MB y algo.

Creando contenedor

Ejecuta docker run para crear el contenedor a partir de la imagen:
docker run -d -p 8080:80 --name php_apache php_app

Si ves los contenedores verás que está corriendo ok

docker ps -a

Si vas a http://localhost:8080 verás la magia por fin.
Viendo Logs

Si escribes

docker logs <nombre contenedor>

Ejemplo

docker logs php_apache

Verás el clásico log de apache, como los accesos, fecha hora, navegador, etc.

Error bizarro

Si al escribir

docker run -d -p 8081:80 --name php_apache php_app

Te da el error

C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: driver failed programming external connectivity on endpoint php_apache (584c1135bb9806413f8d151751663752ce5e9fd1c3cae04421956bd01b5b8df3): Error starting userland proxy: /forwards/expose/port returned unexpected status: 500.

En todos lados dicen que se soluciona:

1. Reiniciando Docker (botón derecho sobre la ballenita)
2. Reiniciando el PC
3. Cambiando el port público a 8081
docker run -d -p 8081:80 --name php_apache php_app

En mi caso, no había caso, y solo la opción 3 me funcionó.

______________________________