使用docker volume轻松管理数据库 (docker volume数据库)

使用Docker Volume轻松管理数据库

随着云服务的发展,使用容器化技术来管理应用程序的方式越来越受到欢迎。容器化技术提供了更高效、更灵活、更可靠的应用程序部署方式,其中最重要的是Docker这个比较成熟的容器化技术。

对于应用程序开发者、系统管理员或DevOps工程师而言,Docker技术可以大大简化管理任务,减少了可能的配置问题,并提供了可重复的服务透明性。本文将介绍如何使用Docker volume来轻松地管理数据库。

Docker Volume介绍

Docker Volume是Docker提供的一种用于数据持久化存储的机制。与容器持久化存储不同的是,Docker Volume在容器启动和停止时,可以保留数据,同时可以跨容器共享。

在Docker中,使用dockerVolume可以轻松地将数据卷挂载到容器中。这个数据卷可以是一个文件夹、一个文件或一个远程文件系统挂载点。Docker Volume还可以支持其他的插件,如NFS插件、Amazon EBS插件、Google Cloud插件等。Docker Volume提供了一些简单易用的命令,例如创建、挂载、列出、删除数据卷等。

使用Docker Volume管理数据库

Docker Volume为数据库管理提供了一个完美的工具。管理数据库时,使用Docker Volume可以将数据库容器与数据库数据持久化存储分离。这样做的好处是在容器需要重启、应用程序需要升级或者服务器需要迁移时,数据库容器和数据库数据可以分别处理,这样就不会失去宝贵的数据。

使用Docker Volume存储MySQL数据库

下面以MySQL数据库为例,介绍如何使用Docker Volume来管理数据库。如果将容器映像与数据层分离,可以使用以下命令创建Docker Volume:

“`

docker volume create mysql_data

“`

该命令将创建一个名为mysql_data的数据卷。接下来,可以将数据卷挂载到一个MySQL容器中。以下是挂载卷的命令:

“`

docker run -d –name mysql -e MYSQL_ROOT_PASSWORD=yourpassword -v mysql_data:/var/lib/mysql mysql:latest

“`

在该命令中,-v参数指定先前创建的mysql_data数据卷,该数据卷的目标位置是MySQL容器中的/var/lib/mysql。

当创建或启动MySQL容器时,数据卷将自动挂载到容器中/var/lib/mysql目录,这使得MySQL数据存储与容器分离。如需管理MySQL数据库,可以直接进入MySQL容器并执行标准MySQL命令。在这种情况下,不会丢失任何数据库数据。

使用Docker Volume存储MongoDB数据库

对于MongoDB数据库而言,使用Docker Volume同样非常简单。以下是使用docker命令创建mongo_data数据卷的示例:

“`

docker volume create mongo_data

“`

接下来,将数据卷挂载到MongoDB容器中,方法如下所示:

“`

docker run -d –name mongo -v mongo_data:/data/db mongo:latest

“`

在该命令中,-v参数指定mongo_data数据卷,该数据卷的目标位置是MongoDB容器中的/data/db。

与MySQL数据库类似,MongoDB容器数据存储与容器分离。如需管理MongoDB数据库,同样可以直接进入MongoDB容器并执行标准MongoDB命令。

容器化技术给开发者和系统管理员带来高效、灵活和可靠的应用程序部署方式。使用Docker Volume来管理数据库,可以将在容器重启、应用程序升级或服务器迁移时不会丢失任何数据库数据。以上所述是如何使用Docker Volume来管理MySQL和MongoDB数据库,但它可以使用于任何一种数据库管理。要注意维护好数据卷内的数据,以确保您的数据是安全、稳定和一致的。

相关问题拓展阅读:

docker挂载volume的用户权限问题

在刚开始使用docker volume挂载数据卷的时候,经常出现没有权限的问题。

这里通过遇到的问题来理解docker容器用户uid的使用,以及了解容器内外uid的映射关系。

本地有一个node的项目需要编译,采用docker来run npm install.

可以看到,install之后,node_modules文件的权限变成root了。那么,作为使用者的我们就没有权限去删除这个文件了。

为什么docker输出的文件权限会是root?

