Как я могу соединить php-apache и MySQL, используя Docker?

У меня есть сайт 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 [...]

Я связываю эти два контейнера неправильно?

2

Решение

Ваша проблема не в связи между вашими контейнерами. Проблема в вашем контейнере 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:
3

Другие решения

Самый простой способ — использовать 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
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector