繁体   English   中英

Docker 上的 MySQL?

[英]MySQL on Docker?

我是 Docker 新手,仍在探索,我遇到了这个问题,可能看起来很傻,但我真的被卡住了。

所以我有一个使用 MySQL 服务器的 Spring Boot 应用程序,我想在容器上运行我的应用程序。

我设法做到“在没有 MySQL 的情况下运行应用程序”。 现在我正在学习本教程,以便在容器中安装 MySQL 并使用该容器运行我的应用程序。

https://medium.com/@itsromiljain/dockerize-rest-spring-boot-application-with-hibernate-having-database-as-mysql-579abcc4edc4

所以当我运行这个命令时:

 docker run -p 6603:3306 --name=docker-mysql --env="MYSQL_ROOT_PASSWORD=root" --env="MYSQL_PASSWORD=root" --env="MYSQL_DATABASE=test" mysql

我收到此错误: 在此处输入图像描述

我的猜测是因为我在我的机器上安装并运行了 MySQL,但我不相信,因为容器应该是隔离的。

PS:我正在使用 Windows 容器的 Windows 10 机器上运行 docker。 谢谢你。 编辑:这是错误的文本格式

2019-02-08T09:09:23.467525Z 1 [错误] [MY-012574] [InnoDB] 无法锁定 ./ibdata1 错误:95 2019-02-08T09:09:23.468063Z 1 [错误] [MY-012592] [InnoDB] 文件操作中的操作系统错误号 95。 2019-02-08T09:09:23.468133Z 1 [错误] [MY-012596] [InnoDB] 错误号 95 表示“不支持操作” 2019-02-08T09:09:23.468193Z 1 [错误] [MY-012215] [InnoDB] 无法打开数据文件 './ibdata1' 2019-02-08T09:09:23.468275Z 1 [错误] [MY-012959] [InnoDB] 无法打开或创建系统表空间。 如果您尝试将新数据文件添加到系统表空间,但在这里失败了,您现在应该将 my.cnf 中的 innodb_data_file_path 编辑回原来的样子,并删除在此失败尝试中创建的新 ibdata 文件 InnoDB。 InnoDB 只写了那些全是零的文件,但还没有以任何方式使用它们。 但要小心:不要删除包含您宝贵数据的旧数据文件! 2019-02-08T09:09:23.468387Z 1 [错误] [MY-012929] [InnoDB] InnoDB 数据库创建因错误无法打开文件而中止。 在尝试再次启动之前,您可能需要删除 ibdata1 文件。 2019-02-08T09:09:24.070144Z 0 [错误] [MY-010020] [服务器] 数据字典初始化失败。 2019-02-08T09:09:24.070172Z 0 [错误] [MY-013236] [服务器] 新创建的数据目录 /var/lib/mysql/ 不可用。 您可以安全地删除它。 2019-02-08T09:09:24.070759Z 0 [错误] [MY-010119] [服务器] 正在中止 2019-02-08T09:09:24.072260Z 0 [系统] [MY-010910] [服务器] /usr/sbin/ mysqld:关闭完成 (mysqld 8.0.15) MySQL 社区服务器 - GPL。

首先:在我的 Ubuntu Linux 机器上运行你的确切 docker 命令在容器内运行 mysql 没有问题。

但当然,这对你没有帮助,所以让我们看看你的问题:

这个问题应该与您本地机器上运行的 mysql 实例无关,因为正如您所说,docker 容器内的应用程序与主机是隔离的。

看来这是存储的问题。 出于某种原因,docker 容器内的 mysql 应用程序不能属性使用 /var/lib/mysql(也在 docker 容器内。错误消息明确指出:

...数据目录 /var/lib/mysql 不可用。

这可能是您的 docker 安装本身的问题、映像的问题或容器内 mysql 的配置问题。 我想说的第二个不太可能,因为 mysql docker 镜像被广泛使用,并且被认为非常稳定。 后一个选项总是有可能的,但是看到您所做的与 docker hub 页面上的示例没有太大不同,而且我能够在我的机器上运行确切的命令,我倾向于责怪第一个选项。

您是否尝试过提供带有 docker 卷的图像? (有关全局参考,请参阅https://docs.docker.com/storage/

最简单的类型由 docker 管理并添加到 docker 命令中,如下所示:

-v mysql_data:/var/lib/mysql

你的命令然后变成:

docker run -v mysql_data:/var/lib/mysql -p 6603:3306 --name=docker-mysql --env="MYSQL_ROOT_PASSWORD=root" --env="MYSQL_PASSWORD=root" --env="MYSQL_DATABASE=test"  mysql

如果要将其挂载到主机上的目录,请使用以下参数:

-v <local path>:/var/lib/mysql

由于大小问题,也会出现错误消息“新创建的数据目录 /var/lib/mysql/ 不可用”。 检查/增加底层服务器大小或 docker 为系统分配的大小。

我想你可能会做一些事情,比如切换音量或安装到不同的点(通过使用不同的插件来回切换)。 您可以通过重新初始化容器而不依赖于以前的容器来解决此问题。

只需移除旧容器即可解决这个问题。

docker容器修剪 -f

任何人都想重新创建问题,只需创建一个容器并使用本地驱动程序将卷附加到 /anyDir,然后停止容器。 再次重新创建并附加到相同的目录,现在使用本地持久化驱动程序。 再次停止容器。 现在使用第一个创建的容器的配置再次重新创建容器(最容易通过使用 swarm 或 compose 创建)

日志

如果有人遇到同样的问题。 切换回 Linux Containers 为我解决了这个问题。

请参阅下面的图像以了解如何执行此操作(右键单击下面的 docker 图标,然后选择相应的容器(事实上,如果您使用的是 Windows 容器,您会发现切换到 linux 容器,反之亦然:

在此处输入图片说明

在此处输入图片说明

我通过注释掉 docker-compose 文件中的卷映射来修复此错误。 运行 docker-compose up 命令并且 mysql-server 成功运行后,您可以停止容器,取消注释卷映射,然后再次运行 docker-compose up 命令。 现在数据将存储在正确的目录中并持久化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM