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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Docker 容器的网络连接
文章首发于公众号《程序员果果》地址:https://mp.weixin.qq.com/s/DzF-ZwaY4QtlgM32I5wybg 一、Docker 容器的网络基础 docker0(Linux的虚拟网桥) 通过ifconfig查看docker0的网络设备,docker守护进程就是通过docker0为docker的容器提供网络连接的各种服务。 [root@localhost ~]# ifconfig docker0 docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::42:2fff:fe56:7b2e prefixlen 64 scopeid 0x20<link> ether 02:42:2f:56:7b:2e txqueuelen 0 (Ethernet) RX packets 27406 bytes 2657911 (2.5 MiB)...
- 下一篇
服务 Docker 化
文章首发于公众号《程序员果果》地址:https://mp.weixin.qq.com/s/DzF-ZwaY4QtlgM32I5wybg 一、简介 Docker的出现让容器化技术得以普及,更快的部署和维护与Spring Cloud的结合,能让我们不再像以前一样为了某一个模块的增加而服务器上大动干戈,还需要考虑环境的问题。在这一篇中会讲到 SpringCloud 项目 Docker 化 。 二、创建一个 SpringCloud 项目 创建一个springcloud项目 ,包含eureka-server、service-hi、service-ribbon。 1. eureka-server 项目 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7设置SWAP分区,小内存服务器的救世主