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, но сообщение об ошибке было другим:
Что случилось?
Модифицированный блок № 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 ответов
Попробуй с 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, все изменения в БД, независимо от того, что вы делаете, будут потеряны при остановке контейнера.
Бонусные баллы:
- По умолчанию контейнер MySQL не разрешает удаленные подключения. Так что если вы хотите получить доступ к MySQL из любого места, кроме phpmyadmin. Вы должны разрешить удаленные подключения.
- Так как мы сохраняем данные здесь, пароль root будет установлен только при первом запуске контейнера mysqll. В следующий раз переменная среды корневого пароля будет игнорироваться.
- Если вы входите в Docker-контейнеры, используя в основном docker exec, вы можете видеть, что вы являетесь пользователем root. Это потому, что всякий раз, когда вы создаете Docker-контейнер с Dockerfile, используя либо
docker build
или жеdocker-compose build
если вы не указали инструкцию поDockerfile
для создания и использования нового пользователя Docker будет запускать все как пользователь root. - Теперь всякий раз, когда вы запускаете вышеуказанный файл compose. Вы можете видеть, что владелец расположения данных MySQL будет изменен. Это потому, что всякий раз, когда вы монтируете каталог хоста в Docker, Docker изменяет разрешение файла в соответствии с пользователем и группой в соответствии с определением Dockerile этого контейнера. Здесь mysql определил пользователя и группу под названием
mysql
и UID и GID 999. следовательно /tmp/mysql будет иметь 999:999 в качестве владельца. Если эти идентификаторы сопоставлены с любой другой учетной записью пользователя в вашей системе, вы будете видеть эти имена вместо идентификаторов всякий раз, когда выполняете команду ls -al на хост-компьютере. Если идентификаторы не сопоставлены, то вы увидите идентификаторы напрямую. - Я использовал /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