Docker 容器的数据管理

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 文章首发于公众号《程序员果果》地址:https://mp.weixin.qq.com/s/DzF-ZwaY4QtlgM32I5wybg 一、容器的数据卷 1. 什么是数据卷? docker的理念之一就是将应用和运行的环境打包,因此docker容器的生存周期通常都是与在容器中运行的程序相同的,而我们对数据的要求是持久化,docker容器之间也需要一个共享数据的渠道。

文章首发于公众号《程序员果果》
地址:https://mp.weixin.qq.com/s/qg8eXHobNxzfPAaHB3U9cw

一、容器的数据卷

1. 什么是数据卷?

docker的理念之一就是将应用和运行的环境打包,因此docker容器的生存周期通常都是与在容器中运行的程序相同的,而我们对数据的要求是持久化,docker容器之间也需要一个共享数据的渠道。这些需求就催生了docker数据卷的诞生。

docker数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或多个容器提供访问。

数据卷设计的目的,在于数据的永久化,它完全独立于容器的生命周期。因此,docker不会在容器删除时删除其挂在的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据进行处理

2. 数据卷的特点

  • docker数据卷独立于docker存在,与docker容器的生存周期分离。
  • 存在于宿主机(docker host)中。
  • docker数据卷,可以是目录,也可以是文件。
  • docker容器可以利用数据卷技术与宿主机进行数据共享。

3. 数据卷的特点

  • 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中。
  • 数据卷可以在容器之间共享和重用。
  • 可以对数据卷里的内容直接进行修。
  • 数据卷的变化不会影响镜像的更新。
  • 即使挂载数据卷的容器已经被删除,卷也会一直存在。

4. 数据卷的使用方法

#为容器添加数据卷使用-v选项
docker run -v ~/container_data:/data -it IMAGE /bin/bash

容器中


root@311b7376b879:/# ls  
bin  boot  data  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@311b7376b879:/# cd data/
root@311b7376b879:/data# echo "hi , what's up man ?" > hi.txt

宿主机

huanchu-mbp:~ huanchu$ docker run -it -d -v ~/Documents/ttt:/data --name test1 nginx /bin/bash
huanchu-mbp:~ huanchu$ cat Documents/ttt/hi.txt 
hi , what's up man ?

5. 数据卷添加访问权限

挂载的数据默认为可读写权限。
但也可以根据自己的需求,将容器里挂载共享的数据设置为只读,这样数据修改就只能在宿主机上操作,用法如下:

#ro:指定为只读。
docker run -it -v ~/datavolume:/data:ro ubuntu /bin/bash

6. 使用Dockerfile创建包含数据卷的镜像

Dockerfile指令:
​    VOLUME [ "/data"]

在Dockerfile中 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的

Dockerfile

# Version: 0.0.1
FROM ubuntu:latest 
VOLUME ["/data/volume1","/data/volume2"]
RUN apt-get update RUN apt-get install -y nginx 
RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html
EXPOSE 80

构建镜像

docker build -t="mynginx2" .

启动容器

docker run -it --name mynginx_test mynginx2

查看数据卷

root@e22ae166d8fa:/# ls
bin  boot  data  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@e22ae166d8fa:/# cd data/
root@e22ae166d8fa:/data# ls
volume1  volume2
root@e22ae166d8fa:/data# 

查看主机挂载点

我们通过docker inspect 查看通过该dockerfile创建的镜像生成的容器,可以看到如下信息:

可以看到两个挂载点的信息。

"Mounts": [
            {
                "Type": "volume",
                "Name": "596925f444bbcb7d3b75c3b844700ce8f43bd5fc8b18bb97f323e2825a1df13e",
                "Source": "/var/lib/docker/volumes/596925f444bbcb7d3b75c3b844700ce8f43bd5fc8b18bb97f323e2825a1df13e/_data",
                "Destination": "/data/volume1",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "0a28aed7c33a588dd74ce008d78670a5ff01dbea17e659597ebd5506bf8824cb",
                "Source": "/var/lib/docker/volumes/0a28aed7c33a588dd74ce008d78670a5ff01dbea17e659597ebd5506bf8824cb/_data",
                "Destination": "/data/volume2",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }

二、数据卷容器

1. 什么是数据卷容器?

命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器。

2. 构建一个数据卷容器

huanchu-mbp:Documents huanchu$ docker run -it -v ~/Documents/ttt:/data --name container_data ubuntu
root@832301c940b6:/# ls
bin  boot  data  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@832301c940b6:/# cd data/
root@832301c940b6:/data# ls
Dockerfile  com  hi.txt
root@832301c940b6:/data# echo      
Dockerfile  com/        hi.txt      
root@832301c940b6:/data# echo 
Dockerfile  com/        hi.txt      
root@832301c940b6:/data# echo "ha ha ha !" > ha.txt
root@832301c940b6:/data# ls
Dockerfile  com  ha.txt  hi.txt

3. 挂载数据卷容器的方法

docker run --volumes-from [container name]

创建一个新的容器,并挂载刚才创建的数据卷容器 container_data

huanchu-mbp:Documents huanchu$ docker run -it --name ubuntu_test --volumes-from container_data ubuntu /bin/bash
root@1d6b918c00e5:/# ls
bin  boot  data  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@1d6b918c00e5:/# cd data/
root@1d6b918c00e5:/data# ls
Dockerfile  com  ha.txt  hi.txt
root@1d6b918c00e5:/data# cat ha.txt 
ha ha ha !
root@1d6b918c00e5:/data# 

使用inspect命令查看挂载细节

"Mounts": [
            {
                "Type": "bind",
                "Source": "/Users/huanchu/Documents/ttt",
                "Destination": "/data",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ]

三、数据卷的备份和还原

数据卷数据备份

方法

docker run --volumes-from [container name] -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar

例如

docker run --volumes-from container_data -v ~/Documents/ttt:/backup --name ubuntu_test1 ubuntu tar cvf /backup/ubuntu_test1.tar /data

在宿主机上可以查看到备份的数据

huanchu-mbp:ttt huanchu$ ls -l
total 1272
-rw-r--r--  1 huanchu  staff     191 12 24 15:48 Dockerfile
drwxr-xr-x  3 huanchu  staff      96 12 12 14:45 com
-rw-r--r--  1 huanchu  staff      11 12 24 17:04 ha.txt
-rw-r--r--  1 huanchu  staff      21 12 24 14:26 hi.txt
-rw-r--r--  1 huanchu  staff  593920 12 24 18:09 ubuntu_test1.tar

数据卷数据还原

方法

docker run --volumes-from [container name] -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar

例如

#第一步
docker run -v ~/Documents/ttt:/data --name ubuntu_test2 ubuntu tar xvf /data/ubuntu_test1.tar
#第二步
docker run -it --volumes-from ubuntu_test2 --name ubuntu_test3 ubuntu /bin/bash
相关实践学习
MySQL基础-学生管理系统数据库设计
本场景介绍如何使用DMS工具连接RDS,并使用DMS图形化工具创建数据库表。
相关文章
|
15天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
3天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
23 6
|
3天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
13 5
|
3天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
22 3
|
3天前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
14 2
|
8天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
36 5
|
11天前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。
|
9天前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
9天前
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
25 1
|
15天前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用