Я пытаюсь запустить сайт, используя несколько конфигураций контейнеров - один для apache, второй для mysql и третий для myadmin. Все начинается нормально, настройка работает гладко, но когда я пытаюсь запустить приложение PHP, я получаю mysqli::__construct(): (HY000/2002): Connection refused in system/libraries/drivers/Database/Mysqli.php [54]
.
Кажется, что что-то не так с настройками подключения, но я проверил сайт через PHP MyAdmin, работающий на отдельном контейнере, и скопировал IP-адрес db, чтобы просто убедиться. Как я/должен ли я подключаться из контейнера PHP к MySQL db?
Вот мой файл docker-compose.yml
:
version: '3'
services:
web:
build:
context: ./etc/php
args:
- APP_HOST=${APP_HOST}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_PORT=${MYSQL_PORT}
- MYSQL_DATABASE=${MYSQL_DATABASE}
ports:
- ${APP_PORT}:80
- ${APP_PORT_SSL}:443
volumes:
- ./var/bin/:/tmp/bin/
- ./app/:/var/www/html/
- ./log/apache2/:/var/log/apache2/
- ./etc/php/conf/:/usr/local/etc/php/conf.d/
environment:
- VIRTUAL_HOST=${VIRTUAL_HOST}
db:
build:
context: ./etc/mysql
args:
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- DUMP_FILE=${DUMP_FILE}
volumes:
- ./etc/mysql/conf:/etc/mysql/conf/conf.d
- ./data:/var/lib/mysql
- ./log/:/var/log/
ports:
- "${MYSQL_PORT}:3306"
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- ${MYADMIN_PORT}:80
environment:
- VIRTUAL_HOST=phpmyadmin.localhost
И .env
с переменными:
VIRTUAL_HOST=foo.local
APP_PORT=80
APP_PORT_SSL=443
MYADMIN_PORT=8081
APP_HOST=foo.local
ADMIN_APP_HOST=admin-foo.local
MYSQL_DATABASE=foo_local
MYSQL_USER=root
MYSQL_HOST=172.26.0.2
MYSQL_PASSWORD=root
MYSQL_ROOT_PASSWORD=root
MYSQL_PORT=3306
О, и вот код, который я пытаюсь запустить:
$this->link = $socket ? new mysqli(null, $user, $pass, $database, $port, $socket) :
new mysqli($host, $user, $pass, $database, $port);
Вывод echo $host.'<br>'.$user.'<br>'.$pass.'<br>'.$database.'<br>'.$port.'<br>'.$socket;
является следующее:
172.26.0.2
root
root
hq_local
3306
Проверьте конфигурацию /etc/hosts
внутри контейнера веб-сервиса для связи с контейнером.
docker exec -it <container_name> cat /etc/hosts
Сеть Docker не будет назначать один и тот же IP-адрес контейнера db, который вы указали для MYSQL_HOST все время. Поэтому лучше использовать имя conatiner для подключения к веб-контейнеру.
Кроме того, в зависимости от контекста, указанного в файле docker-compose.yml, попробуйте следующее:
new mysqli('etc/mysql', $user, $pass, $database, $port);
проверьте свой IP-адрес контейнера при docker inspect [container name]
но запись IP-адреса в файле не очень хороша. Замените IP по имени вашего контейнера db.
myadmin
... однако, имя контейнера действительно лучшая идея. Могу ли я использовать имя изdocker-compose.yml
вместо имени, указанного вdocker ps
?