8

馃懇鈥嶐煉籈ntorno de trabajo para Symfony usando Docker馃悩馃惓

Royer
R0Y3R
28181

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
Image 3.png

docker-compose.yml

En este archivo colocaremos la configuraci贸n necesaria para construir nuestros 鈥淪ervicios鈥, 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:

鉁↙isto?

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 [email protected].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铆
Image 4.png

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

Escribe tu comentario
+ 2
Ordenar por:
5
24073Puntos

Algunas recomendaciones sobre entornos usando docker:

  • Siempre que sea posible trata que tu imagen se base en el contenedor de php que usa alpine, es mucho m谩s peque帽o.
  • Instala todas tus dependencias cuando construyes tu imagen
  • Copia el proyecto dentro del contenedor
  • Por defecto crea la imagen con los par谩metros de producci贸n, la idea es que tu imagen sea inmutable y que el mismo contenedor se ejecute en todos los entornos. Define los ajustes de desarrollo en docker-compose y usa volumenes para montar el proyecto local.

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

4
1922Puntos
2 a帽os

Hola me interesa bastante los pasos que indicas, seria re bueno que hicieras un tutorial. : )

2
28181Puntos

@mauricioacrueda no soy experto de docker ni mucho menos pero talvez docker no permite el absolute path usa el path relativo

1
19245Puntos
2 a帽os

@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.

1
3438Puntos

Buenasss 鈥 una pregunta , debe ser Dockerfile-php.dockerfile ? o como ?

1
19245Puntos

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:
鈥淪ervice 鈥榩hp鈥 COPY failed: no such file or directory鈥

Adicional , porque se debe copiar toda la carpeta de symfony en la imagen de PHP ?

muchas gracias