我第一次尝试使用Docker。有一个LEMP堆栈并运行,但我无法连接到MYSQL数据库。不在我的Symfony应用程序上,而不在PHPMyAdmin上。应用程序返回以下错误代码:
驱动程序中发生异常:SQLSTATE [HY000] [2002]拒绝连接
这是我的docker-compose.yml:
nginx:
image: tutum/nginx
ports:
- "80:80"
links:
- phpfpm
volumes:
- ./nginx/default:/etc/nginx/sites-available/default
- ./nginx/default:/etc/nginx/sites-enabled/default
- ./logs/nginx-error.log:/var/log/nginx/error.log
- ./logs/nginx-access.log:/var/log/nginx/access.log
phpfpm:
build: phpfpm/
ports:
- "9000:9000"
volumes:
- ./public:/usr/share/nginx/html
mysql:
image: mariadb
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: admin
phpmyadmin:
image: phpmyadmin/phpmyadmin
restart: always
links:
- mysql
ports:
- 8183:80
environment:
MYSQL_USERNAME: admin
MYSQL_ROOT_PASSWORD: admin
PMA_ARBITRARY: 1
Dockerfile PHPFPM:
FROM php:fpm
RUN docker-php-ext-enable opcache
RUN apt-get update \
&& apt-get install -y --no-install-recommends libpq-dev \
&& docker-php-ext-install mysqli pdo_pgsql pdo_mysql
GitHub网址:https://github.com/MolengraafFrank/DockerSymfony
有人可以帮帮我吗?谢谢你的时间。
答案 0 :(得分:6)
'[2002]拒绝连接'意味着您可以访问数据库服务器,但您无权访问该用户(在您的情况下为admin)。默认情况下,mariadb有一个root用户,密码由MYSQL_ROOT_PASSWORD给出,该用户可以从任何服务器(%)连接。
如果要对数据库使用over login,则必须在数据库服务器中创建它,并在所选位置的数据库上正确授予。
一个过度的问题是,你为数据库服务器'mysql'提供了支持,默认情况下,phpmyadmin尝试连接到'db'。所以你必须添加
PMA_HOST: mysql
给你Phpmyadmin环境。
如果你使用默认配置(与root连接到数据库服务器),我认为MYSQL_USERNAME和PMA_ARBITRARY是无用的
答案 1 :(得分:2)
我设法使用mysql命令行工具连接到mysql实例,这是我使用的命令 - mysql -u root -p -h 127.0.0.1
,并输入管理员密码。这对你来说是一个充分的解决方案吗?
答案 2 :(得分:1)
你需要将phpfpm容器链接到mysql。
答案 3 :(得分:0)
我遇到了这个挑战,因为我正在运行3个具有不同IP地址的不同容器
db - 172.18.0.3 - container for MYSQL
app - 172.18.0.2 - container for Laravel app
所以我通过编辑Laravel .env文件修复了它
DB_CONNECTION=mysql
DB_HOST=172.18.0.3
DB_PORT=3306
DB_DATABASE=database_name
DB_USERNAME=username
...
获取您的容器ip地址。来自您的Docker主机
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
答案 4 :(得分:0)
在我的情况下,我正在将端口映射到主机mac(mysql
)的Docker容器中运行3306:3306
。我尝试使用127.0.0.1从phpmyadmin
docker容器连接到该数据库。但这是行不通的,因为localhost
码头集装箱上的phpmyadmin
没有运行所需的mysql
。
要从docker网络连接到主机
docker.for.mac.host.internal
答案 5 :(得分:0)
就我而言,问题出在端口映射不知何故。
就我而言,它是 private static final BitSet ILLEGAL_CHARACTERS = new BitSet();
static {
for (char c : new char[]{
'/','\n','\r','\t','\0','\f','`','?','*','\\','<','>','|','\"',':'}) {
ILLEGAL_CHARACTERS.set(c);
}
}
public static boolean fileNameIsValid(String fileName) {
return fileName.chars().noneMatch(ILLEGAL_CHARACTERS::get);
}
,只要我在右侧将其更改为 3307:3306
,我就可以连接到数据库实例。