Docker PHP MySQL соединение отказано

0

Я пытаюсь запустить сайт, используя несколько конфигураций контейнеров - один для 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
Теги:
docker
mysqli
docker-compose

2 ответа

0

Проверьте конфигурацию /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);
0

проверьте свой IP-адрес контейнера при docker inspect [container name] но запись IP-адреса в файле не очень хороша. Замените IP по имени вашего контейнера db.

  • 0
    ХОРОШО. IP был не прав. Я скопировал его с панели myadmin ... однако, имя контейнера действительно лучшая идея. Могу ли я использовать имя из docker-compose.yml вместо имени, указанного в docker ps ?
  • 0
    Да, вы можете использовать имя из docker-compose.yml

Ещё вопросы

Сообщество Overcoder
Наверх
Меню