docker compose使用php(mysqli)连接mysql数据库

zed5wv10  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(522)

好的,这里是交易:我使用docker compose创建3个服务:一个用于平台,一个用于db(mysql),第三个用于phpmyadmin
我正在尝试使用mysqli连接到端口5001上的数据库。
有趣的是,我可以使用sqlworkbench和phpmyadmin以相同的参数连接到数据库,但是在使用phpmysqli连接时出现了一个错误(如下所示)
平台:

$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT);

主机是127.0.0.1,db\u用户是root用户,有各自的密码,我提供了一个db\u名称,端口是5001。
我的docker-compose.yml如下所示:

version: '3.3'

services:
  platform:
    build: .
    ports:
      - "5000:80"
    links:
      - db:mysql

  db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     ports:
       #- "5001:80"
       - "5001:3306"
     environment:
       MYSQL_ROOT_PASSWORD: some_great_password_here
       MYSQL_DATABASE: DB_NAME_HERE
       MYSQL_USER: USERNAME
       MYSQL_PASSWORD: PASSWORD

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - db:mysql
    ports:
      - 8181:80
    environment:
      MYSQL_USERNAME: USERNAME
      MYSQL_ROOT_PASSWORD: PASSWORD

volumes:
    db_data:

出于某种原因,我不断得到错误:

mysqli::mysqli(): (HY000/2003): Can't connect to MySQL server on '127.0.0.1' (111) in ...

任何提示或解决方案将不胜感激!

t30tvxxf

t30tvxxf1#

您已按照将mysql端口Map到3306

- "5001:3306"

您应该尝试在端口3306而不是5001连接。确保您的容器正在使用网桥网络进行相互通信。

$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, 3306);
amrnrhlw

amrnrhlw2#

在翻阅文档和其他stackoverflow帖子之后,我找到了解决问题的方法。
当试图从容器内部连接到数据库时,我们需要使用容器/服务名称,而不是“localhost”或127.0.0.1。这是因为当我们调用“localhost”时,它在每个容器中查找localhost。我们需要通过网桥连接到另一个容器中的mysql数据库。
我们的方法是将容器名简单地别名为主机,这样:

$db = new mysqli("db", DB_USER, DB_PASS, DB_NAME, DB_PORT);

注意,主机名是docker-compose.yml文件中定义的容器名“db”。这是因为在容器之间创建了docker网桥。该端口是3306的默认mysql端口。
但是需要注意的是,如果我们想使用“外部”应用程序(如sequel pro或workbench)连接到数据库,我们可以使用localhost或127.0.0.1连接到数据库,因为我们不直接处理容器。但是应该注意的是,默认端口3306在这种情况下不起作用。我们需要一个3306的外部端口。在我的例子中,应该是5001,如docker-compose.yml文件所示。

相关问题