如何将Docker卷移动到磁盘位置?

3

我在Ubuntu VPS上的Docker容器中运行一个MySQL Docker镜像。 我使用以下docker-composer.yml文件通过docker-compose up -d命令启动MySQL。

version: "3"
services:

    mysql_server:
        image: mysql:8.0.21
        restart: always
        container_name: mysql_server
        environment:
            MYSQL_DATABASE: db_name
            MYSQL_USER: db_username
            MYSQL_PASSWORD: db_password
            MYSQL_ROOT_PASSWORD: root_password
        volumes:
            - mysql_server_data:/var/lib/mysql
            - /mysql/files/conf.d:/etc/mysql/conf.d

我遇到了性能问题,想尝试以下措施来提高性能:

  1. 我希望将 mysql_server_data 卷中的数据挂载到 /mysql/data,而不会丢失任何数据,因为该实例正在生产环境中运行。

  2. 我还希望将MySQL配置文件挂载到 /mysql/files,以便我可以更改实例配置来增加性能。

问题

如何将卷的数据位置从 mysql_server_data 更改为 /mysql/data

此外,我如何将MySQL的配置文件挂载在 /mysql/files/conf.d 上以允许我更新设置?

我尝试像这样挂载配置文件:

        volumes:
            - /mysql/files/conf.d:/etc/mysql/conf.d

但这样会创建一个目录 /mysql/files/conf.d,但不包含任何配置文件。
2个回答

2

如何迁移数据:

关闭容器:docker-compose down,然后在本地文件系统中将数据从mysql_server_data复制到/mysql/data。接着修改compose文件以反映新位置。最后使用docker-compose up重新启动容器。

如何挂载配置文件,根据MySQL的Docker Hub文档,如果/my/custom/config-file.cnf是您自定义配置文件的路径和名称,则卷映射如下:

/my/custom:/etc/mysql/conf.d

请注意,将卷映射到容器不会将数据从容器传输到本地计算机,而是相反的过程。因此,如果您想在容器中拥有该文件,必须先在本地计算机上创建它。


我终于尝试了一下。我使用了这个命令 cp -a /var/lib/docker/volumes/root_mysql_server_data/. ./mysql/volume 来复制数据。然后在 docker-compose.yml 文件中,我将 - mysql_server_data:/var/lib/mysql 改为了 - /mysql/volume:/var/lib/mysql。接着我执行了 docker-compose down 然后是 docker-compose up -d.. 但是这并没有起作用。MySQL 给出了以下错误信息:--initializing specified but the data directory has files in it. Aborting. 设计的数据目录 /var/lib/mysql/ 是无法使用的。您可以删除服务器添加到其中的所有文件。 - Jay
我刚刚用一个小的测试数据库试了一下,对我来说运行得很好。请记住,在复制之前应该先关闭镜像以确保不会丢失数据。所以是compose down -> copy -> compose up。请注意,它可能确实会警告数据已经存在,这是预期的(毕竟数据已经存在),但至少对我来说这只是一个警告,数据库运行得很好。 - camba1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接