Php 在Docker容器中限制MySQL用户的主机

Php 在Docker容器中限制MySQL用户的主机,php,mysql,docker,docker-compose,docker-networking,Php,Mysql,Docker,Docker Compose,Docker Networking,我正在创建一个Docker Compose文件,其中包括一个PHP服务和一个MySQL服务。作为MySQL容器初始化的一部分,我创建了一个新的MySQL用户,PHP容器将使用该用户查询数据库。现在,我正在创建如下用户: CREATE USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'mypass'; GRANT INSERT, UPDATE, SELECT, DELETE ON mydb.* TO 'myuser'@'%';

我正在创建一个Docker Compose文件,其中包括一个PHP服务和一个MySQL服务。作为MySQL容器初始化的一部分,我创建了一个新的MySQL用户,PHP容器将使用该用户查询数据库。现在,我正在创建如下用户:

CREATE USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'mypass';
GRANT INSERT, UPDATE, SELECT, DELETE ON mydb.* TO 'myuser'@'%';
CREATE USER 'myuser'@'php' IDENTIFIED WITH mysql_native_password BY 'mypass';
GRANT INSERT, UPDATE, SELECT, DELETE ON mydb.* TO 'myuser'@'php';
这很有效-我的PHP脚本可以成功地查询MySQL数据库

但是,我希望能够将用户限制在PHP容器中,而不是允许从任何地方进行连接(
“%”
)。我尝试如下方式重新创建我的用户:

CREATE USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'mypass';
GRANT INSERT, UPDATE, SELECT, DELETE ON mydb.* TO 'myuser'@'%';
CREATE USER 'myuser'@'php' IDENTIFIED WITH mysql_native_password BY 'mypass';
GRANT INSERT, UPDATE, SELECT, DELETE ON mydb.* TO 'myuser'@'php';
但是,当我运行相同的PHP脚本时,会出现以下错误:

Access denied for user 'myuser'@'my-docker-container.my-docker-project_my-docker-network'
基于这个错误,理论上我可以创建一个主机限制为
my docker container.my-docker-project\u my-docker-network
的用户。然而,在我的具体例子中,这个主机字符串甚至更长,并且超过了MySQL规定的60个字符的限制

是否有一种方法可以配置我的容器,以便我的第二个示例(
'myuser'@'php'
)能够工作

下面是我的PHP和MySQL服务是如何在my
docker compose.yml
中定义的:

php:
    image: my-php-image
    container_name: my-php-container
    build: ./php
    networks:
        - my-network
mysql:
    image: my-mysql-image
    container_name: my-mysql-container
    build: ./mysql
    volumes:
        - ./mysql/conf:/etc/mysql/conf.d
        - my-mysql-volume:/var/lib/mysql
    networks:
        - my-network

“my-docker container.my-docker-project\u my-docker-network”是准确的错误消息吗?您可以使用实际值进行更新。这会有帮助。@Light.G-是的,但正如我所提到的,真正的主机字符串太长了-MySQL将主机限制为60个字符,并且字符串超过60个字符。也许另一种方法提供了相同的功能。为MySQL创建一个隔离网络,并且只将正确的容器连接到该网络。在您的例子中,它是php容器。在docker的理念中,我们更关心我可以访问哪个服务/容器,而不是作为客户机运行的容器。如果我们必须关注客户端,比如您的情况,我们更喜欢网络隔离,因为它在docker world中便宜且易于部署。在您的php项目中,您是否使用“MySQL:3306/db”将连接应用到MySQL?