Wie kann ich PHP-Apache und MySQL mit Docker verbinden?

Lesezeit: 4 Minuten

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.7die 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?

  • 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

Benutzer-Avatar
Sebastian Brosch

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:

  • Danke, ich habe die erste von Ihnen beschriebene Methode verwendet (nicht WordPress-Bild).

    – AchiPapakon

    16. März 2018 um 7:09 Uhr

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

  • Danke, diese Lösung ist sauber, aber ich erhalte immer noch den gleichen Fehler. Kann es sein, dass meinem PHP-Image einige Funktionen fehlen? Ich benutze aber die offizielle Version 7.0.

    – AchiPapakon

    13. März 2018 um 12:34 Uhr

  • Ja, ich denke, es ist wahrscheinlich, dass Sie die PHP-Einstellungen aktualisieren müssen, um mysql_-Funktionen zuzulassen, aber wenn Sie Ihr WordPress aktualisieren können, um stattdessen mysqli_-Funktionen zu verwenden, wäre das sicherer.

    – Davidhell

    13. März 2018 um 14:27 Uhr

1360000cookie-checkWie kann ich PHP-Apache und MySQL mit Docker verbinden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy