MySQL Docker不允许来自其他容器的连接

时间:2019-08-08 13:34:11

标签: mysql laravel docker docker-compose

2个小时以来,我一直感到我的MySQL容器不允许我的laravel应用程序(订单)进行连接的问题。每次尝试连接时,都会收到以下消息(来自laravel日志):

  

[2019-08-08 15:20:18]生产。错误:SQLSTATE [HY000] [1045]访问   拒绝用户'root'@'172.21.0.3'(使用密码:是)   {“ exception”:“ [object](Doctrine \ DBAL \ Driver \ PDOException(代码:   1045):SQLSTATE [HY000] [1045]用户拒绝访问   位于'root'@'172.21.0.3'(使用密码:是)   /var/www/laravel/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:31,   PDOException(code:1045):SQLSTATE [HY000] [1045]拒绝访问   用户'root'@'172.21.0.3'(使用密码:是)位于   /var/www/laravel/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:27)

我没有更改配置或数据库中的任何内容。我刚刚使用docker-compose restart重新启动了所有容器。

这是我的docker-compose文件:

version: "2"

services:

  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    restart: always
    networks:
      - webgateway
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - dhparam:/etc/nginx/dhparam
      - certs:/etc/nginx/certs

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: nginx-proxy_le
    volumes_from:
      - nginx-proxy
    volumes:
            - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - webgateway

  order:
    container_name: order
    image: e-order:latest
    restart: always
    volumes:
      - /var/e-order/storage:/var/www/laravel/storage/app
      - /var/e-order/logs:/var/www/laravel/storage/logs
    networks:
      - webgateway
      - order_net
    environment:
      - VIRTUAL_HOST={URL}
      - LETSENCRYPT_HOST={URL}
      - LETSENCRYPT_EMAIL={MAIL}
      - DB_HOST=order-db
      - DB_USERNAME=root
      - DB_PASSWORD={ROOT_PW}
      - DB_DATABASE=e-order
      - PHP_MEM_LIMIT=2048
    env_file:
      - /var/e-order/config/production.env

  order-db:
    image: mysql
    container_name: order-db
    restart: always
    volumes:
      - /var/e-order/database:/var/lib/mysql
    networks:
      - order_net
    environment:
      - MYSQL_DATABASE=e-order
      - MYSQL_USER={USER}
      - MYSQL_PASSWORD={PW}
      - MYSQL_ROOT_PASSWORD={ROOT_PW}

networks:
  webgateway:
  order_net:

volumes:
  conf:
  vhost:
  html:
  dhparam:
  certs:

我的生产配置文件(与“ env_file”链接):

APP_NAME=e-order
APP_ENV=production
APP_DEBUG=false
APP_URL={URL}

MIX_ENV_MODE=production

DB_CONNECTION=mysql

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=database
SESSION_DRIVER=database
SESSION_LIFETIME=120

TELESCOPE_HARDCORE=true

我已经检查了应用程序中的配置,用于创建连接的密码正确无误,并且与所述的docker-compose文件中的密码完全相同。

当我使用'docker container exec -it order-db bash'连接到mysql容器并使用注释'mysql -u root -p'并输入root密码时,我能够直接连接到mysql容器声明的docker-compose文件。

root用户的主机设置正确。这是我已经检查过的方式:

mysql> select user, host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
7 rows in set (0.00 sec)

特权也是正确的(我是说它是根用途)。

我还检查了IP地址。应用是“ 172.21.0.3”,数据库是“ 172.21.0.2”,因此我认为它们位于同一子网中,应该可以进行连接。

mysql配置中是否锁定了某些内容?还是为什么在快速重启后它不起作用?

1 个答案:

答案 0 :(得分:0)

我已经将mysql版本从8.0降级到5.7,现在它的运行就像一个魅力。不知道为什么,但是我正在与mysql的家伙联系,以找到原因/解决方案。