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

相关推荐
Wwwilling1 小时前
docker中怎么把docker中的python package转成conda,目前还没有conda
python·docker·conda
struggle20252 小时前
AWS Bedrock 多代理蓝图存储库使用 CDK、Streamlit 和 LangFuse 运行 AWS Bedrock 多代理 AI 协作的蓝图
运维·人工智能·自动化·云计算·aws
IEVEl2 小时前
CentOS 7 安装 EMQX (MQTT)
linux·运维·centos
小小的测试一下2 小时前
业务流程先导及流程图回顾
功能测试·软件工程
vortex52 小时前
深入理解 Linux 文件权限:从 ACL 到扩展属性,解剖底层技术细节与命令应用
linux·运维·服务器
BTU_YC2 小时前
Cannot find a valid baseurl for repo: centos-sclo-sclo/x86_64
linux·运维·centos·php
大王10242 小时前
在 CentOS 系统中开机自动执行 Shell 脚本
linux·运维·centos
IT小馋猫2 小时前
CentOS 7 宝塔部署
linux·运维·centos
FIT2CLOUD飞致云3 小时前
1Panel MCP Server发布,开启AI对话式运维新时代!
运维·开源
古希腊掌握嵌入式的神3 小时前
[Linux]解决虚拟机 ubantu系统下网络的问题
linux·运维·服务器