Docker 无法连接到蛋糕 php
Docker cant connect to cake php
HY 我在设置中有一个 docker 容器,我收到一个错误,提示系统无法连接到数据库,我不知道这是怎么回事。
我尝试连接到本地主机、127.0.0.1 和 mysql,但我得到了同样的错误:
CakePHP 无法连接到数据库。
无法建立与 Mysql 的连接:SQLSTATE[HY000] [2002] 没有这样的文件或目录
似乎无法在日志文件(apache 和 cake)中找到任何内容,我缺少什么?
php代码:
'default' => [
//'className' =>'Cake\Database\Connection',
'className' => Connection::class,
'driver' => Mysql::class,
//'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'timezone' => 'UTC',
'encoding' => 'utf8',
'host' => 'mysql',
'username' => 'myusername',
'password' => 'mypassword',
'database' => 'myadatabase',
'flags' => [],
'cacheMetadata' => true,
'log' => false,
'quoteIdentifiers' => false,
],
docker-compose.yml
#File version 2.1
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"
docker 构建脚本:
FROM php:7.3-apache-stretch
# suppression of debconfig complaints of install apt packages interactively
ARG DEBIAN_FRONTEND=noninteractive
# Update
RUN apt-get -y update --fix-missing && \
apt-get upgrade -y && \
apt-get --no-install-recommends install -y apt-utils && \
rm -rf /var/lib/apt/lists/*
# Install useful tools and install important libaries
RUN apt-get -y update && \
apt-get -y --no-install-recommends install nano wget dialog libsqlite3-dev libsqlite3-0 && \
apt-get -y --no-install-recommends install mysql-client zlib1g-dev libzip-dev libicu-dev && \
apt-get -y --no-install-recommends install --fix-missing apt-utils build-essential git curl && \
apt-get -y --no-install-recommends install --fix-missing libcurl3 libcurl3-dev zip openssl && \
rm -rf /var/lib/apt/lists/* && \
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Install xdebug
RUN pecl install xdebug-2.7.2 && \
docker-php-ext-enable xdebug
# Install redis
RUN pecl install redis-5.0.2 && \
docker-php-ext-enable redis
# Other PHP7 Extensions
RUN docker-php-ext-install pdo_mysql && \
docker-php-ext-install pdo_sqlite && \
docker-php-ext-install mysqli && \
docker-php-ext-install curl && \
docker-php-ext-install tokenizer && \
docker-php-ext-install json && \
docker-php-ext-install zip && \
docker-php-ext-install -j$(nproc) intl && \
docker-php-ext-install mbstring && \
docker-php-ext-install gettext
# Install Freetype
RUN apt-get -y update && \
apt-get --no-install-recommends install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \
rm -rf /var/lib/apt/lists/* && \
docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && \
docker-php-ext-install -j$(nproc) gd
# Enable apache modules
RUN a2enmod rewrite headers
# Cleanup
RUN rm -rf /usr/src/*
为什么我用环境变量更改了 app.php 更改了数据库的用户名和密码。
我删除了 ./data/mysql 的数据重建容器但仍然是同样的错误我猜它与主机名有关
也尝试使用变量 PMA_HOST 但还是不行。 (本地主机也不起作用)
'host' => env('PMA_HOST'),
如果我登录到 phpmyadmin,我可以毫无问题地创建我的表。
如果我登录到容器,我可以登录并进行查询
我通过 grepping php 设置看到套接字没有被填充,
pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock
现在已填好,但仍然无法继续 php 与 mysql 的连接(太棒了,在我的数据库测试脚本中我有连接)。
当宿主机和容器化的Docker数据库需要建立连接时,需要使用宿主机的环回IP地址(127.0.0.1)和在您的情况下,这将如下所示:
...
'host' => '127.0.0.1',
'port' => HOST_MACHINE_MYSQL_PORT
'username' => DOCKER_MYSQL_USERNAME,
'password' => DOCKER_MYSQL_PASSWORD,
'database' => DOCKER_MYSQL_DATABASE_NAME
...
HOST_MACHINE_MYSQL_PORT
是数据库服务从 Docker 容器指向主机上的端口。
当您连接到 Docker 容器内的 MySQL 服务器 运行 公开的端口时,应该会按预期建立连接。
关于 localhost
与 127.0.0.1
的快速说明:
localhost 是给机器本身的标准主机名,通常解析并映射到 127.0.0.1 地址。
127.0.0.1 地址是机器本身的地址,用于与最终用户使用的同一台机器或计算机建立 IP 连接。
HY 我在设置中有一个 docker 容器,我收到一个错误,提示系统无法连接到数据库,我不知道这是怎么回事。
我尝试连接到本地主机、127.0.0.1 和 mysql,但我得到了同样的错误:
CakePHP 无法连接到数据库。 无法建立与 Mysql 的连接:SQLSTATE[HY000] [2002] 没有这样的文件或目录
似乎无法在日志文件(apache 和 cake)中找到任何内容,我缺少什么?
php代码:
'default' => [
//'className' =>'Cake\Database\Connection',
'className' => Connection::class,
'driver' => Mysql::class,
//'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'timezone' => 'UTC',
'encoding' => 'utf8',
'host' => 'mysql',
'username' => 'myusername',
'password' => 'mypassword',
'database' => 'myadatabase',
'flags' => [],
'cacheMetadata' => true,
'log' => false,
'quoteIdentifiers' => false,
],
docker-compose.yml
#File version 2.1
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"
docker 构建脚本:
FROM php:7.3-apache-stretch
# suppression of debconfig complaints of install apt packages interactively
ARG DEBIAN_FRONTEND=noninteractive
# Update
RUN apt-get -y update --fix-missing && \
apt-get upgrade -y && \
apt-get --no-install-recommends install -y apt-utils && \
rm -rf /var/lib/apt/lists/*
# Install useful tools and install important libaries
RUN apt-get -y update && \
apt-get -y --no-install-recommends install nano wget dialog libsqlite3-dev libsqlite3-0 && \
apt-get -y --no-install-recommends install mysql-client zlib1g-dev libzip-dev libicu-dev && \
apt-get -y --no-install-recommends install --fix-missing apt-utils build-essential git curl && \
apt-get -y --no-install-recommends install --fix-missing libcurl3 libcurl3-dev zip openssl && \
rm -rf /var/lib/apt/lists/* && \
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Install xdebug
RUN pecl install xdebug-2.7.2 && \
docker-php-ext-enable xdebug
# Install redis
RUN pecl install redis-5.0.2 && \
docker-php-ext-enable redis
# Other PHP7 Extensions
RUN docker-php-ext-install pdo_mysql && \
docker-php-ext-install pdo_sqlite && \
docker-php-ext-install mysqli && \
docker-php-ext-install curl && \
docker-php-ext-install tokenizer && \
docker-php-ext-install json && \
docker-php-ext-install zip && \
docker-php-ext-install -j$(nproc) intl && \
docker-php-ext-install mbstring && \
docker-php-ext-install gettext
# Install Freetype
RUN apt-get -y update && \
apt-get --no-install-recommends install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \
rm -rf /var/lib/apt/lists/* && \
docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && \
docker-php-ext-install -j$(nproc) gd
# Enable apache modules
RUN a2enmod rewrite headers
# Cleanup
RUN rm -rf /usr/src/*
为什么我用环境变量更改了 app.php 更改了数据库的用户名和密码。
我删除了 ./data/mysql 的数据重建容器但仍然是同样的错误我猜它与主机名有关
也尝试使用变量 PMA_HOST 但还是不行。 (本地主机也不起作用)
'host' => env('PMA_HOST'),
如果我登录到 phpmyadmin,我可以毫无问题地创建我的表。
如果我登录到容器,我可以登录并进行查询
我通过 grepping php 设置看到套接字没有被填充,
pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock
现在已填好,但仍然无法继续 php 与 mysql 的连接(太棒了,在我的数据库测试脚本中我有连接)。
当宿主机和容器化的Docker数据库需要建立连接时,需要使用宿主机的环回IP地址(127.0.0.1)和在您的情况下,这将如下所示:
...
'host' => '127.0.0.1',
'port' => HOST_MACHINE_MYSQL_PORT
'username' => DOCKER_MYSQL_USERNAME,
'password' => DOCKER_MYSQL_PASSWORD,
'database' => DOCKER_MYSQL_DATABASE_NAME
...
HOST_MACHINE_MYSQL_PORT
是数据库服务从 Docker 容器指向主机上的端口。
当您连接到 Docker 容器内的 MySQL 服务器 运行 公开的端口时,应该会按预期建立连接。
关于 localhost
与 127.0.0.1
的快速说明:
localhost 是给机器本身的标准主机名,通常解析并映射到 127.0.0.1 地址。
127.0.0.1 地址是机器本身的地址,用于与最终用户使用的同一台机器或计算机建立 IP 连接。