【问题标题】:Docker MySQL mysqli::real_connect():(HY000/2002): Connection refusedDocker MySQL mysqli::real_connect():(HY000/2002):连接被拒绝
【发布时间】:2020-04-15 04:38:29
【问题描述】:

我是 docker/docker-compose 的新手。我正在尝试连接 2 个容器,它们是 CodeIgniter 应用程序和 MySQL。我似乎无法解决我的网络应用程序上的 'mysqli::real_connect(): (HY000/2002): Connection denied' 问题。我能够从容器内部 ping 到另一个容器,反之亦然。

这是我的 docker-compose.yml 文件:

version: '3'

services:

  web:
    container_name: ciblog
    build: .
    links: 
      - db
    depends_on:
      - db
    ports:
      - '80:80'
    volumes: 
      - .:/var/www/html/

  db:
    container_name: mysql
    image: mysql:latest
    ports:
      - '3306:3306'
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      MYSQL_USER: root
      MYSQL_DATABASE: ciblog
    volumes:
      - ./assets/sql/ciblog.sql:/docker-entrypoint-initdb.d/ciblog.sql

Dockerfile

FROM php:7.0-apache
RUN apt-get update && \
    apt-get install -y libfreetype6-dev libjpeg62-turbo-dev && \
    docker-php-ext-install mysqli && \
    docker-php-ext-install mbstring && \
    docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/  &&  \
    docker-php-ext-install gd
RUN a2enmod rewrite
RUN service apache2 restart

这是我的 database.php 配置:

$active_group = 'default';
$query_builder = TRUE;

$db['default'] = array(
    'dsn'   => '',
    'dbport' => '3306',
    'hostname' => 'db',
    'username' => 'root',
    'password' => '',
    'database' => 'ciblog',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => FALSE,
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

谁能帮我找出问题?先感谢您。 如果您想查看文件,这是我的 GitHub 存储库:https://github.com/josephsim/docker-ciblog

【问题讨论】:

    标签: php mysql docker codeigniter docker-compose


    【解决方案1】:

    在基于 Docker Compose 的设置中,您可以使用服务名称作为主机名。在您的示例中,设置

    'hostname' => 'db'
    

    Networking in Compose 对此进行了更详细的讨论。

    Docker 容器没有一致的 IP 地址,手动查找它们通常没有用处。在现代 Docker 中你也不需要 links: 并且删除该行不会有害。

    【讨论】:

    • 谢谢您的建议,先生,我会记住的。
    【解决方案2】:

    我终于明白了。更改 MySQL 版本有效。

    image: mysql:5.7
    

    来源:https://stackoverflow.com/a/50169745/12555817

    【讨论】:

      【解决方案3】:

      在基于 Docker Compose 的设置中,您可以使用服务名称作为主机名。在您的示例中,设置

      '主机名' => 'db'

      【讨论】:

        猜你喜欢
        • 2015-12-31
        • 1970-01-01
        • 1970-01-01
        • 2016-11-03
        • 2017-07-12
        • 2021-07-10
        • 2022-08-02
        • 2016-03-12
        • 2022-10-25
        相关资源
        最近更新 更多