php_network_getaddresses: ошибка getaddrinfo в администраторе Docker

У меня проблема с доступом к администратору в моем контейнере док-станции с приложением laravel 5 / mysql. Я получил ошибку:

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolve

Мой docker-compose.yml:

version: '3'

services:

    votes_app:
        build:
            context: ./web
            dockerfile: Dockerfile.yml

        container_name: votes_app_container
        environment:
            - APACHE_RUN_USER=#1000
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        ports:
            - 8081:80
        working_dir: ${APP_PTH_CONTAINER}


    votes_db:
        image: mysql:5.6.41
        container_name: votes_db_container

        restart: always
        environment: 
            MYSQL_ROOT_PASSWORD: 1
        volumes:
            - ${DB_PATH_HOST}:/var/lib/mysql


    votes_adminer:
        image: adminer
        container_name: votes_adminer_container
        restart: always
        ports:
            - 8082:8080
        links:
            - votes_db


    votes_composer:
        image: composer:1.6
        container_name: votes_composer_container
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        working_dir: ${APP_PTH_CONTAINER}
        command: composer install --ignore-platform-reqs

Я получил разные порты для приложения и контейнера БД.

Здесь https://hub.docker.com/_/adminer/ я нашел:

Использование с внешним сервером Вы можете указать хост по умолчанию с помощью переменной среды ADMINER_DEFAULT_SERVER. Это полезно, если вы подключаетесь к внешнему серверу или к док-контейнеру с именем, отличным от базы данных по умолчанию.

docker run -p 8080:8080 -e ADMINER_DEFAULT_SERVER=mysql adminer

В консоли моего приложения я запускаю команду

$ docker run -p 8089:8080 -e ADMINER_DEFAULT_SERVER=votes_db adminer 

с неиспользуемым портом в моих приложениях, и эта команда все равно не была успешной, так как я получил ту же ошибку при попытке войти в систему администратора https://imgur.com/a/4HCdC1W.

Какой правильный путь?

ИЗМЕНЕННЫЙ БЛОК № 2:

В моем docker-compose.yml:

version: '3'

services:

    votes_app:
        build:
            context: ./web
            dockerfile: Dockerfile.yml

        container_name: votes_app_container
        environment:
            - APACHE_RUN_USER=#1000
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        ports:
            - 8081:80
        working_dir: ${APP_PTH_CONTAINER}


    db:
        image: mysql:5.6.41
        restart: always
        environment: 
            MYSQL_ROOT_PASSWORD: 1
        volumes:
            - ${DB_PATH_HOST}:/var/lib/mysql


    adminer:
        image: adminer
        restart: always
        ports:
            - 8082:8080
        links:
            - db


    votes_composer:
        image: composer:1.6
        container_name: votes_composer_container
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        working_dir: ${APP_PTH_CONTAINER}
        command: composer install --ignore-platform-reqs

Я перестроил приложение, но мне не удалось войти в администратор: https://imgur.com/a/JWVGfBA

Я запускаю в консоли моей ОС, указывая на другой неиспользуемый порт 8089:

$ docker run -p 8089:8080 -e ADMINER_DEFAULT_SERVER=db adminer
PHP 7.2.11 Development Server started at Thu Nov  1 07:00:46 2018
[Thu Nov  1 07:01:11 2018] ::ffff:172.17.0.1:34048 [200]: /
[Thu Nov  1 07:01:20 2018] ::ffff:172.17.0.1:34052 [302]: /
[Thu Nov  1 07:01:21 2018] ::ffff:172.17.0.1:34060 [403]: /?server=db&username=root

Но снова ошибка логирования к администратору на порт 8089, но сообщение об ошибке было другим:

https://imgur.com/a/a8qM4bt

Что случилось?

Модифицированный блок № 3:

Я полагаю, да, так как после того, как я перестроил контейнер, я вошел в поле и увидел "root" в выводе консоли:

