涨薪技术|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中的任意一个容器更新、删除文件,都可以同步到另外一个容器中。

相关推荐
吴声子夜歌10 分钟前
Nginx应用与运维——Nginx Web服务应用实战(Python网站的搭建)
运维·前端·nginx
梦想不只是梦与想11 分钟前
Docker 常用命令
docker
wzq11_66618 分钟前
Kubernetes集群——Pod篇
云原生·容器·kubernetes
资深技术分享员24 分钟前
Geejing WebBuilder 数据库连接配置与在线 SQL 工具,运维的左右手
运维·数据库·sql·低代码
高山有多高29 分钟前
【Linux笔记】UpdSocket
linux·运维·笔记
皓月盈江38 分钟前
Linux系统grep、sed 、awk介绍下,使用方法及区别?
linux·运维·服务器·sed·grep·awk
云栖梦泽1 小时前
Linux内存管理
linux·运维·服务器
吴声子夜歌1 小时前
Nginx应用与运维——Nginx Web服务应用实战(静态文件服务器的搭建)
运维·前端·nginx
海宇服务1 小时前
零信任架构实战:基于海宇身份证OCR构建自动化自助终端核验网关
运维·人工智能·架构·自动化
ken22322 小时前
ubuntu 24.04, audacity 4 AppImage 加载 libavdevice.so.62 /.61 /.63 失败:依赖缺失?
linux·运维·ubuntu