Ich habe eine WordPress-Site auf einem Live-Server und möchte mit Docker lokal einen LAMP-Stack erstellen, um Dinge zu testen.
Ich ziehe die Bilder aus php:7.0-apache
und mysql:5.7
die gleichen Versionen auf Live.
Ich erstelle einen MySQL-Container:
docker run -d --name achi-mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
Ich erstelle einen PHP- und Apache-Container und verknüpfe ihn mit 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
Ich erhalte die folgende Fehlermeldung auf localhost:8080:
Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /var/www/html/wp-includes/wp-db.php:1564 [...]
Verknüpfe ich diese beiden Container falsch?
Ihr Problem ist nicht die Verbindung zwischen Ihren Containern. Das Problem ist Ihr PHP / Apache-Container, der dies nicht unterstützt mysqli
(oder PDO-MySQL). WordPress kann keine andere Funktion finden, um sich mit einer MySQL-Datenbank oder Ihrem MySQL-Container zu verbinden. Stattdessen verwendet WordPress ein veraltetes und entferntes (seit PHP 7.0) mysql_
Funktion standardmäßig. Sie müssen mindestens installieren mysqli
auf Ihrem PHP-Container (unten erklärt).
Ich empfehle auch die Verwendung von a docker-compose Datei zum Installieren und Ausführen aller Container mit einem Befehl.
Um die gewünschten Container zu erstellen, können Sie Folgendes verwenden docker-compose.yml
Datei:
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:
Sie benötigen Folgendes Dockerfile
im selben Verzeichnis wie die docker-compose.yml
Datei:
FROM php:7.0-apache
RUN docker-php-ext-install -j$(nproc) mysqli
Dies Dockerfile
installiert das Fehlende mysqli
Erweiterung, damit WordPress sie verwenden kann.
Sie können stattdessen auch PDO MySQL verwenden mysqli
. In diesem Fall können Sie das folgende Dockerfile verwenden:
FROM php:7.0-apache
RUN docker-php-ext-install -j$(nproc) pdo
RUN docker-php-ext-install -j$(nproc) pdo_mysql
Jetzt können Sie den Befehl ausführen docker-compose up
in dem Ordner, in dem die docker-compose.yml
Datei befindet. Nachdem Sie den Container erstellt und ausgeführt haben, sollten Sie auf die WordPress-Site zugreifen können (<ip-or-hostname>:8080
).
Auf der wp-config.php
Datei müssen Sie die folgenden Konstanten verwenden:
define('DB_NAME', 'wp-dbname');
define('DB_USER', 'root');
define('DB_PASSWORD', '123456');
define('DB_HOST', 'achi-mysql');
Sie können auch die verwenden offizielles WordPress-Bild WordPress zu installieren. In diesem Fall können Sie Folgendes verwenden docker-compose.yml
Datei:
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:
Am einfachsten ist es, docker-compose zu verwenden, um alle Ihre Docker-Instanzen miteinander zu verknüpfen, anstatt sie über den docker-Befehl zu verknüpfen. Hier ist eine Docker-compose.yml-Beispieldatei, die das tun sollte, was Sie wollen:
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
Das
mysql_*
Funktionen sind seit PHP 7.0 veraltet/entfernt. WordPress-Version?– Sebastian Brosch
13. März 2018 um 11:05 Uhr
@SebastianBrosch WordPress v4.9.4
– AchiPapakon
13. März 2018 um 11:38 Uhr
Da ist auch ein WordPress Bild, das Sie ausprobieren können. Hier ist eine Anleitung, die helfen kann: docs.docker.com/compose/wordpress/
– tgogos
13. März 2018 um 12:43 Uhr