Docker容器运行的时候,如果没有专门指定user, 默认以root用户运行。我们的node镜像的 Dockerfile 里没有指定user.

容器里的执行用户的id是0,输出文件的权限也是0.

以下参考 Understanding how uid and gid work in Docker containers

首先了解uid,gid的实现

。Linux内核负责管理uid和gid,并通过内核级别的系统调用来决定是否通过请求的权限。

比如,当一个进程尝试去写文件,内核会检查创建这个进程的的user的uid和gid,来决定这个进程是否有权限修改这个文件。

这里没有使用username,而是uid。

当docker容器运行在宿主机上的时候,仍然只有一个内核。容器共享宿主机的内核,所以所有的uid和gid都受同一个内核来控制。

那为什么我容器里的用户名不一定和宿主内核一样呢?

比如,superset容器的用户叫做superset, 而本机没有superset这个用户。这是因为username不是Linux kernel的一部分。简单的来说,username是对uid的一个映射。

然而,权限控制的依据是uid,而不是username。

我们继续使用node镜像, 你可以在 github 查看Dockerfile. 里面创建了一个

uid为1000的用户node,但没指定运行user。

我执行的用户为ryan(uid=1000), 让容器后台执行sleep程序。

可以看到,容器外执行sleep的进程的用户是root。容器内部的用户也是0(root). 虽然执行docker run的用户是ryan

.

也就是说,我一个普通用户居然可以以root的身份去执行一个命令。看起来挺恐怖的样子。

权限是通过uid来判断的。接下来测试,相同uid的用户可以修改归属于这个uid的文件。

宿主机有一个用户ryan:

刚才使用的node镜像的Dockerfile也定义了1000的用户node:

我们在本地写一个文件a, 归属用户ryan

然后,通过volume挂载的方式,指定运行user为1000, 启动容器node:

可以看到, 容器外执行sleep的进程,user是ryan(另一个sleep进行是前面的root用户执行的实例,没删除)。

即,

docker run -u 可以指定宿主机运行docker命令的用户, -u指定的uid就是docker实际运行的进程拥有者

接下来去容器内部,看看能不能修改挂载的文件。

可以看到,我们挂载的文件a在容器内部显示owner是node,即uid=1000的用户。并且有权限查看和修改。

然后,我们写一个文件b,在容器内部,这个b自然属于uid=1000的node。来看看容器外:

同样的,容器外显示b从属于uid=1000的用户ryan,并且有权限查看和修改。

如此,可以证明容器内外共享uid和对应的权限。

本文最初的问题就是因为容器执行者和挂载数据卷的权限不同。容器内部运行是uid=0的用户,数据卷从属与uid=1000的ryan。最终导致容器写入数据卷的文件权限升级为root, 从而普通用户无法访问。

如果挂载了root的文件到容器内部,而容器内部执行uid不是0,则报错没有权限。我在挂载npm cache的时候遇到了这个问题,于是有了本文。

上面的demo恰好宿主机器和容器都存在一个uid=1000的用户,于是很和谐的实现了文件权限共享。接下来测试一个更加明显的demo。

宿主机器和容器都没有uid=1111, 我们以1111来执行容器:

接下来看看容器外的表现:

即-u指定容器内部执行的用户,以及容器外在宿主机进程的用户,同样容器写到数据卷的权限也由此指定。

如此,这个demo更容易理解容器内外的uid的对应关系。理解了以后我们挂载数据卷的时候就不会出现权限问题了。

由于安全问题,通常也是建议不用使用root来运行容器的。

Dockerfile 中的Volume有什么意义,光用docker run

你可以把VOLUME理解为,从镜像中复制指定卷的文件夹到本地/var/lib/docker/volumes//文件夹,然后把本地的该文件夹挂载到容器里面去。

本质上还是相当于一个本地文件夹挂载而已。

如何给启动的docker添加volume

直接docker run -v 跟本地目录 这样就或誉就直接渗册把本丛团宏地的目录映射到容器指定目录dockerfile 里的 volume指定的目录,里面内存变化的时候docker commit的时候忽略里面的改变。如何给启动的docker添加volume

关于docker volume数据库的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 使用docker volume轻松管理数据库 (docker volume数据库)