$ docker-compose exec votes_app bash
root@a4aa907373f5:/var/www/html# ls -la
total 1063
drwxrwxrwx 1 root root   4096 Oct 27 12:01 .
drwxr-xr-x 1 root root   4096 Oct 16 00:11 ..
-rwxrwxrwx 1 root root    234 Oct 13 07:15 .editorconfig
-rwxrwxrwx 1 root root   1029 Oct 31 06:10 .env
-rwxrwxrwx 1 root root    651 Oct 13 07:15 .env.example
drwxrwxrwx 1 root root   4096 Nov  1 11:10 .git
-rwxrwxrwx 1 root root    111 Oct 13 07:15 .gitattributes
-rwxrwxrwx 1 root root    294 Oct 13 07:15 .gitignore
-rwxrwxrwx 1 root root   4356 Oct 13 07:15 1.txt
drwxrwxrwx 1 root root      0 Oct 13 07:15 __DOCS
drwxrwxrwx 1 root root      0 Oct 13 07:15 __SQL
drwxrwxrwx 1 root root   4096 Oct 13 07:15 app
-rwxrwxrwx 1 root root   1686 Oct 13 07:15 artisan                                                                                                                                                                     
drwxrwxrwx 1 root root      0 Oct 13 07:15 bootstrap                                                                                                                                                                   
-rwxrwxrwx 1 root root   2408 Oct 13 07:15 composer.json                                                                                                                                                               
-rwxrwxrwx 1 root root 200799 Oct 13 07:15 composer.lock                                                                                                                                                               
drwxrwxrwx 1 root root   4096 Oct 13 07:15 config                                                                                                                                                                      
drwxrwxrwx 1 root root   4096 Oct 13 07:15 database                                                                                                                                                                    
-rwxrwxrwx 1 root root  52218 Oct 17 05:25 db_1_err.txt                                                                                                                                                                
-rwxrwxrwx 1 root root 482562 Oct 13 07:15 package-lock.json                                                                                                                                                           
-rwxrwxrwx 1 root root   1168 Oct 13 07:15 package.json                                                                                                                                                                
-rwxrwxrwx 1 root root   1246 Oct 13 07:15 phpunit.xml                                                                                                                                                                 
drwxrwxrwx 1 root root   4096 Oct 13 07:15 public
-rwxrwxrwx 1 root root     66 Oct 13 07:15 readme.txt
drwxrwxrwx 1 root root      0 Oct 13 07:15 resources
drwxrwxrwx 1 root root   4096 Oct 13 07:15 routes
-rwxrwxrwx 1 root root    563 Oct 13 07:15 server.php
drwxrwxrwx 1 root root   4096 Oct 13 07:15 storage
drwxrwxrwx 1 root root      0 Oct 13 07:15 tests
drwxrwxrwx 1 root root   8192 Nov  1 13:05 vendor
-rwxrwxrwx 1 root root   1439 Oct 13 07:15 webpack.mix.js
-rwxrwxrwx 1 root root 261143 Oct 13 07:15 yarn.lock
root@a4aa907373f5:/var/www/html# echo $USER

root@a4aa907373f5:/var/www/html#  uname -a
Linux a4aa907373f5 4.15.0-36-generic #39-Ubuntu SMP Mon Sep 24 16:19:09 UTC 2018 x86_64 GNU/Linux

Это может быть проблема в любом случае?

Спасибо!

6 ответов

Тогда у меня была такая же проблема, затем я обнаружил, что значение по умолчанию в приложении Adminer для адреса сервера - «db», что не совпадает с именем службы для моего контейнера MySQL.

Как видите, имя моей службы отличается от db, для которой возникла проблема.

Попробуй с phpMyAdmin:)

version: '3.2'
services:
    db:
        image: mysql:5.7

        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: myUserPass
          MYSQL_DATABASE: mydb
          MYSQL_USER: myUser
          MYSQL_PASSWORD: myUser

    phpmyadmin:
        depends_on:
          - db
        image: phpmyadmin/phpmyadmin
        restart: always
        ports:
          - 8088:80
        environment:
          PMA_HOST: db
          MYSQL_ROOT_PASSWORD: myUserPass

Вы можете увидеть об этом в https://hub.docker.com/_/adminer/

пример

version: '3.1'

services:

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

  db:
    image: mysql:5.6
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example

Проблема с вашей настройкой из-за переменной среды DB_PATH_HOST, У вас все отлично настроено в вашем файле. но перед запуском docker-compose вы должны определить переменную окружения DB_PATH_HOST, Поскольку переменная окружения не определена, выдается ошибка. Смотрите это для более подробной информации о переменных окружения и их приоритете в Docker.

Итак, что вы должны были сделать, перед запуском docker-контейнера вы должны были определить переменную среды, либо определив ее в файле compose, либо экспортировав ее в оболочку как переменную оболочки перед запуском docker-compose, или должны были использовать файл env или с помощью инструкции ENV в докерфайле. (Это все возможные способы определения переменных среды, и я перечислил все из них, что метод, который стоит первым, имеет приоритет. Обратитесь к нему для получения дополнительной информации).

