Docker MySQL mysqli::real_connect():(HY000/2002):连接被拒绝

Joe*_*e S 3 php mysql codeigniter docker docker-compose

我是 docker/docker-compose 的新手。我正在尝试连接 2 个容器,即CodeIgniter应用程序和MySQL。我似乎无法解决我的网络应用程序上的'mysqli::real_connect(): (HY000/2002): 连接被拒绝'问题。我能够从容器内部 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这是我的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
);
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*aze 5

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

'hostname' => 'db'
Run Code Online (Sandbox Code Playgroud)

Compose 中的网络对此进行了更详细的讨论。

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