【问题标题】:Issues connecting a Symfony2 app to a database container in Docker将 Symfony2 应用程序连接到 Docker 中的数据库容器的问题
【发布时间】:2015-05-29 10:53:33
【问题描述】:

我在一个 docker 项目中有一个 Symfony2 应用程序,使用 docker-compose。

尝试对我的数据库运行架构更新时出现以下错误。 [Doctrine\DBAL\Exception\DriverException] An exception occured in driver: SQLSTATE[HY000] [1130] Host '172.17.0.129' is not allowed to connect to this MySQL server

我的 docker-compose.yml 文件:

api:
  build: images/nginx
  ports:
    - "80:80"
    - "9000:9000"
  links:
    - mysql:mysql
    - memcached:memcached
    - redis:redis
    - elasticsearch:elasticsearch
    - rabbitmq:rabbitmq
  volumes:
    - www/api:/var/www
    - sites/api:/etc/nginx/sites-enabled

socketserver:
  build: images/socketserver
  links:
    - rabbitmq:rabbitmq
  ports:
    - "5000:5000"
  volumes:
    - www/socketserver:/var/www
    - sites/socketserver:/etc/nginx/sites-enabled

adminpanel:
  build: images/adminpanel
  ports: 
    - "8001:8001"
  volumes:
    - www/adminpanel:/var/www
    - sites/adminpanel:/etc/nginx/sites-enabled

mysql:
  image: mysql:latest
  expose:
    - "3306"
  ports:
   - "3307:3306"
  environment:
    MYSQL_DATABASE: api
    MYSQL_USER: root
    MYSQL_PASSWORD: [REDACTED]
    MYSQL_ROOT_PASSWORD: [REDACTED]

memcached:
  image: tutum/memcached
  ports:
    - "11211:11211"
  dns: 3.3.3.3
  environment:
    MEMCACHED_PASS: [REDACTED]

redis:
  image: tutum/redis
  ports:
    - "6379:6379"
  dns: 4.4.4.4
  environment:
    REDIS_PASS: [REDACTED]

elasticsearch:
  image: tutum/elasticsearch
  ports:
    - "9200:9200"
  dns: 5.5.5.5
  environment:
    ELASTICSEARCH_USER:[REDACTED]
    ELASTICSEARCH_PASS:[REDACTED]

rabbitmq:
  image: dockerfile/rabbitmq
  dns: 6.6.6.6
  ports: 
    - "5672:5672"
    - "15672:15672"

我的 Symfony2 参数.yml:

  parameters:
      secret:           [REDACTED]
      locale:            en
      mailer_transport:  smtp
      mailer_host:       [REDACTED]
      mailer_user:      test@theladbible.com
      mailer_password:  [REDACTED]
      database_driver:   pdo_mysql
      database_host:     mysql
      database_port:     3306
      database_name:     api
      database_user:     root
      database_password: [REDACTED]
      jms_serializer.cache_naming_strategy.class: JMS\Serializer\Naming\IdenticalPropertyNamingStrategy

我尝试了多种不同的方法。我无法通过 localhost 或 127.0.0.1 连接。放置“mysql”似乎链接到数据库容器正确的数据库地址,但我仍然得到上面显示的错误。

我是 Docker 新手,所以我可能误解了一些基本原理,如果是这种情况,我深表歉意。

我怀疑我可能需要添加正确的用户权限?我也无法直接连接到数据库容器来执行此操作。

提前致谢!

【问题讨论】:

  • mysql用户是root@'localhost'还是root@'%'?从<a_user>@'localhost' 到您的 mysql 数据库的连接将不起作用,因为您的请求不是本地的。 stackoverflow.com/questions/19101243/…
  • 您还应该查看registry.hub.docker.com/_/mysql 中的注意事项部分
  • @CélineAussourd 从 y parameters.yml 文件中可以看到,主机设置为 database_host: mysql,它指向 mysql 容器分配的任何 IP 地址。由于您刚才指出的原因,我没有指向 localhost 或 172.0.0.1。现在看看警告,我不完全确定这就是我的问题。我想可能是这样,但我不确定如何解决。
  • 我不完全确定为什么有人对我投了反对票...
  • 我的意思是您的 MySQL 数据库可能未配置为允许来自远程用户的传入连接。你的 parameters.yml 很好。您是否尝试使用另一个MYSQL_USER 而不是root 设置对数据库的访问? (这也意味着您的 parameters.yml 发生了变化)

标签: php symfony docker


【解决方案1】:

通过使用 https://registry.hub.docker.com/u/drakedroid/mysql-with-data/ 解决了这个问题,它扩展了默认的 mysql docker 镜像,但会自动配置所有内容,以便您可以从其他容器访问它。

在您的 parameters.yml 中,将您的主机设置为与您的 mysql docker 名称相同的名称。

所以就我而言,我的 mysql docker-compose 配置:

mysql:
  image: drakedroid/mysql-with-data
  expose:
    - "3306"
  ports:
   - "3306:3306"
  environment:
    MYSQL_DATABASE: api_master
    MYSQL_USER: root
    MYSQL_PASSWORD: [REDACTED]
    MYSQL_ROOT_PASSWORD: [REDACTED]

在我的parameters.yml中

database_host:     mysql

这样 Docker 会自动为您解决所有问题。

【讨论】:

  • 你的意思是你的parameters.yml现在只包含这个参数,没有别的吗?
  • 不,这只是我的数据库容器配置@allan.simon 的摘录
  • 这似乎也适用于官方mysql repo。我可以看到每个链接容器在/etc/hosts 中定义的主机
猜你喜欢
  • 1970-01-01
  • 2019-07-19
  • 2016-09-22
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
相关资源
最近更新 更多