我创建了docker-compose.yml文件,该文件创建MySQL映像并将MySQL根用户的密码设置为“ hello”。
# docker-compose.yml
version: '3.1'
services:
mysql:
image: mysql:5.6.40
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
- MYSQL_ROOT_PASSWORD=hello
- MYSQL_ALLOW_EMPTY_PASSWORD=hello
- MYSQL_RANDOM_ROOT_PASSWORD=hello
然后我跑:
sudo docker-compose up # (1)
...从带有此文件的目录中。
第一个问题是新创建的容器开始在前台运行,但不在bash中运行,并且我不能不退出而将其放在后台,这可以通过Ctrl + C或以某种方式输入bash来完成,从这个过程中。
但是当我打开一个新的终端窗口并运行时:
sudo docker exec -it bdebee1b8090 /bin/bash # (2)
...,其中bdebee1b8090是正在运行的容器的ID,我输入bash,在此我可以以root用户身份输入MySQL Shell,输入密码“ hello”:
mysql -u root -p # (3)
然后我在不停止容器的情况下退出容器中的MySQL shell和bash shell。
然后我将更改提交到容器:
sudo docker commit bdebee1b8090 hello_mysql # (4)
...,创建图像。然后,当我运行图像时:
sudo docker run -it --rm hello_mysql /bin/bash # (5)
...并尝试以root用户身份再次启动MySQL shell,输入密码“ hello”,出现类似
的错误ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
甚至在重新启动MySQL服务器之后:
/etc/init.d/mysql restart # (6)
...,我得到同样的错误。
以上所有命令均在ubuntu上运行。
为什么会这样?
编辑:
当我尝试在MacOS High Sierra上执行这些步骤时,我陷入了步骤(3),因为当我尝试输入密码“ hello”时,它不会被接受。屏幕上显示此错误:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
当我尝试重新启动容器中的MySQL服务器
/etc/init.d/mysql restart
...,容器在后台重启
...,但是当我再次运行它并尝试重复步骤(2)和(3)时,它给出了相同的错误,并且当我再次重新启动MySQL服务器时,该容器再次在后台重新启动...
编辑2:
删除行后:
- MYSQL_ALLOW_EMPTY_PASSWORD=hello
- MYSQL_RANDOM_ROOT_PASSWORD=hello -
...它开始在Mac上运行,但是仍然在我提交容器并尝试进入MySQL Shell之后,它给出了错误,例如:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
...再次。
答案 0 :(得分:1)
根据MySQL docker映像的官方文档
https://hub.docker.com/r/mysql/mysql-server/
布尔变量,包括MYSQL_RANDOM_ROOT_PASSWORD, MYSQL_ONETIME_PASSWORD,MYSQL_ALLOW_EMPTY_PASSWORD和 通过使用以下任意字符串设置MYSQL_LOG_CONSOLE,即可使其成立: 非零长度。因此,将其设置为例如“ 0”, “ false”(假)或“ no”(否)不会使它们假,但实际上会使它们假 真正。这是MySQL Server容器的已知问题。
这意味着您的配置:
- MYSQL_ALLOW_EMPTY_PASSWORD=hello
- MYSQL_RANDOM_ROOT_PASSWORD=hello
等于:
- MYSQL_ALLOW_EMPTY_PASSWORD = true
- MYSQL_RANDOM_ROOT_PASSWORD = true
这使我们明白了这一点:
MYSQL_RANDOM_ROOT_PASSWORD:当此变量为true时(这是它的 默认状态,除非设置了MYSQL_ROOT_PASSWORD或 MYSQL_ALLOW_EMPTY_PASSWORD设置为true),即 启动Docker容器时生成服务器的根用户。 密码被打印到容器的标准输出,可以通过以下方式找到 查看容器的日志。
因此,请检查您的容器日志文件以查找生成的随机密码
或仅从文件中删除配置参数MYSQL_RANDOM_ROOT_PASSWORD
。
答案 1 :(得分:1)
Docker映像通常被设计为在前台运行单个进程或服务器,直到它们退出。标准的mysql
映像是这样工作的:如果您docker run mysql
不使用-d
,则将看到所有服务器日志都打印到stdout,并且没有立即获得外壳的选项。您应该将容器中的交互式shell视为调试的便利,而不是Docker容器运行的通常方式。
docker run --rm -it /bin/bash
时,它运行数据库服务器的交互式外壳 ,这就是为什么出现“无法连接到服务器”错误的原因。通常,您应该假设init.d脚本之类的东西在Docker中不起作用;视具体设置而定,但这又不是Docker容器运行的常用方式。
您可以在主机上或其他位置安装mysql
客户端二进制文件,并使用该二进制文件与容器中运行的服务器进行交互。您不需要容器中的交互式外壳即可执行此处描述的任何操作。