[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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将 Java 连接到 PhpMyAdmin 演示服务器?

将 phpMyAdmin 连接到 MySQL Workbench

将 Android 应用程序连接到外部数据库 (phpmyadmin)

将 phpmyadmin 连接到现有的数据库服务器

无法将网站连接到我的 phpmyadmin MySQL 数据库

如何从 Java 程序连接到 phpMyAdmin 数据库?