У меня есть сайт WordPress на работающем сервере, и я хочу создать стек LAMP локально с Docker для тестирования.
Я вытащил изображения php:7.0-apache
а также mysql:5.7
Те же версии в прямом эфире.
Я создаю контейнер MySQL:
docker run -d --name achi-mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
Я создаю php & Apache контейнер и связать его с 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
Я получаю следующую ошибку на localhost: 8080:
Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /var/www/html/wp-includes/wp-db.php:1564 [...]
Я связываю эти два контейнера неправильно?
Ваша проблема не в связи между вашими контейнерами. Проблема в вашем контейнере PHP / Apache, который не поддерживает mysqli
(или же PDO MySQL). WordPress не может найти другую функцию для соединения с базой данных MySQL или вашим контейнером MySQL. Вместо этого WordPress использует устарел и удален (начиная с PHP 7.0) mysql_
функция по умолчанию. Вам нужно установить как минимум mysqli
на вашем контейнере PHP (объяснено ниже).
Я также рекомендую использовать докер-Compose файл для установки и запуска всех контейнеров одной командой.
Чтобы создать нужные контейнеры, вы можете использовать следующие docker-compose.yml
файл:
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:
Вам нужно следующее Dockerfile
в том же каталоге, что и docker-compose.yml
файл:
FROM php:7.0-apache
RUN docker-php-ext-install -j$(nproc) mysqli
это Dockerfile
устанавливает недостающие mysqli
расширение, чтобы WordPress мог его использовать.
Вы также можете использовать PDO MySQL вместо mysqli
, В этом случае вы можете использовать следующий Dockerfile:
FROM php:7.0-apache
RUN docker-php-ext-install -j$(nproc) pdo
RUN docker-php-ext-install -j$(nproc) pdo_mysql
Теперь вы можете выполнить команду docker-compose up
внутри папки, где docker-compose.yml
файл находится. После создания и запуска контейнера вы сможете получить доступ к сайту WordPress (<ip-or-hostname>:8080
).
На wp-config.php
В файле нужно использовать следующие константы:
define('DB_NAME', 'wp-dbname');
define('DB_USER', 'root');
define('DB_PASSWORD', '123456');
define('DB_HOST', 'achi-mysql');
Вы также можете использовать официальное изображение WordPress установить WordPress. В этом случае вы можете использовать следующее docker-compose.yml
файл:
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:
Самый простой способ — использовать docker-compose для связи всех ваших экземпляров docker, а не через команду docker. Вот пример файла docker-compose.yml, который должен делать то, что вы хотите:
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