【问题标题】:"Host '192.XXX.XXX.X' is not allowed to connect to this MySQL server" error when attempting to access mysql Docker container from another container尝试从另一个容器访问 mysql Docker 容器时出现“不允许主机 '192.XXX.XXX.X' 连接到此 MySQL 服务器”错误
【发布时间】:2019-07-02 21:46:14
【问题描述】:

我有一个 docker compose 文件,它创建一个容器来运行我的应用程序(Ruby on Rails)和另一个容器来运行 mysql 服务器。

version: "3"

volumes:
  test-db:
    external: false

services:
  db:
    image: mysql:5.7
    env_file: .env
    environment:
      MYSQL_DATABASE: test_development
      MYSQL_ROOT_PASSWORD: foobar
      MYSQL_USER: root
      MYSQL_PASSWORD: foobar
    volumes:
      - test-db:/var/lib/mysql
    ports:
      - "3306:3306"

  app:
    build:
      ./
    image: test_app:latest
    env_file: .env
    command: "rails server -b 0.0.0.0"
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - db
    tty: true
    stdin_open: true

我执行到 db 容器中,并且可以按预期访问 mysql cli。

$ docker exec -it test_db_1 mysql -pfoobar
Welcome to the MySQL monitor.  Commands end with ; or \g.

但是,当我尝试通过应用容器访问服务器时,我遇到了以下问题。

 $ docker exec -it test_app_1 mysql -hdb -pfoobar
ERROR 1130 (HY000): Host '192.168.144.3' is not allowed to connect to this MySQL server 

为什么运行mysql服务器的容器无法接收来自test app容器的请求?

当我运行docker ps 时,我看到以下内容:

 COMMAND                      PORTS                            
 "rails server -b 0.0…"       0.0.0.0:3000->3000/tcp           
 "docker-entrypoint.s…"       0.0.0.0:3306->3306/tcp, 33060/tcp

【问题讨论】:

  • 除非你的 yml 被破坏,否则这似乎与 rails 没有太大关系,而是与数据库服务器配置有关。

标签: mysql ruby-on-rails docker docker-compose


【解决方案1】:

默认情况下,当您启动 MySQL 容器时,它会根据传递的环境变量自动创建您使用它来访问同一容器 test_db_1 的 root 用户,该 root 用户仅被授予/允许从 localhost 连接。

但是如果你想从另一个容器访问 MySQL,你应该创建一个被授权从远程主机连接到数据库的用户(username@%username@container-name)——因为每个容器都有不同的 IP在 docker 默认网络中,

注意:您可以通过在容器中登录 MySQL 和 create a user 来做到这一点,在您的情况下,它将类似于:grant all on <your-database>@`%` to <yourusername>@`%` identified by '<password>'

【讨论】:

    【解决方案2】:

    portsoption 将端口公开给您的主机,但我认为容器之间的情况不同。尝试在数据库配置上使用expose: 3306。顺便说一句,我想指出的是,即使您使用 depends_on 选项,也不能保证在您启动应用程序时数据库会启动,但只有 db 容器准备就绪,所以请记住这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-31
      • 2021-06-23
      • 1970-01-01
      • 2013-10-17
      • 2011-02-26
      • 2012-11-12
      • 2023-03-26
      相关资源
      最近更新 更多