涨薪技术|Docker容器数据管理

发布时间:2026/7/27 17:59:13
涨薪技术|Docker容器数据管理 在生产环境中使用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]//创建一个自宝义容器卷 rootubuntu:/var/lib/docker/volumes# docker volume create my-vol //查看所有容器卷 rootubuntu:/var/lib/docker/volumes# docker volume ls DRIVER VOLUME NAME local badc300c2e02888929999ee56f2653983adc52a06b62e2b86f3a2ce6228b4ae4 local my-vol //查看指定容器卷详细信息 rootubuntu:/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-vol03绑定数据卷定义好数据卷后即可以创建一个使用这个数据卷的容器下面 nginx为例将数据卷绑定到容器中。将本地的my-vol数据卷挂载到/usr/share/nginx/html目录下。rootubuntu:/var/lib/docker/volumes# docker run -it --nametest-nginx -p 80:80 -v local-test-vol:/usr/local/nginx/html nginx绑定完成后可以通过inspect命令来查看是否绑定成功。​​​​​​​rootubuntu:/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 802)使用build命令进行构建镜像​​​​​​​rootubuntu:/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.0rootubuntu:/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命令可以查看该镜像的详细信息在该镜像的详细信息中可以看到数据卷的信息。​​​​​​​rootubuntu:/home/test# docker inspect d10277ba6308 Volumes: { /var/html: {} },3)使用刚创建的镜像创建并运行一个容器​​​​​​​//创建一个容器用的镜像为Dockerfile文件创建的镜像 rootubuntu:/home/test# docker run -it --name nginx-v1.0 d10277ba6308 //查看创建容器的详细信息 rootubuntu:/home/test# docker inspect nginx-v1.005数据卷容器如果用户需要在多个容器之间共享一些持续更新的数据最简单的方式是使用数据卷容器。数据卷容器也是一个容器但是它的目的是专门提供数据卷给其他容器挂载。1)创建一个父容器创建方法跟之前类似2)再创建一个容器并使用volumes-from选项来创建一个依赖于父容器的容器。​​​​​​​//创建一个依赖容器 rootubuntu:/var/lib/docker/volumes# docker run -it --name nginx-dc2 --volumesfrom test-nginx nginx //查看刚创建的容器详细信息 rootubuntu:/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中的任意一个容器更新、删除文件都可以同步到另外一个容器中