[Docker]:将 PHPMyAdmin 连接到 MySQL 不起作用
Posted
技术标签:
【中文标题】[Docker]:将 PHPMyAdmin 连接到 MySQL 不起作用【英文标题】:[Docker]: Connecting PHPMyAdmin to MySQL doesnt work 【发布时间】:2016-12-27 12:31:44 【问题描述】:我正在尝试将 phpMyAdmin-Container 连接到 mysql-Container 以查看数据库。
我已经通过$ docker run --name databaseContainer -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
启动了MySQL容器
和 PHPMyAdmin-Container 来自 $ docker run --name myadmin -d --link databaseContainer:mysql -p 8080:8080 phpmyadmin/phpmyadmin
尝试登录 PHPMyAdmin 时,我得到: mysqli_real_connect():php_network_getaddresses:getaddrinfo 失败:名称无法解析
和
mysqli_real_connect(): (HY000/2002): php_network_getaddresses: getaddrinfo failed: Name does not resolve
顺便说一句,我还启动了一个 wordpress 容器,并将它链接到 mysql,在那里它可以工作...
【问题讨论】:
【参考方案1】:不要一一启动,而是使用docker-compose
。
创建一个 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"
然后在您的docker-compose.yml
文件所在的同一文件夹中使用docker-compose up
启动它。
使用浏览器访问 PHPmyadmin 并使用 'db' 作为数据库的主机名,因为这是 docker-compose.yml
文件中的服务名称,因此可以使用 dockers 内部 DNS 服务将其解析为 docker-container 的实际 IP .所有链接都是自动为您设置的。
这要简单得多 - docker run 使事情变得过于复杂,并且对这些事情不实用 - 从来没有。
提示:如果您的机器上没有安装 docker-compose,请使用官方文档https://docs.docker.com/compose/install/ 安装它(超出范围)
【讨论】:
谢谢,它有效!我还发现,输入环境变量(DB-Host、User、PW)是一个选项,只是链接不起作用...... 您也可以在 docker compose 中输入所有这些 ENV 变量,但我想这很清楚 我不知道您可以使用 'db' 作为主机名。谢谢! 你应该在MYSQL_ROOT_PASSWORD后面加一个空格:【参考方案2】:就我而言,我使用的是 MySQL 8.0,结果发现 mysql 引入了 phpmyadmin 不支持的新密码识别。 见this answer。
【讨论】:
【参考方案3】:我在使用 laradock 安装 docker,然后运行 docker-compose up 时遇到了同样的错误。开箱即用,当您尝试登录 phpMyAdmin(使用截至 2018 年 10 月的当前图像)时,默认配置会引发此错误。使用 docker run 时不存在该错误。
对于 docker-compose.yml(版本 3),原因之一是服务默认运行在不同的网络上。对于遇到此问题的其他人,这是适用于 mysql 和 phpmyadmin 的配置。
在“docker-compose.yml”文件中,在“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
编辑“.env”文件如下:
### 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
将以下行添加到“/etc/hosts”文件中:
127.0.0.1 localhost
假设您也在使用 nginx,并且该配置位于“docker-compose.yml”中的其他位置,您可以使用以下命令构建和启动这些服务:
docker-compose up -d mysql nginx db phpmyadmin
然后在浏览器中导航到 localhost:8080 并使用用户名“root”和密码“mypass”登录(将服务器字段留空)。
【讨论】:
【参考方案4】:假设您将 MySQL 容器启动为:
$ docker run --name databaseContainer -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
那么你应该按如下方式实际创建 phpmyadmin:
$ docker run --name myadmin -d --link mysql:db -p 8080:8080 phpmyadmin/phpmyadmin
实际上建议您包含一个网络。所以你会有:
$ docker run --name databaseContainer --network myDockerNetwork -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
与
$ docker run --name myadmin -d --link mysql:db --network myDockerNetwork -p 8080:8080 phpmyadmin/phpmyadmin
确保首先创建您的网络:
$ docker network create myDockerNetwork
【讨论】:
【参考方案5】:docker run --name db -e MYSQL_ROOT_PASSWORD=mypass -d mysql:5.7
docker run -p 80:80 --link db:mysql phpmyadmin/phpmyadmin
尝试执行上面的命令,它会起作用,因为 phpmyadmin 可能在他们的实现中硬编码了 mysql 服务器容器名称为 db。
如果你仍然想给你的数据库服务器一个唯一的名字,添加PMA_HOST
环境变量:
docker run --name myadmin -d --link mysqlserver:mysql -p 8080:80 -e PMA_HOST=mysqlserver phpmyadmin/phpmyadmin
mysqlserver
是您的 mysql 数据库服务器的名称。
【讨论】:
【参考方案6】:phpmyadmin/phpmyadmin 的配置文件(/www/config.inc.php)默认说数据库服务器的主机名 if 'db' :
$hosts = array('db');
因此,如果您的数据库名称容器不是“db”,则应添加具有正确名称的环境变量 PMA_HOST=(或 PMA_HOSTS,如果是多数据库服务器)(在您的情况下为 databaseContainer)
【讨论】:
当我运行docker run --name myadmin -d --link mysql_db_server:db -p 8080:80 phpmyadmin/phpmyadmin
时它会工作,但由于某种原因,在没有环境变量的情况下不能使用 docker-compose。您对 env var 的建议应该在所有文档中。 Docker 文档掩盖了太多细节!以上是关于[Docker]:将 PHPMyAdmin 连接到 MySQL 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
将 phpMyAdmin 连接到 MySQL Workbench
将 Android 应用程序连接到外部数据库 (phpmyadmin)