无法在docker-compose中连接到数据库

时间:2019-06-24 10:37:30

标签: php docker docker-compose

这是我的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容器中执行并尝试时,得到“连接被拒绝”

3 个答案:

答案 0 :(得分:1)

您可以与用户root建立联系。但是,在您的docker-compose文件中,您正在通过用户dbuser连接。让我知道这不是问题所在。

答案 1 :(得分:1)

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

在PHP容器内部,localhost指的是@David Maze在评论中所说的特定容器。

由于您使用的docker-compose容器位于同一网络中,因此您应该使用服务名称才能连接到mysql服务器。

从php容器尝试此操作

mycli -h mysql -P 3306 -u root

答案 2 :(得分:0)

通常,当请求来自与绑定地址不同的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.*或任何地方=> %
  • 连接