【问题标题】:Codeigniter mysql can't connect in dockerCodeigniter mysql无法在docker中连接
【发布时间】:2018-06-10 21:35:00
【问题描述】:

Codeigniter 3.0无法连接本地mysql,请告知原因。

错误信息是 SQLSTATE [HY000] [2002] 连接被拒绝。 我的 Codeigniter 正在开发 Docker。

特别是在 mac 中的 Docker

  • php-fpm 7.1
  • MySQL 5.7
  • Nginx 2.4

容器正在工作。

并且那个 MySQL 容器可以从 sequel pro 或者 Mac 终端连接,只有 Codeigniter 可以连接。

来自我的 Mac 终端的成功连接代码

mysql -uroot -h 127.0.0.1-P 4306 -ppassword

db_test.php

<?php
  try {

    $pdo = new PDO(
    'mysql:dbname=******;host=127.0.0.1;charset=utf8',
    'root',
    'password',
    [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]
   );

} catch (PDOException $e) {

   header('Content-Type: text/plain; charset=UTF-8', true, 500);
   exit($e->getMessage()); 

}

结果 -- SQLSTATE [HY000] [2002] 连接被拒绝。

/config/database.php

}elseif (strpos($_SERVER['SERVER_NAME'],'myname') !== false && ENVIRONMENT != "test"){
// MyLocal Setting
$db['default'] = array(
        'dsn'   => '',
        'hostname' => '127.0.0.1',
  'port' => '4306',
        'username' => 'root',
        'password' => 'password',
        'database' => '******',
        'dbdriver' => 'mysqli',
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => TRUE,
        'cache_on' => FALSE,
        'cachedir' => '',
        'char_set' => 'utf8',
        'dbcollat' => 'utf8_general_ci',
        'swap_pre' => '',
        'encrypt' => FALSE,
        'compress' => FALSE,
        'stricton' => FALSE,
        'failover' => array(),
        'save_queries' => TRUE
);

docker-compose.yml

 version: '2'
   services:
     memcached:
     image: memcached:1.4

   data:
    image: busybox
    volumes:
      - ./misc/data:/var/lib/mysql

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: mysql_database
      MYSQL_USER: mysql_user
      MYSQL_PASSWORD: mysql_pw
      socket: /var/run/mysqld/mysqld.sock
    ports:
      - "4306:3306"
    volumes_from:
      - data
    volumes:
      - ../application/initial.sql:/docker-entrypoint-initdb.d/initial.sql
    container_name: mysql
nginx:
    build: ./nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    links:
      - web
    container_name: nginx
    environment:
     - CI_ENV=localhost

  web:
    build: ./php-fpm71
#    build: ./php-fpm56    <- if you want to use PHP5.6
    volumes:
      - /Users/alberorana/codeigniter/suke10:/var/www/html/suke10
      - ./php-fpm71/php.ini:/usr/local/etc/php/conf.d/php.ini
    links:
      - mysql
    environment:
      DATABASE_HOST: '0.0.0.0'
      DATABASE_NAME: 'suke10'
      DATABASE_USER: 'root'
      DATABASE_PASSWORD: 'password'
    container_name: web

mysql容器中的etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
#log-error      = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address   = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

【问题讨论】:

  • 作为/config/database.php 的本地地址,将'port' =&gt; '4306', 更改为'port' =&gt; '3306',,您只能从网桥外部连接4306,例如您的笔记本电脑。
  • 由于 db_test.php 没有使用 CodeIgniter 数据库库,我认为问题不在于 CodeIgniter。
  • 谢谢!我试过3306端口,结果还是一样。
  • @YumaUchida 您尝试从 php 容器内部连接 ​​host=127.0.0.1? (您需要使用 mysql 容器的名称(= mysql)而不是 localhost 进行连接。因为 php 容器内部的 localhost 与您可以连接到数据库的机器上的 localhost 不同。这个博客可能是有用的:lvthillo.com/…
  • @lvthillo 完全正确。谢谢。

标签: php mysql codeigniter docker nginx


【解决方案1】:

你在 php 容器中的数据库连接是:

 mysql:3306

由于您在您的编译器文件中,将 phpcontainer “链接”到数据库容器,并且链接是在您的主机文件中添加一行,因此 mysql 将为您指向内部 docker-network 中的 ip .

【讨论】:

    【解决方案2】:

    @lvthillo 我们可以通过将主机设置设置为 mysql 容器来连接!

    'mysql:dbname=******;host=mysql;charset=utf8'
    

    【讨论】:

      【解决方案3】:

      docker-compose.yml

      version: "3"
      
      services:
        webserver:
          build: 
            context: ./bin/webserver
          container_name: '7.3.x-webserver'
          restart: 'always'
          ports:
            - "${HOST_MACHINE_UNSECURE_HOST_PORT}:80"
            - "${HOST_MACHINE_SECURE_HOST_PORT}:443"
          links: 
            - mysql
          volumes: 
            - ${DOCUMENT_ROOT-./www}:/var/www/html
            - ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/php.ini
            - ${VHOSTS_DIR-./config/vhosts}:/etc/apache2/sites-enabled
            - ${LOG_DIR-./logs/apache2}:/var/log/apache2
        mysql:
          build:
            context: "./bin/${DATABASE}"
          container_name: '5.7-mysql'
          restart: 'always'
          ports:
            - "${HOST_MACHINE_MYSQL_PORT}:3306"
          volumes: 
            - ${MYSQL_DATA_DIR-./data/mysql}:/var/lib/mysql
            - ${MYSQL_LOG_DIR-./logs/mysql}:/var/log/mysql
          environment:
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}
        phpmyadmin:
          image: phpmyadmin/phpmyadmin
          container_name: 'sc-phpmyadmin'
          links:
            - mysql
          environment:
            PMA_HOST: mysql
            PMA_PORT: 3306
            PMA_USER: ${MYSQL_USER}
            PMA_PASSWORD: ${MYSQL_PASSWORD}
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}
          ports:
            - '8080:80'
          volumes: 
            - /sessions
        redis:
          container_name: 'sc-redis'
          image: redis:latest
          ports:
            - "${HOST_MACHINE_REDIS_PORT}:6379"
      

      /project/application/config/database.php

      $active_group = 'default';
      $query_builder = TRUE;
      
      $db['default'] = array(
          'dsn'   => '',
          'hostname' => 'mysql',
          'username' => 'root',
          'password' => 'tiger',
          'database' => 'docker',
          'dbdriver' => 'mysqli',
          'dbprefix' => '',
          'pconnect' => FALSE,
          'db_debug' => (ENVIRONMENT !== 'production'),
          'cache_on' => FALSE,
          'cachedir' => '',
          'char_set' => 'utf8',
          'dbcollat' => 'utf8_general_ci',
          'swap_pre' => '',
          'encrypt' => FALSE,
          'compress' => FALSE,
          'stricton' => FALSE,
          'failover' => array(),
          'save_queries' => TRUE
      );
      

      mysql 是服务的名称(mysql 容器)&& 使用与我的主机名相同的名称

      【讨论】:

        猜你喜欢
        • 2018-10-10
        • 2018-06-07
        • 2020-08-11
        • 2018-10-02
        • 2021-06-16
        • 2015-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多