【问题标题】:Can't connect to database in docker-compose无法连接到 docker-compose 中的数据库
【发布时间】:2019-11-06 03:44:53
【问题描述】:

这是我的 docker-compose.yaml

version: "3.1"
services:
  mysql:
    image: mysql:8.0.13
    container_name: project-mysql
    volumes:
      - ./docker/data/mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: db
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: secret
    ports:
      - "3306:3306"

  webserver:
    image: nginx:alpine
    container_name: project-webserver
    working_dir: /var/www
    volumes:
      - .:/var/www
      - ./docker/config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "8080:80"

  php-fpm:
    build: ./docker/config/php
    container_name: project-php-fpm
    working_dir: /var/www
    volumes:
      - .:/var/www
    environment:
      XDEBUG_CONFIG: remote_host=172.17.0.1
      PHP_IDE_CONFIG: serverName=docker

问题是php容器无法连接mysql。 虽然从主机我可以连接到mycli -h 127.0.0.1 -P 3306 -u root。 但是当我在 php 容器中执行并尝试时,得到'连接被拒绝'

【问题讨论】:

  • 您需要使用docker-compose.yml服务名作为主机名,本例中为mysql。 Docker 中的localhost 总是表示“这个容器”。

标签: php docker docker-compose


【解决方案1】:

您的 mysql 服务将 mysql 服务器的 3306 端口绑定到主机的 3306。所以可以从主机连接是正常的吗?

在 php 容器内部,localhost 指的是 @David Maze 在 cmets 中所说的那个特定容器。

由于你使用docker-compose容器在同一个网络中,所以你应该使用服务名来连接mysql服务器。

在 php 容器中试试这个:

mycli -h mysql -P 3306 -u root

【讨论】:

    【解决方案2】:

    您可以与用户root 建立联系。但是在您的 docker-compose 文件中,您通过用户 dbuser 进行连接。如果这不是问题,请告诉我。

    【讨论】:

    • 不,这不是问题,我也可以连接 dbuser。
    • @Mark 我的意思是如果你把 root 作为用户放在你的撰写文件中。那行得通吗?如果没有,请尝试图像:mysql:5.7
    • 我确定它不会改变任何东西,默认情况下已经创建了root并且我为它设置了密码。
    • @Mark root 用户可能能够从所有源连接进行连接,但 dbuser 可能没有该权限(假设您没有授予此类权限)
    • 是的,当然。但它已经默认创建,我什至为它指定了密码MYSQL_ROOT_PASSWORD: secret。所以我的设置中有这个用户,但它仍然不起作用
    【解决方案3】:

    当请求来自与绑定地址不同的 ip 时,通常会拒绝连接。试试下面应该可以工作。

    • 确保 mysql 配置 my.cnf 或任何默认配置不会阻止从外部连接(检查 bind-address 在 mysql 配置中,如果它 127.0.0.1 是它唯一的 允许在本地连接表单,我现在将其设为 0.0.0.0 或 如果存在则评论该行)
      • mysqld --verbose --help => 你会看到所有选项
      • mysqld --verbose --help | grep bind-address => 检查绑定地址
    • 确保我尝试登录的用户有足够的权限 connect(SELECT user,host FROM mysql.user;) 检查您的用户是否可以 从 docker 网络连接 => 172.* 或任何地方=> %

    【讨论】:

      【解决方案4】:

      这可能是由于缓存的卷。

      尝试删除您的音量:

      $ docker volume prune
      
      WARNING! This will remove all local volumes not used by at least one container.
      Are you sure you want to continue? [y/N] y
      Deleted Volumes:
      07c7bdf3e34ab76d921894c2b834f073721fccfbbcba792aa7648e3a7a664c2e
      my-named-vol
      
      Total reclaimed space: 36 B
      

      然后尝试以下任何一种:

      docker-compose up --build
      

      docker-compose up
      

      记住:如果您的 docker-compose up 仍在运行,请在删除未使用的卷之前运行以下命令:

      docker-compose down
      

      【讨论】:

        猜你喜欢
        • 2018-12-21
        • 2017-11-18
        • 1970-01-01
        • 2019-02-25
        • 1970-01-01
        • 2018-04-08
        • 1970-01-01
        • 2019-07-10
        • 1970-01-01
        相关资源
        最近更新 更多