Configuración de un entorno LEMP con Docker: Nginx, PHP-FPM y MySQL

Despliegeu del contenedor de Base de Datos (MySQL)

Para iniciar con la infraestructura, primero desplegamos un contenedor de MySQL en su versión 5.6. Es fundamental mapear los volúmenes para persistir la configuración, los registros de log y los datos del motor.

docker run -d \
  --name mysql_db \
  -p 3306:3306 \
  -v /opt/docker/mysql/config:/etc/mysql/conf.d \
  -v /opt/docker/mysql/logs:/logs \
  -v /opt/docker/mysql/data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=root_password_security \
  mysql:5.6 --innodb-flush-method=O_DSYNC --innodb-use-native-aio=0

Configuración del motor PHP-FPM

El siguiente paso consiste en levantar el intérprete de PHP 7.1. Vinculamos este contenedor con el de la base de datos para permitir la comunicación interna y montamos el directorio del código fuente.

docker run -d \
  --name php_service \
  -p 9000:9000 \
  -v /web_apps/proyecto:/var/www/html \
  --link mysql_db:db_host \
  php:7.1-fpm

Servidor Web Nginx

Finalmente, configuramos Nginx para que actúe como servidor frontal. En este ejemplo, se mapea un rango de puertos y se conectan los archivos de configuración y el código fuente.

docker run -d \
  --name nginx_server \
  -p 80:80 -p 81:81 -p 82:82 -p 83:83 -p 84:84 -p 85:85 \
  -v /web_apps/proyecto:/var/www/html \
  -v /opt/docker/nginx/conf.d:/etc/nginx/conf.d \
  -v /opt/docker/nginx/logs:/var/log/nginx \
  --link php_service:php_fpm \
  nginx

Gestión de permisos y SELinux

En sistemas operativos como CentOS o RHEL, SELinux puede bloquear el inicio de los contenedores o el acceso a los volúmenes. Si el contenedor de Nginx no inicia correctamente, se puede verificar el estado de SELinux.

Para una solución temporal (hasta el reiincio), ejecute:

su -c "setenforce 0"

Para deshabilitar SELinux de forma permanente o cambiarlo a modo permisivo, edite el archivo de configuración:

# Crear respaldo antes de editar
cp /etc/selinux/config /etc/selinux/config.old

# Cambiar el estado a permissive
sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

Instalación de extensiones PHP

Por defecto, la imagen oficial de PHP es minimalista. Para añadir funcionalidades como el soporte para MySQL, acceda al contenedor y utilice las herramientas integradas:

docker exec -it php_service /bin/bash
# Dentro del contenedor:
docker-php-ext-install pdo_mysql mysqli

Si necesita construir una imagen personalizada con múltiples dependencias, puede utilizar un bloque similar al siguiente en su Dockerfile:

RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
        libicu-dev \
        libxml2-dev \
        libxslt-dev \
        libbz2-dev \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) \
        gd \
        intl \
        soap \
        xsl \
        xmlrpc \
        bz2 \
        zip \
        pdo_mysql \
        mbstring \
        exif \
        bcmath \
        opcache

Etiquetas: Docker Nginx PHP-FPM MySQL selinux

Publicado el 7-12 02:48