¿Cómo puedo conectar php-apache y MySQL usando Docker?

4 minutos de lectura

Tengo un sitio de WordPress en un servidor en vivo y quiero crear una pila LAMP localmente con Docker para probar cosas.

Saco las imágenes de php:7.0-apache y mysql:5.7las mismas versiones en vivo.

Creo un contenedor MySQL:

docker run -d --name achi-mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

Creo un contenedor de php y apache y lo vinculo con MySQL:

docker run -d --name achi-php-apache --link achi-mysql:mysql -p 8080:80 -v /home/achi/workspace/web/wordpress-template/:/var/www/html php:7.0-apache

Recibo el siguiente error en localhost: 8080:

Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /var/www/html/wp-includes/wp-db.php:1564 [...]

¿Enlazo estos dos contenedores de forma incorrecta?

  • los mysql_* Las funciones están obsoletas/eliminadas desde PHP 7.0. versión wordpress?

    – Sebastián Brosch

    13 de marzo de 2018 a las 11:05

  • @SebastianBrosch wordpress v4.9.4

    – Achi Papakon

    13 de marzo de 2018 a las 11:38

  • También hay una wordpress imagen que puedes probar. Aquí hay una guía que puede ayudar: docs.docker.com/compose/wordpress/

    – tgogos

    13 de marzo de 2018 a las 12:43

avatar de usuario
Sebastián Brosch

Su problema no es la conexión entre sus contenedores. El problema es su contenedor PHP/Apache que no es compatible mysqli (o PDO MySQL). WordPress no puede encontrar otra función para conectarse con una base de datos MySQL o su contenedor MySQL. En su lugar, WordPress está usando un obsoleto y eliminado (desde PHP 7.0) mysql_ función por defecto. Necesitas instalar al menos mysqli en su contenedor PHP (explicado a continuación).

También recomiendo usar un docker-compose para instalar y ejecutar todos los contenedores con un solo comando.

Para crear los contenedores que desee, puede utilizar lo siguiente docker-compose.yml expediente:

version: "3"

services:
  achi-php-apache:
    build:
      context: ./
    container_name: achi-php-apache
    ports:
      - "8080:80"
    volumes:
      - /home/achi/workspace/web/wordpress-template:/var/www/html:rw
    depends_on:
      - achi-mysql
    networks:
      - wp-net
  achi-mysql:
    image: mysql:5.7
    container_name: achi-mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wp-dbname
    volumes:
      - wp-mysql-data:/var/lib/mysql
    networks:
      - wp-net

networks:
  wp-net:
    driver: bridge

volumes:
  wp-mysql-data:

Necesitas lo siguiente Dockerfile en el mismo directorio que el docker-compose.yml expediente:

FROM php:7.0-apache

RUN docker-php-ext-install -j$(nproc) mysqli

Este Dockerfile instala lo que falta mysqli extensión para que WordPress pueda usarla.

También puede usar PDO MySQL en lugar de mysqli. En este caso puedes usar el siguiente Dockerfile:

FROM php:7.0-apache

RUN docker-php-ext-install -j$(nproc) pdo
RUN docker-php-ext-install -j$(nproc) pdo_mysql

Ahora puedes ejecutar el comando docker-compose up dentro de la carpeta donde se encuentra docker-compose.yml se encuentra el archivo. Después de crear el contenedor y ejecutarlo, debería poder acceder al sitio de WordPress (<ip-or-hostname>:8080).

Sobre el wp-config.php archivo que necesita para utilizar las siguientes constantes:

define('DB_NAME', 'wp-dbname');
define('DB_USER', 'root');
define('DB_PASSWORD', '123456');
define('DB_HOST', 'achi-mysql');

También puede utilizar el imagen oficial de wordpress para instalar WordPress. En este caso puedes usar lo siguiente docker-compose.yml expediente:

version: "3"

services:
  achi-php-apache:
    image: wordpress:4.9.4-php7.0-apache
    container_name: achi-php-apache
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: achi-mysql
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: 123456
      WORDPRESS_DB_NAME: wp-dbname
    volumes:
      - /home/achi/workspace/web/wordpress-template:/var/www/html:rw
    depends_on:
      - achi-mysql
    networks:
      - wp-net
  achi-mysql:
    image: mysql:5.7
    container_name: achi-mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wp-dbname
    volumes:
      - wp-mysql-data:/var/lib/mysql
    networks:
      - wp-net

networks:
  wp-net:
    driver: bridge

volumes:
  wp-mysql-data:

  • Gracias, utilicé el primer método que describiste (no la imagen de wordpress).

    – Achi Papakon

    16 de marzo de 2018 a las 7:09

La forma más sencilla es usar docker-compose para vincular todas las instancias de docker en lugar de vincularlas a través del comando docker. Aquí hay un archivo docker-compose.yml de muestra que debería hacer lo que desea:

version: '2'
services:
  achi-php-apache:
    image: php:7.0-apache
    ports:
     - "8080:80"
    volumes:
     - /home/achi/workspace/web/wordpress-template/:/var/www/html
    links:
     - achi-mysql
  achi-mysql:
    image: mysql:5.7
    volumes:
     - /var/lib/mysql
    ports:
     - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_USER: someuser
      MYSQL_PASSWORD: somepassword
      MYSQL_DATABASE: somedefaultdatabase

  • Gracias, esta solución está limpia pero sigo recibiendo el mismo error. ¿Puede ser que a mi imagen php le falten algunas funciones? Sin embargo, estoy usando el 7.0 oficial.

    – Achi Papakon

    13 de marzo de 2018 a las 12:34

  • Sí, creo que es probable que necesite actualizar la configuración de PHP para permitir las funciones de mysql_, pero si puede actualizar su wordpress para usar las funciones de mysqli_ en su lugar, sería más seguro.

    – davidethell

    13 de marzo de 2018 a las 14:27

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad