J'essaie de connecter un conteneur PHPMyAdmin à un conteneur MySQL pour afficher les bases de données.
J'ai démarré le conteneur MySQL via $ docker run --name databaseContainer -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
et le conteneur PHPMyAdmin via $ docker run --name myadmin -d --link databaseContainer:mysql -p 8080:8080 phpmyadmin/phpmyadmin
Lorsque j'essaie de me connecter à PHPMyAdmin, je reçois: mysqli_real_connect (): php_network_getaddresses: getaddrinfo a échoué: le nom n'a pas été résolu
et
mysqli_real_connect (): (HY000/2002): php_network_getaddresses: getaddrinfo a échoué: le nom n'a pas été résolu.
A propos, j'ai aussi commencé un conteneur wordpress et l'ai également lié à mysql, là ça marche ...
Au lieu de les démarrer un par un, utilisez docker compose.
Créez un fichier docker-compose.yml
version: '2'
services:
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD:my-secret-pw
ports:
# just if you also want to access it directly from you Host
# node neede for phpmyadmin
- "3306:3306"
phpmyadmin:
image: phpmyadmin/phpmyadmin
depends_on:
- db
ports:
- "8080:8080"
Puis lancez-le en utilisant docker-compose up
dans le même dossier que votre fichier docker-compose.yml
. Accédez à PHPmyadmin à l’aide du navigateur et utilisez «db» comme nom d’hôte de votre base de données, car il s’agit du nom du service figurant dans le fichier docker-compose.yml
et peut donc être résolu à l’aide du service DNS interne de dockers, à l’adresse IP réelle du récipient. Tous les liens sont configurés pour vous automatiquement.
C’est beaucoup plus simple: exécuter un menu fixe complique trop les choses et n’est pas pratique pour ces choses - jamais.
Astuce: si docker-compose n'est pas installé sur votre ordinateur, installez-le en utilisant cette documentation officielle https://docs.docker.com/compose/install/ (hors de portée)
Le fichier de configuration de phpmyadmin/phpmyadmin (/www/config.inc.php) indique par défaut le nom d'hôte du serveur de base de données si 'db':
$ hosts = array ('db');
Donc, si votre conteneur de nom de base de données n'est pas 'db', vous devez ajouter la variable d'environnement PMA_Host = (ou PMA_HOSTS si plusieurs serveurs sont installés) avec le nom correct (databaseContainer dans votre cas)
docker run --name db -e MYSQL_ROOT_PASSWORD=mypass -d mysql:5.7
docker run -p 80:80 --link db:mysql phpmyadmin/phpmyadmin
Essayez d’exécuter la commande ci-dessus, cela fonctionnera, car phpmyadmin a peut-être codé en dur le nom de conatiner du serveur mysql à db.
Si vous souhaitez toujours attribuer un nom unique à votre serveur de base de données, ajoutez la variable d'environnement PMA_Host
:
docker run --name myadmin -d --link mysqlserver:mysql -p 8080:80 -e PMA_Host=mysqlserver phpmyadmin/phpmyadmin
mysqlserver
est le nom donné à votre serveur de base de données mysql.
DONNÉ que vous avez démarré le conteneur MySQL en tant que:
$ docker run --name databaseContainer -e MYSQL_ROOT_PASSWORD = my-secret-pw -d mysql
ALORS, vous devriez créer phpmyadmin comme suit:
$ docker run --name myadmin -d --link mysql: db -p 8080: 8080 phpmyadmin/phpmyadmin
En fait, il est conseillé d'inclure un réseau. Donc vous auriez:
$ docker run --name databaseContainer --network myDockerNetwork -e MYSQL_ROOT_PASSWORD = my-secret-pw -d mysql
ET
$ docker run --name myadmin -d --link mysql: db --network myDockerNetwork -p 8080: 8080 phpmyadmin/phpmyadmin
Assurez-vous que votre réseau est créé en premier:
réseau docker créer myDockerNetwork
Dans mon cas, j'utilisais MySQL 8.0 et il s'est avéré que mysql a introduit une nouvelle identification de mot de passe qui n'est pas supportée par phpmyadmin . Voir cette réponse .
J'ai eu la même erreur lors de l'installation de docker avec laradock, puis de l'exécution de docker-compose. Par défaut, la configuration par défaut lève cette erreur lorsque vous essayez de vous connecter à phpMyAdmin (en utilisant les images actuelles à compter d'octobre 2018). L'erreur n'était pas présente lors de l'exécution de docker.
Pour docker-compose.yml (version 3), les services s'exécutant par défaut sur des réseaux différents. Pour ceux qui ont ce problème, voici une configuration qui fonctionne pour mysql et phpmyadmin.
Dans le fichier "docker-compose.yml", sous "services":
### db ###################################################
db:
image: mysql:5.7
container_name: db
environment:
- MYSQL_ROOT_PASSWORD=mypass
networks:
- backend
### MySQL ################################################
mysql:
build:
context: ./mysql
args:
- MYSQL_VERSION=${MYSQL_VERSION}
environment:
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- TZ=${WORKSPACE_TIMEZONE}
volumes:
- ${DATA_PATH_Host}/mysql:/var/lib/mysql
- ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
ports:
- "${MYSQL_PORT}:3306"
networks:
- backend
## phpMyAdmin ###########################################
phpmyadmin:
build: ./phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_Host=db
- MYSQL_USER=${PMA_USER}
- MYSQL_PASSWORD=${PMA_PASSWORD}
- MYSQL_ROOT_PASSWORD=${PMA_ROOT_PASSWORD}
ports:
- "${PMA_PORT}:80"
depends_on:
- db
- mysql
networks:
- frontend
- backend
Editez le fichier ".env" comme suit:
### MYSQL #################################################
MYSQL_VERSION=5.7
MYSQL_DATABASE=db
MYSQL_USER=root
MYSQL_PASSWORD=mypass
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=mypass
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
### PHP MY ADMIN ##########################################
# Accepted values: mariadb - mysql
PMA_DB_ENGINE=mysql
# Credentials/Port:
PMA_USER=default
PMA_PASSWORD=secret
PMA_ROOT_PASSWORD=secret
PMA_PORT=8080
Ajoutez la ligne suivante au fichier "/ etc/hosts":
127.0.0.1 localhost
En supposant que vous utilisez également nginx et que la configuration est ailleurs dans votre "docker-compose.yml", vous pouvez créer et démarrer ces services avec:
docker-compose up -d mysql nginx db phpmyadmin
Ensuite, accédez à localhost: 8080 dans votre navigateur et connectez-vous avec le nom d'utilisateur "root" et le mot de passe "mypass" (laissez le champ du serveur vide).