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.7
las 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?
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:
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
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