Deo*_*nna 0 php mysql mysqli docker docker-compose
好的,事情是这样的:我正在使用 Docker-Compose 创建 3 个服务:一个用于平台,一个用于 db (mysql),第三个用于 PHPMyAdmin
\n\n我正在尝试使用 mysqli 连接到端口 5001 上的数据库。
\n\n\xe2\x80\x99s 有趣的是,我可以使用具有相同参数的 SQL Workbench 和 PHPMyAdmin 连接到数据库,但是在使用 PHP MySQLi 连接时出现错误(如下所示)
\n\n平台:
\n\n $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT);\n
Run Code Online (Sandbox Code Playgroud)\n\n主机是 127.0.0.1,DB_USER 是 root 及其各自的密码,我提供了 DB_Name,端口是 5001。
\n\n我的 Docker-Compose.yml 如下所示:
\n\nversion: \'3.3\'\n\nservices:\n platform:\n build: .\n ports:\n - "5000:80"\n links:\n - db:mysql\n\n db:\n image: mysql:5.7\n volumes:\n - db_data:/var/lib/mysql\n restart: always\n ports:\n #- "5001:80"\n - "5001:3306"\n environment:\n MYSQL_ROOT_PASSWORD: some_great_password_here\n MYSQL_DATABASE: DB_NAME_HERE\n MYSQL_USER: USERNAME\n MYSQL_PASSWORD: PASSWORD\n\n phpmyadmin:\n image: phpmyadmin/phpmyadmin\n links:\n - db:mysql\n ports:\n - 8181:80\n environment:\n MYSQL_USERNAME: USERNAME\n MYSQL_ROOT_PASSWORD: PASSWORD\n\nvolumes:\n db_data:\n
Run Code Online (Sandbox Code Playgroud)\n\n由于某种原因,我不断收到错误:
\n\nmysqli::mysqli(): (HY000/2003): Can\'t connect to MySQL server on \'127.0.0.1\' (111) in ...\n
Run Code Online (Sandbox Code Playgroud)\n\n任何提示或解决方案将不胜感激!
\n在翻阅文档和其他 Stackoverflow 帖子后,我找到了问题的解决方案。
当尝试从容器内部连接到数据库时,我们需要使用容器/服务名称,而不是“localhost”或 127.0.0.1。这是因为当我们调用“localhost”时,它会在每个容器内寻找 localhost。我们需要通过网桥连接到不同容器内的 MySQL 数据库。
我们这样做的方法是简单地将容器名称别名为主机,这样:
$db = new mysqli("db", DB_USER, DB_PASS, DB_NAME, DB_PORT);
Run Code Online (Sandbox Code Playgroud)
请注意,主机名是容器名称“db”,如 docker-compose.yml 文件中所定义。这是因为在容器之间创建了 docker 网桥。该端口是 MySQL 默认端口 3306。
但值得注意的是,如果我们想使用像 Sequel Pro 或 Workbench 这样的“外部”应用程序来连接到数据库,我们可以使用 localhost 或 127.0.0.1 来连接到数据库,因为我们不直接处理容器。但需要注意的是,默认端口 3306 在这种情况下将不起作用。我们需要将外部端口映射为 3306。在我的例子中,该端口为 5001,如我的 docker-compose.yml 文件中所示。
归档时间: |
|
查看次数: |
3816 次 |
最近记录: |