涨薪技术|Docker容器数据管理
2026/7/27 17:59:08 网站建设 项目流程

在生产环境中使用Docker时,经常需要对数据进行持久化,这就有点像Redis里面的持久性一样的,或者需要在多个容器之间在进行数据共享,这就是Docker中我们说的数据管理操作。

容器中管理数据主要有两种方式:

数据卷(Data Volumes):容器内数据直接映射到本地主机环境;

数据卷容器(Data Volume Containers):使用特定容器维护数据卷;

01数据卷

数据卷(Data Volumes)是一个可供容器使用的特殊目录,它可以将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。

数据卷可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便;

  • 对数据卷内数据的修改会立即生效,无论是容器内操作还是本地操作;

  • 对数据卷的更新不会影响镜像,解藕开应用和数据;

  • 卷会一直存在,直到没有容器使用,可以安全地卸载它。

目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中。

volume:

Docker管理宿主机文件系统的一部分,默认位于/var/lib/docker/volumes目录中,这是目前使用的最多的方式。

目前所有容器的数据都保存在这个目录下,由于没有创建指定卷,所以Docker帮默认创建了许多匿名卷。

bind mount:

表示可以存储在宿主机系统的任意位置,这种方法比较常用。但是bind mount在不同的宿主机系统时不可移植。

tmpfs mount:

表示挂载存储在宿主机系统内存中,而不会写入宿主机的文件系统,几乎不用。

02创建数据卷

Docker提供了volume子命令来管理数据卷,volume子命令的语法格式如下:

docker volume create [OPTIONS] [VOLUME]
//创建一个自宝义容器卷 root@ubuntu:/var/lib/docker/volumes# docker volume create my-vol //查看所有容器卷 root@ubuntu:/var/lib/docker/volumes# docker volume ls DRIVER VOLUME NAME local badc300c2e02888929999ee56f2653983adc52a06b62e2b86f3a2ce6228b4ae4 local my-vol //查看指定容器卷详细信息 root@ubuntu:/var/lib/docker/volumes# docker volume inspect my-vol [ { "CreatedAt": "2021-09-26T08:17:59-07:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/my-vol/_data", "Name": "my-vol", "Options": {}, "Scope": "local" } ] //删除数据卷 docker volume rm my-vol

03绑定数据卷

定义好数据卷后,即可以创建一个使用这个数据卷的容器,下面 nginx为例,将数据卷绑定到容器中。将本地的my-vol数据卷挂载到/usr/share/nginx/html目录下。

root@ubuntu:/var/lib/docker/volumes# docker run -it --name=test-nginx -p 80:80 -v local-test-vol:/usr/local/nginx/html nginx

绑定完成后可以通过inspect命令来查看是否绑定成功。​​​​​​​

root@ubuntu:/var/lib/docker/volumes/local-test-vol/_data# docker inspect testnginx //inspect命令可以看到以下内容,由于内容比较多,所以只摘起核心内容 "HostConfig": { "Binds": [ //这是绑定的数据卷信" local-test-vol:/usr/local/nginx/html" //这是挂载点的信息 "Mounts": [{"Type": "volume","Name": "local-test-vol","Source": "/var/lib/docker/volumes/local-test-vol/_data","Destination": "/usr/local/nginx/html","Driver": "local","Mode": "z","RW": true,"Propagation": ""}]

接下来在本地目录/var/lib/docker/volumes/local-test-vol数据卷就可以与容器中

的/usr/local/nginx/html目录进行同步数据,进而达到持久化的效果。即不管是在本地数据卷中还是容器中的/usr/local/nginx/html目录中进行修改文件,两个目录的信息都可以互通。

即使如果容器停止了,我们在本地更新文件,再将容器启动也可以实现数据同步。

04Dockerfile添加数据卷

除了使用-v选项来添加数据卷之外,也可以使用Dockerfile文件中的VOLUME命令来创建一个带数据卷的镜像。VOLUME 指令创建具有指定名称的挂载点,并将其标记为保存来自本地主机或其他容器的外部安装的数据卷。该值可以是 JSON 数组,VOLUME ["/var/log/"],也可以是带有多个参数的纯字符串,例如 VOLUME /var/log 或 VOLUME /var/log /var/db。

使用Dockerfile创建带数据卷的镜像步骤如何下:

1)创建一个Dockerfile文件

任意一个目录下创建一个Dockerfile文件,Dockerfile文件内容如下:​​​​​​​

FROM alpine:3.14 //设置容器内的数据卷 VOLUME ["/var/html"] EXPOSE 80

2)使用build命令进行构建镜像​​​​​​​

root@ubuntu:/home/test# docker build -t nginx:v1.0 . Sending build context to Docker daemon 8.65MB Step 1/3 : FROM alpine:3.14 3.14: Pulling from library/alpine a0d0a0d46f8b: Pull complete Digest: sha256:e1c082e3d3c45cccac829840a25941e679c25d438cc8412c2fa221cf1a824e6a Status: Downloaded newer image for alpine:3.14 ---> 14119a10abf4 Step 2/3 : VOLUME ["/var/html"] ---> Running in baa52a8c37bd Removing intermediate container baa52a8c37bd ---> 83ba81539ce7 Step 3/3 : EXPOSE 80 ---> Running in b0b0efd15aa3 Removing intermediate container b0b0efd15aa3 ---> d10277ba6308 Successfully built d10277ba6308 Successfully tagged nginx:v1.0
root@ubuntu:/home/test# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx v1.0 d10277ba6308 23 minutes ago 5.6MB nginx latest ad4c705f24d3 2 weeks ago 133MB alpine 3.14 14119a10abf4 4 weeks ago 5.6MB 其中nginx标签为v1.0的是我们使用Dockerfile新建的镜像

使用inspect命令可以查看该镜像的详细信息,在该镜像的详细信息中可以看到数据卷的信息。​​​​​​​

root@ubuntu:/home/test# docker inspect d10277ba6308 "Volumes": { "/var/html": {} },

3)使用刚创建的镜像创建并运行一个容器​​​​​​​

//创建一个容器,用的镜像为Dockerfile文件创建的镜像 root@ubuntu:/home/test# docker run -it --name nginx-v1.0 d10277ba6308 //查看创建容器的详细信息 root@ubuntu:/home/test# docker inspect nginx-v1.0

05数据卷容器

如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。

1)创建一个父容器

创建方法跟之前类似;

2)再创建一个容器,并使用volumes-from选项来创建一个依赖于父容器的容器。​​​​​​​

//创建一个依赖容器 root@ubuntu:/var/lib/docker/volumes# docker run -it --name nginx-dc2 --volumesfrom test-nginx nginx //查看刚创建的容器详细信息 root@ubuntu:/home/test# docker inspect 41530b76bebf //可以看到会自动继承挂载的信息 "Mounts": [ { "Type": "volume", "Name": "local-test-vol", "Source": "/var/lib/docker/volumes/local-test-vol/_data", "Destination": "/usr/local/nginx/html", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ]

挂载数据卷完成后,在父容器test-nginx或继承容器nginx-dc2中的任意一个容器更新、删除文件,都可以同步到另外一个容器中

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询