提交容器后,Docker容器中的MySQL服务器不起作用

时间:2018-07-25 13:19:51

标签: mysql docker

我创建了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)

enter image description here

然后我在不停止容器的情况下退出容器中的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)

enter image description here

甚至在重新启动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)

b

当我尝试重新启动容器中的MySQL服务器

/etc/init.d/mysql restart

...,容器在后台重启

enter image description here

...,但是当我再次运行它并尝试重复步骤(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)

...再次。

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客户端二进制文件,并使用该二进制文件与容器中运行的服务器进行交互。您不需要容器中的交互式外壳即可执行此处描述的任何操作。