Cuando llego el momento de preparar mi entorno para ensuciarme las manos con el código Mauro empezó a usar Homestead pero yo prefería virtualizar mi entorno de trabajo con Docker y supongo que muchos de ustedes también lo querrán hacer por eso decidí realizar este tutorial, espero que este tutorial los ayude
Requisitos
El único requisito es que sepas lo básico de Docker y que lo tengas instalado, si aún no sabes de Docker y los infinitos beneficios que puedes obtener al usarlo te recomiendo que tomes el curso de fundamentos de Docker
Archivos y directorios
Lo único que necesitas es replicar este sistema de archivos en la carpeta en la cual ejecutes tu servidor
docker-compose.yml
En este archivo colocaremos la configuración necesaria para construir nuestros “Servicios”, empecemos con el servidor en este caso yo voy a usar nginx
version:'3'
services: nginx: build: context: .
dockerfile: Dockerfile-nginx
volumes:
- ./symfony/:/var/www/symfony/ ports:
- 8001:80 networks:
- symfony
networks: symfony:
Adicionalmente colocaré una red llamada symfony para poder conectar los diferentes contenedores entre si, a continuación debemos añadir el servicio php
version: '3'
services:
nginx:
build:
context: .
dockerfile: Dockerfile-nginx
volumes:
- ./symfony/:/var/www/symfony/ ports:
-8001:80 networks:
- symfony
php:
build:
context: .
dockerfile: Dockerfile-php
environment:
APP_ENV: dev
volumes:
- ./symfony/:/var/www/symfony/ networks:
- symfony
depends_on:
- mysql
networks:
symfony:
Por último necesitaremos una base de datos yo usaré MySQL, el código que necesitamos es…
version: '3'
services:
nginx:
build:
context: .
dockerfile: Dockerfile-nginx
volumes:
- ./symfony/:/var/www/symfony/ ports:
-8001:80 networks:
- symfony
php:
build:
context: .
dockerfile: Dockerfile-php
environment:
APP_ENV: dev
volumes:
- ./symfony/:/var/www/symfony/ networks:
- symfony
depends_on:
- mysql
mysql:
image: mysql
command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci','--default-authentication-plugin=mysql_native_password']
ports:
-3306:3306 volumes:
- ./mysql:/var/lib/mysql
networks:
- symfony
networks:
symfony:
✨Listo?
No aún no esta, si estuviste atento a lo que muy probablemente solo copiaste y pegaste añadimos un contexto para la construcción y configuración para las imágenes de php y nginx
Dockerfile-php
FROM php:fpm-stretch
RUNapt-get update && apt-get install -y
RUNapt-get update && apt-get install -y \
git \
zlib1g-dev \
libxml2-dev \
libzip-dev \
&& docker-php-ext-install \
zip \
intl \
mysqli \
pdo pdo_mysql
RUNcurl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer
COPYsymfony/ /var/www/symfony
WORKDIR/var/www/symfony/
Lo que hacemos es usar una imagen de docker hub e instalamos un par de herramientas como composer que es un manejador de dependencias para php
Dockerfile-ngnix
FROM nginx:latest
COPY./build/nginx/default.conf /etc/nginx/conf.d/
Adicional a esto necesitamos la configuración de server
default.conf
server {
listen 80;
root /var/www/symfony/public;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
# Connect to the Docker service using fpm
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
internal;
}
location ~ \.php$ {
return 404;
}
error_log /dev/stdout info;
access_log /var/log/nginx/project_access.log;
}
Levantar los servicios
Desde la terminal ejecuta el comando dentó de la ruta …/symfony-docker/
docker-compose up -d --build
Esto construirá y creará los contenedores que puedes ver usando docker-compose ps
Instalación de Sympony
Ahora llego lo bueno, debemos entrar al contenedor de php que creamos usando
docker-compose exec php bash
Luego debemos configurar git porque si no la creación del proyecto puede fallar, cosas raras de composer
Ejecutamos en la consola del contenedor php, remplazando lógicamente por nuestros datos
git config --global user.name"John Doe"
git config --global user.email johndoe@example.com
y luego si podemos usar
composer create-project symfony/website-skeleton .
y si vas a 127.0.0.1:8001 debes ver algo así
No olvides que puedes cambiar los puertos por si usas xampp o algo asi para trabajar en local, todo está en el archivo docker-compose.yml
Algunas recomendaciones sobre entornos usando docker:
Si te interesa ir a más en estos temas déjame un mensaje para así hacer algunos tutoriales con los temas que más le interesen.
Saludos
Hola me interesa bastante los pasos que indicas, seria re bueno que hicieras un tutorial. : )
@mauricioacrueda no soy experto de docker ni mucho menos pero talvez docker no permite el absolute path usa el path relativo
@ElliotAlderson intente con el path relativo y absoluto, pero no funciono.
Pero tengo otra duda , porque envias ese COPY , si terminas creando un volumen para esa ruta ?
Elimine estas lineas :
COPY symfony/ /var/www/symfony
WORKDIR /var/www/symfony/
Y veo que la imagen sigue funcionando.
Muchas gracias por la respuesta.
Buenasss … una pregunta , debe ser Dockerfile-php.dockerfile ? o como ?
Gracias por el tutorial : )
Excelente tutorial , me queda una duda con esta linea
Dockerfile-php
COPY symfony/ /var/www/symfony
No lo puedo manejar en una carpeta diferente al Dockerfile la cuestion es que tengo mis proyecto en ~/WWW
COPY ~/WWW/symfony/ /var/www/symfony
pero me genera error , como podria manejar este tema , si la carpeta no esta en la raiz de dockfile.
Error:
“Service ‘php’ COPY failed: no such file or directory”
Adicional , porque se debe copiar toda la carpeta de symfony en la imagen de PHP ?
muchas gracias