Este es un ejemplo de configuración para ejecutar un proyecto PHP en contenedores Docker. Este proyecto consta de tres servicios principales: Una aplicación Angular & PHP, un servidor web Nginx y un servidor de base de datos MariaDB. También se incluye PHPMyAdmin para gestionar la base de datos.
Asegúrate de tener Docker y Docker Compose instalados en tu sistema antes de comenzar.
Asegúrate de que tu estructura de carpetas se vea de la siguiente manera:
proyecto-php-docker/
│
├── nginx/
│ ├── certs/
│ │ ├── server.crt
│ │ ├── server.key
│ │ └── Otras llaves y certificados de seguridad
│ │
│ ├── myphpwebsite.conf
│ └── nginx.conf
│
├── php/
│ ├── Dockerfile
│ ├── zz-docker.conf
│ ├── volumes.yml
│ ├── www.conf
│ └── Otros archivos de configuración para PHP
│
├── client/
│ ├── .devcontainer/
│ │ └── devcontainer.json
│ ├── .angular/
│ ├── src/
│ ├── angular.json
│ ├── package-lock.json
│ ├── package.json
│ └── Otros archivos de configuración para angular
│
├── server/
│ ├── .devcontainer/
│ │ └── devcontainer.json
│ ├── controlador/
│ ├── core/
│ ├── modelo/
│ ├── vistas/
│ └── index.php
│
└── docker-compose.yml
version: "3.8"
services:
# Nombre del servicio
app:
# Info para la contruccion de la imagen
build:
context: .
# Dockerfile con las instrucciones de contrucción de la imagen de la app usando de base de la imagen php:8.2-fpm-alpine
dockerfile: ./php/Dockerfile
# Nombre del contenedor
container_name: tecno_app
# Comando para iniciar el servidor de angular en la red local con el puerto 4200 y el servidor php-fpm
command: sh -c "ng serve --host 0.0.0.0 --port 4200 & php-fpm"
restart: "no"
volumes:
# - ./php/php.ini:/usr/local/etc/php/conf.d/php.ini
# - ./php/php.ini:/usr/local/etc/php/php.ini-production
# Redefinición del puerto de la imagen php:8.2-fpm-alpine
- ./php/zz-docker.conf:/usr/local/etc/php-fpm.d/zz-docker.conf
# Configuración del php-fpm
- ./php/www.conf:/usr/local/etc/php-fpm.d/www.conf
# Extension de la configuracion del servicio
extends:
# Nombre del archivo del que extendera el servicio
file: ./php/volumes.yml
# Nombre del servicio del que extiende
service: app_volumes
# Servicios que se deben iniciar antes que tecno_app
depends_on:
- mariadb
# Nombre del servicio
nginx:
# Imagen base del servicio
image: nginx:1.25.2-alpine
# Nombre del contenedor
container_name: tecno_nginx
restart: "no"
# Configuracion de puertos de acceso host:container_network
ports:
- "4200:4200"
- "8181:80"
- "450:443"
volumes:
# Configuración de los servidores web de nginx
- ./nginx/myphpwebsite.conf:/etc/nginx/conf.d/default.conf
# Configuracion principal nginx
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
# LLaves y certificados para el https
- ./nginx/certs/server.crt:/etc/nginx/ssl/server.crt
- ./nginx/certs/server.key:/etc/nginx/ssl/server.key
- ./nginx/certs/laravel.crt:/etc/nginx/ssl/laravel.crt
- ./nginx/certs/laravel.key:/etc/nginx/ssl/laravel.key
mariadb:
# Imagen base del servicio
image: mariadb:lts
container_name: tecno_mariadb
# Configuracion de puertos de acceso host:container_network
ports:
- "3309:3306"
environment:
# Configuracion de variables de entorno de mariadb
- MARIADB_ROOT_PASSWORD=root
- MARIADB_DATABASE=dbtecno2023
phpmyadmin:
image: phpmyadmin:apache
container_name: tecno_phpmyadmin
# Configuracion de puertos de acceso host:container_network
ports:
- "9090:80"
environment:
# Configuracion de variables de entorno para la conexion con el servicio de mariadb
- PMA_HOST=mariadb
- PMA_PORT=3306
- MYSQL_ROOT_PASSWORD=root
- PMA_ARBITRARY=1
# Servicios que se deben iniciar antes que tecno_phpmyadmin
depends_on:
- mariadb
# Imagen base que se usará para la construcción de la imagen
# Imagen que se usara para la construccion de la imagen
FROM php:8.2-fpm-alpine
# Copy composer.lock and composer.json
# COPY composer.lock composer.json /var/www/
# Librerias que se instalaran durante la construccion de la imagen
RUN apk update && apk add --no-cache \
linux-headers \
php82-dev \
automake \
neofetch \
autoconf \
g++ \
make \
build-base \
libpng-dev \
libjpeg-turbo-dev \
freetype-dev \
libzip-dev \
oniguruma-dev \
nodejs \
bash \
npm \
vim \
git \
curl \
zip \
unzip \
postgresql-dev \
libexif-dev \
libzip
ARG EXTENSIONS=/extensiones
RUN mkdir -p ${EXTENSIONS}
WORKDIR ${EXTENSIONS}
# Descargar Xdebug
RUN wget https://xdebug.org/files/xdebug-3.2.2.tgz && \
tar -xvzf xdebug-3.2.2.tgz && \
rm xdebug-3.2.2.tgz
# Cambiar al directorio Xdebug
WORKDIR /extensiones/xdebug-3.2.2
# Configurar Xdebug
RUN phpize && \
./configure && \
make && \
make install
# Habilitar Xdebug en la configuración de PHP
COPY ./php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
# Argumentos para la construccion de la imagen
ARG WWW_INSTALL_PATH_SERVER=/server
ARG APP_SERVER=${WWW_INSTALL_PATH_SERVER}/app_php
ARG WWW_INSTALL_PATH_CLIENT=/client
ARG APP_CLIENT=${WWW_INSTALL_PATH_CLIENT}/app_angular
ARG USER=www
ARG GROUP=www
# Creación de una carpeta
RUN mkdir -p ${WWW_INSTALL_PATH_SERVER}
# Definiiendo la carpeta de trabajo
WORKDIR ${WWW_INSTALL_PATH_SERVER}
# Eliminando cache
RUN rm -rf /var/cache/apk/lists/*
# Instalar y habilitar extensiones de PHP, incluyendo pdo_pgsql
RUN docker-php-ext-install pdo pdo_pgsql mbstring mysqli pdo_mysql zip exif pcntl gd
# Configurar la extensión GD
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
# Crea un grupo llamado "${GROUP}" con GID 1000
# Crea un usuario llamado "${USER}" con UID 1000, asignándolo al grupo "${GROUP}"
RUN addgroup -g 1000 ${GROUP}
RUN adduser -u 1000 -D -h /home/${USER} -s /bin/bash -G ${USER} ${GROUP}
# Establece el directorio de trabajo para la aplicación
WORKDIR ${APP_SERVER}
# Establece los permisos para el usuario ${USER}
RUN chown -R ${USER}:${GROUP} ${APP_SERVER} && \
chmod -R 755 ${APP_SERVER}
WORKDIR ${WWW_INSTALL_PATH_CLIENT}
RUN npm install -g @angular/cli
COPY ../client ${APP_CLIENT}
WORKDIR ${APP_CLIENT}
RUN npm install
RUN chown -R ${USER}:${GROUP} ${APP_CLIENT} && \
chmod -R 755 ${APP_CLIENT}
# Cambiar usuario actual a www
USER ${USER}
# Exponer el puerto para el servidor de angular
EXPOSE 4200
# La imagen php:8.2-fpm-alpine expone el puerto para el 9000 por defecto
# Puerto expuesto comentado y configurando el puerto en zz-docker.conf
# EXPOSE 9200
# Configurado por el docker compose
# CMD ["php-fpm"]
[global]
daemonize = no
# Puerto para el servidor php-fpm
[www]
listen = 9200
## Contributing