【问题标题】:Docker can't connect to MySQL running docker-compose upDocker 无法连接到运行 docker-compose up 的 MySQL
【发布时间】:2019-08-28 17:53:18
【问题描述】:

我正在使用这个 Docker 配置:https://github.com/romaricp/kit-starter-symfony-4-docker

我通过以下方式启动环境:

docker-compose 构建

接着是:

docker-compose up -d

一切正常,但 MySQL 服务出现问题。我收到一个 Symfony 错误:

“驱动发生异常:找不到驱动”

以及当我尝试登录 DB 时出现 PMA 错误:

mysqli_real_connect():php_network_getaddresses:getaddrinfo 失败: 名称无法解析

知道我怎样才能让它工作吗?

docker-compose.yml:

version: '3'
services:
apache:
    build: .docker/apache
    container_name: sf4_apache
    ports:
      - 80:80
    volumes:
      - .docker/config/vhosts:/etc/apache2/sites-enabled
      - .:/home/wwwroot/sf4
    depends_on:
      - php

mysql:
    image: mysql
    container_name: sf4_mysql
    volumes:
        - .docker/data/db:/var/lib/mysql
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: sf4
        MYSQL_USER: sf4
        MYSQL_PASSWORD: sf4

php:
    build: .docker/php
    container_name: sf4_php
    volumes:
      - .:/home/wwwroot/sf4
    environment:
      - maildev_host=sf4_maildev
    depends_on:
      - maildev
      - mysql

phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: sf4_phpmyadmin
    ports:
        - 8080:80
    links:
        - mysql

maildev:
    image: djfarrelly/maildev
    container_name: sf4_maildev
    ports:
      - 8001:80

我还打开了 mysql 日志,我看到了这个:

2019-04-07T12:00:30.943414Z 0 [系统] [MY-010931] [服务器] /usr/sbin/mysqld:准备连接。版本:'8.0.15' 套接字:'/var/run/mysqld/mysqld.sock' 端口:3306 MySQL 社区服务器 - GPL。

也许端口错误,这就是我无法连接的原因?

【问题讨论】:

    标签: mysql docker


    【解决方案1】:

    对于phpmyadmin 服务,我认为您应该像这样设置PMA_HOSTPMA_PORT 环境变量:

    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        container_name: sf4_phpmyadmin
        environment:
          PMA_HOST: mysql
          PMA_PORT: 3306
        ports:
            - 8080:80
        links:
            - mysql
    

    您的 mysql 容器在开始时应该有 command 指令来设置身份验证插件(mysql 8 的连接器存在问题),更多详细信息 here

    mysql:
        image: mysql
        container_name: sf4_mysql
        command: "--default-authentication-plugin=mysql_native_password"
        volumes:
            - .docker/data/db:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: sf4
            MYSQL_USER: sf4
            MYSQL_PASSWORD: sf4
    

    在您的 Symfony 应用程序中,连接字符串位于 .env 文件中,它应该具有以下格式:

    DATABASE_URL=mysql://mysql_user:mysql_user_password@mysql_host:mysql_port/db_name

    mysql_user:你的 mysql 用户(例如:root)

    mysql_user_password:用户的密码(例如:root)

    mysql_host:应该包含你的mysql容器服务名 位于您的docker-compose.yml 文件中(在本例中为 mysql)

    mysql_port:mysql容器内部端口(本例为3306)

    db_name:要连接的数据库。

    DATABASE_URL 可以如下所示:

    DATABASE_URL=mysql://root:root@mysql:3306/sf4
    

    在这些更改后停止您的容器并重新启动它们。

    希望这会有所帮助。

    【讨论】:

    • 试过你的设置,这样我得到一个客户端[caching_sha2_password] 未知的服务器请求的身份验证方法错误。
    • 尝试登录 PMA 时。 Symfony 也无法访问数据库。我将 .env 数据库凭据更改为 DATABASE_URL=mysql://sf4:root@mysql:3306/sf4
    • 同样的错误。如果我是正确的,我的登录凭据也应该是 sf4/root。基于 Docker 环境参数。
    • 您的 docker-compose.yml(mysql 服务)command: "--default-authentication-plugin=mysql_native_password"987654331@ 中缺少此行
    • 同样的事情,我在更改后运行 docker-compose down 和 docker-compose up -d 并且错误相同。
    【解决方案2】:

    我认为您在链接容器时遇到了问题。我建议您使用自定义网络而不是链接。所有容器都可以互相看到

    【讨论】:

      【解决方案3】:

      你必须暴露mysql的3306端口:

        mysql:
          image: mysql
          container_name: sf4_mysql
          volumes:
          - .docker/data/db:/var/lib/mysql
          restart: always
          ports:
          - "3306:3306"
          environment:
              MYSQL_ROOT_PASSWORD: root
              MYSQL_DATABASE: sf4
              MYSQL_USER: sf4
              MYSQL_PASSWORD: sf4
          networks:
          - default
      

      【讨论】:

      • 这样我得到一个错误:{"message":"driver failed Programming external connectivity on endpoint sf4_mysql (4c503802716b745c597590bf6a5b251b6d3b24c31ddd2618b3f8b380ac677442): Bind for 0.0.0.0:3306 failed:跨度>
      • 您的 3306 已被您主机中的另一个服务使用,请尝试"3307:3306",或保持原样并停止您主机中的 mysql 服务。
      • 尝试:docker-compose down & docker-compose up -d 更多信息:github.com/docker/compose/issues/4950 关于这个问题。
      • 试过重启,没有任何变化,也将Docker上mysql的端口改为3307:3306,没有任何变化。
      • 好主意@AbdelkarimELAMEL。停止其他 mysql 服务 ;)
      猜你喜欢
      • 2019-08-02
      • 2021-08-15
      • 1970-01-01
      • 2020-02-12
      • 2023-01-04
      • 2021-06-16
      • 2015-05-19
      • 1970-01-01
      相关资源
      最近更新 更多