连接到docker-compose mysql容器会拒绝访问,但docker运行相同的映像不会

我有一些问题连接到我用docker-compose启动的mysql docker容器。 这是一个很长的post(对不起!)。

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

db: image: mysql:5.7 ports: - "3306:3306" # I have tried both ports and expose "3306". Still doesn't work environment: - MYSQL_ROOT_PASSWORD="secret" - MYSQL_USER="django" - MYSQL_PASSWORD="secret" - MYSQL_DATABASE="myAppDB" 

然后:

 $> docker-compose build db uses an image, skipping #expected! $> docker-compose up <<LOTS OF OUTPUT>> 

好,现在我有一个运行的docker容器runner mysql:5.7。 大! 还是呢? 当在我的Django应用程序中testing时,我得到操作错误,说用户不允许连接数据库。 好吧,那么也许这是我的django呢?

 $> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c7216f99ca0f mysql:5.7 "docker-entrypoint.sh" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp sharpfin_db_1 $> docker-machine ip dev 192.168.99.100 $> mysql -h 192.168.99.100 -P 3306 -u django -p Enter password: ERROR 1045 (28000): Access denied for user 'django'@'192.168.99.1' (using password: YES) 

好,那么也许这是连接到docker组成容器的事情? 如果我尝试从docker集装箱内连接,该怎么办?

 $> docker exec -it c7216f99ca0f /bin/bash root@c7216f99ca0f:/# root@c7216f99ca0f:/# mysql -u django -p Enter password: ERROR 1045 (28000): Access denied for user 'django'@'localhost' (using password: YES) 

好的,所以docker的mysql不会让我连接,不知道为什么。 让我们来看看在没有docker-compose的情况下,

 $> docker run --name run-mysql -e MYSQL_ROOT_PASSWORD="secret" -e MYSQL_USER="django" -e MYSQL_PASSWORD="secret" -e MYSQL_DATABASE="myAppDB" -p "3306:3306" mysql:5.7 <<LOTS OF OUTPUT SAME AS BEFORE>> 

好的,现在我们有一个容器像以前一样使用相同的设置运行相同的图像。 (我认为这个断言可能不是真实的 – docker执行者正在做一些不同于docker运行的东西)。

 $> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 73071b929e82 mysql:5.7 "docker-entrypoint.sh" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp run-mysql 

有我的容器(称为run-mysql)。 连接吧!

 $> mysql -h 192.168.99.100 -P 3306 -u django -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.12 MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | myAppDB | +--------------------+ 2 rows in set (0.01 sec) mysql> 

好的。 可以login。这很奇怪…从容器内部怎么样?

 $> docker exec -it 73071b929e82 /bin/bash root@73071b929e82:/# mysql -u django -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.12 MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | myAppDB | +--------------------+ 2 rows in set (0.00 sec) mysql> 

好的,当我使用docker run启动时,我可以从容器的外部和内部login,但不能使用docker-compose。 这是怎么回事? docker-compose在后台必须做些改变数据库初始化的东西。

以上所有内容完全相同,如果我尝试与根用户以及。 所以这不是django用户的权限问题。

任何想法如何解决这个问题?

在使用数组定义时, docker-compose.yml文件中的环境variables不应该有引号:

 db: image: mysql:5.7 ports: - "3306:3306" environment: - MYSQL_ROOT_PASSWORD=secret - MYSQL_USER=django - MYSQL_PASSWORD=secret - MYSQL_DATABASE=myAppDB 

如果你在你docker-compose.yml文件中使用它们:

 db: image: mysql:5.7 ports: - "3306:3306" environment: - MYSQL_ROOT_PASSWORD="secret" - MYSQL_USER="django" - MYSQL_PASSWORD="secret" - MYSQL_DATABASE="myAppDB" 

并运行:

 $ docker-compose up -d 

并进入运行容器:

 $ docker-compose exec -it db /bin/bash 

你会看到输出:

 root@979813643b0c:/# echo $MYSQL_ROOT_PASSWORD "secret" 

我使用docker-compose正式使用mysql映像,没有问题。 我撰写文件的唯一区别是我使用的是字典而不是数组:

 environment: MYSQL_ROOT_PASSWORD: secret MYSQL_USER: django MYSQL_PASSWORD: secret MYSQL_DATABASE: myAppDB 

我注意到,撰写文件的文档仍然在一些地方卡在V1,所以你可以试试这个,如果你使用的是V2。 否则,为了debugging,您可以使用docker-compose exec与直接docker-compose exec的容器进行交互。

docker-compose exec db /bin/bash会给你一个容器上的shell,给你带来麻烦,你可以检查SHOW GRANTS FOR django@'%'或端口是否被正确转发。 我希望这有帮助。

我有一个类似的问题,这帮助了我:

https://github.com/docker-library/mysql/issues/51#issuecomment-76989402

你第一次尝试运行容器后是否更改过密码? docker-compose做了额外的工作来保存运行之间的卷(从而保留了数据库)。 你可能想尝试docker-compose rm -v来删除所有东西,然后再尝试启动它。

看起来你的问题已经解决了。 我想我会讨论类似这样的问题。

我在Synology NAS(DSM 6.0.2)上使用docker-compose来运行tomcat(web)和mysql(db)。 它在我有一个Ubuntu的盒子,但没有在NAS上正常工作。

问题是NAS上的防火墙 – 我修改了我的防火墙规则,允许某些端口打开,但最后拒绝所有端口。 当我join:3306到允许的端口它的工作!

这不是一个好的解决scheme,我不知道为什么帝斯曼需要这个,因为docker撰写正在桥梁networking上运行。 我已经为此付了一张支持票。

这个答案可以帮助他人解决这个容器问题。