涨薪技术|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]

//创建一个自宝义容器卷root@ubuntu:/var/lib/docker/volumes# docker volume create my-vol//查看所有容器卷root@ubuntu:/var/lib/docker/volumes# docker volume lsDRIVER VOLUME NAMElocal badc300c2e02888929999ee56f2653983adc52a06b62e2b86f3a2ce6228b4ae4local 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@uuntu:/var/lib/docker/volumes# docker run -it --name=test-nginx -p 80:80 -vlocal-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.65MBStep 1/3 : FROM alpine:3.143.14: Pulling from library/alpinea0d0a0d46f8b: Pull completeDigest: sha256:e1c082e3d3c45cccac829840a25941e679c25d438cc8412c2fa221cf1a824e6aStatus: Downloaded newer image for alpine:3.14---> 14119a10abf4Step 2/3 : VOLUME ["/var/html"]---> Running in baa52a8c37bdRemoving intermediate container baa52a8c37bd---> 83ba81539ce7Step 3/3 : EXPOSE 80---> Running in b0b0efd15aa3Removing intermediate container b0b0efd15aa3---> d10277ba6308Successfully built d10277ba6308Successfully tagged nginx:v1.0​​​​​​​

root@ubuntu:/home/test# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx v1.0 d10277ba6308 23 minutes ago 5.6MBnginx latest ad4c705f24d3 2 weeks ago 133MBalpine 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 --volumesfromtest-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中的任意一个容器更新、删除文件,都可以同步到另外一个容器中。

相关推荐
XIAOHEZIcode10 小时前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220701 天前
如何搭建本地yum源(上)
运维
武子康1 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn864 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
许彰午4 天前
39_Java单元测试JUnit入门
java·junit·单元测试