Поэтому правильный файл docker-compose.yml должен выглядеть следующим образом.

version: '3.2'
services:
   db:
        image: mysql:5.6.41
        restart: always
        environment: 
            MYSQL_ROOT_PASSWORD: 1
            DB_PATH_HOST: /tmp/mysql #this is the host location where mysql data will be stored.
        volumes:
            - ${DB_PATH_HOST}:/var/lib/mysql

    phpmyadmin:
        depends_on:
          - db
        image: phpmyadmin/phpmyadmin
        restart: always
        ports:
          - 8082:80
        environment:
          PMA_HOST: db
          MYSQL_ROOT_PASSWORD: 1

Переходя к следующему пункту, я вижу, что из ваших обсуждений вы пришли к выводу, что удаление томов из контейнера db решило вашу проблему. Но на самом деле нет. Как?

Сначала позвольте мне объяснить, почему объем используется здесь. Данные, сгенерированные моим MySQL должны храниться где-то. Docker по умолчанию запускает контейнеры в непостоянном режиме, что означает, что все данные, сгенерированные запущенным соединителем докеров, будут удалены при сбое / уничтожении этого контейнера. Таким образом, чтобы сохранить (сохранить / сохранить) данные, мы используем тома. В докере используются разные типы томов. Я рекомендую вам прочитать документацию по хранилищу Docker для более подробной информации. Используемый здесь тип тома - это привязка монтирования, которая заключается в следующем: вы привязываете каталог хоста к каталогу докера, и докер сохраняет все данные непосредственно на хост-компьютере, так что даже если сброшенный контейнер докера все еще сохраняется, данные сохраняются.

Следовательно, если вы не используете тома в mysql, все изменения в БД, независимо от того, что вы делаете, будут потеряны при остановке контейнера.

Бонусные баллы:

  1. По умолчанию контейнер MySQL не разрешает удаленные подключения. Так что если вы хотите получить доступ к MySQL из любого места, кроме phpmyadmin. Вы должны разрешить удаленные подключения.
  2. Так как мы сохраняем данные здесь, пароль root будет установлен только при первом запуске контейнера mysqll. В следующий раз переменная среды корневого пароля будет игнорироваться.
  3. Если вы входите в Docker-контейнеры, используя в основном docker exec, вы можете видеть, что вы являетесь пользователем root. Это потому, что всякий раз, когда вы создаете Docker-контейнер с Dockerfile, используя либо docker build или же docker-compose build если вы не указали инструкцию по Dockerfile для создания и использования нового пользователя Docker будет запускать все как пользователь root.
  4. Теперь всякий раз, когда вы запускаете вышеуказанный файл compose. Вы можете видеть, что владелец расположения данных MySQL будет изменен. Это потому, что всякий раз, когда вы монтируете каталог хоста в Docker, Docker изменяет разрешение файла в соответствии с пользователем и группой в соответствии с определением Dockerile этого контейнера. Здесь mysql определил пользователя и группу под названием mysql и UID и GID 999. следовательно /tmp/mysql будет иметь 999:999 в качестве владельца. Если эти идентификаторы сопоставлены с любой другой учетной записью пользователя в вашей системе, вы будете видеть эти имена вместо идентификаторов всякий раз, когда выполняете команду ls -al на хост-компьютере. Если идентификаторы не сопоставлены, то вы увидите идентификаторы напрямую.
  5. Я использовал /tmp/mysql в качестве каталога данных mysql для примера. Pleae не использует то же самое, поскольку данные в / tmp будут удаляться при каждом перезапуске системы.

На вопрос уже был дан ответ, но добавляю здесь свое решение аналогичной проблемы для справки.

Добавление параметра 'links' к моему служебному блоку phpmyadmin/adminer для docker-compose решило эту проблему для меня, исходя из предположения, что имя службы блока базы данных на самом деле является db, как используется в примерах, приведенных выше. Эта ссылка позволяет затем в интерфейсе входа phpmyadmin использовать db в качестве хоста, и он будет подключаться.

links:
  - db:db

изменение имени контейнера на db для образа mysql имело для меня значение Вы можете увидеть об этом в https://hub.docker.com/_/adminer/

услуги: db: изображение: mysql:5.6

Другие вопросы по тегам