Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在某些情况下,PHP无法解析mysql容器名称_Mysql_Docker_Hostname - Fatal编程技术网

在某些情况下,PHP无法解析mysql容器名称

在某些情况下,PHP无法解析mysql容器名称,mysql,docker,hostname,Mysql,Docker,Hostname,我有一个遗留的PHP应用程序。它使用mysqli来制作mysql的东西。所以在配置中,我有DSN字符串来连接mysql服务。那样 mysql://username:password@db_主机名/dbname Mysqli返回错误 警告:mysqli::real\u connect():php\u network\u getaddresses:getaddrinfo失败:名称或服务未知 但是如果我用这个手动连接 mysqli::real\u connect(“db\u主机名”) 警告:mysql

我有一个遗留的PHP应用程序。它使用mysqli来制作mysql的东西。所以在配置中,我有DSN字符串来连接mysql服务。那样

mysql://username:password@db_主机名/dbname

Mysqli返回错误

警告:mysqli::real\u connect():php\u network\u getaddresses:getaddrinfo失败:名称或服务未知

但是如果我用这个手动连接

mysqli::real\u connect(“db\u主机名”)

警告:mysqli::real_connect():(HY000/1045):用户@'172.21.0.3的访问被拒绝(使用密码:否)

real\u connect(“user@db_hostname“
real\u connect(“mysql:db\u hostname”)
real\u connect(“mysql:host=db\u hostname”)
无法解析主机地址

我做错了什么

docker-compose.yml:

version: "3"
services:
  nginx:
    image: nginx:1.13-alpine
    volumes:
      - ./docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - ./docker/nginx/errors.log:/var/logs/errors.log
      - ./docker/nginx/access.log:/var/logs/access.log
      - ./:/var/www/html
    ports:
      - "8081:80"
    command: nginx -g "daemon off;"
  php:
    build:
      context: ./docker/
      dockerfile: php.Dockerfile
    user: "1000"
    volumes:
      - ./docker/timezone.php.ini:/usr/local/etc/php/conf.d/timezone.php.ini:ro
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
      - ./:/var/www/html

  db_hostname:
    image: mysql:5.5
    user: "1000"
    environment:
      - MYSQL_DATABASE=db
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_USER=user
      - MYSQL_PASSWORD=user
    volumes:
      - ./docker/mysql:/var/lib/mysql
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro

由于缺少链接,您需要使用php创建db容器。当您将db与PHP链接时,可以从PHP的localhost访问它

这是我修改您的docker compose文件,因为我喜欢alpine everywhere;)。我使用adminer和linkwithdb来验证连接,而不是代码级检查。因为我没有php docker文件,所以我创建了包含php7的php:alpine

version: "3"
services:
  nginx:
    image: nginx:1.13-alpine
    container_name: nginx
    ports:
      - "8081:80"
    command: nginx -g "daemon off;"
  db:
    image: mysql:5.5
    environment:
      MYSQL_ROOT_PASSWORD: example

  php:
    image: php:alpine
    container_name: php
    tty: true
    links:
     - db 
  adminer:
    image: adminer
    container_name: adminer
    ports:
      - 8080:8080
    links:
     - db 
然后我在php容器中安装了mysqli

docker exec -it php ash
并在命令下运行

docker-php-ext-install mysqli;
然后创建test.php

这里的服务器名是db。注意,您的服务器名将是指向php的db容器名。 如果您在php容器中ping db,它将ping db容器

    <?php
$servername = "db";
$username = "root";
$password = "example";

// Create connection
$conn = new mysqli($servername, $username, $password);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 
echo "Connected successfully";
?>

这里是adminer,它也与db链接


因为缺少链接使用php连接db容器。当您将db与PHP链接时,可以从PHP的localhost访问它

这是我修改您的docker compose文件,因为我喜欢alpine everywhere;)。我使用adminer和linkwithdb来验证连接,而不是代码级检查。因为我没有php docker文件,所以我创建了包含php7的php:alpine

version: "3"
services:
  nginx:
    image: nginx:1.13-alpine
    container_name: nginx
    ports:
      - "8081:80"
    command: nginx -g "daemon off;"
  db:
    image: mysql:5.5
    environment:
      MYSQL_ROOT_PASSWORD: example

  php:
    image: php:alpine
    container_name: php
    tty: true
    links:
     - db 
  adminer:
    image: adminer
    container_name: adminer
    ports:
      - 8080:8080
    links:
     - db 
然后我在php容器中安装了mysqli

docker exec -it php ash
并在命令下运行

docker-php-ext-install mysqli;
然后创建test.php

这里的服务器名是db。注意,您的服务器名将是指向php的db容器名。 如果您在php容器中ping db,它将ping db容器

    <?php
$servername = "db";
$username = "root";
$password = "example";

// Create connection
$conn = new mysqli($servername, $username, $password);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 
echo "Connected successfully";
?>

这里是adminer,它也与db链接


docker compose rm-v使用并删除MySQL卷

卷数:

  • /docker/mysql:/var/lib/mysql->pathmysql
  • /etc/timezone:/etc/timezone:ro
  • /etc/localtime:/etc/localtime:ro

docker编写rm-v
使用并删除MySQL卷

卷数:

  • /docker/mysql:/var/lib/mysql->pathmysql
  • /etc/timezone:/etc/timezone:ro
  • /etc/localtime:/etc/localtime:ro

是否使用docker-compose.yml配置文件?你能提供吗?@Chrysovalantis Koutsoumpos addedHost地址看起来不错。我认为你不知何故没有传递密码。查看mysqli::real\u connect文档,我发现您必须像real\u connect::real\u connect('db\u hostname','user','user','db')这样连接您尝试过吗?还可以尝试使用根凭据。您是否尝试从应用程序外部访问它,从SequelPro访问fe?并尝试在db_主机名服务中公开端口。端口:-“3306:3306”在dev和prod服务器上,它仅与DSN连接字符串一起工作。就像这个-
mysq://user:pass@主机/dbname
。但在docker容器中,它无法解析主机,但可以使用
gethostbyname
访问主机。使用DSN无法解决此问题,为什么?是否使用docker-compose.yml配置文件?你能提供吗?@Chrysovalantis Koutsoumpos addedHost地址看起来不错。我认为你不知何故没有传递密码。查看mysqli::real\u connect文档,我发现您必须像real\u connect::real\u connect('db\u hostname','user','user','db')这样连接您尝试过吗?还可以尝试使用根凭据。您是否尝试从应用程序外部访问它,从SequelPro访问fe?并尝试在db_主机名服务中公开端口。端口:-“3306:3306”在dev和prod服务器上,它仅与DSN连接字符串一起工作。就像这个-
mysq://user:pass@主机/dbname
。但在docker容器中,它无法解析主机,但可以使用
gethostbyname
访问主机。使用DSN是无法解决的,为什么?非常感谢你。。。我花了两天的时间试图解决这个问题,但最终,你的答案奏效了。非常感谢你。。。我花了两天时间想弄明白这个问题,但最后,你的答案奏效了。