Docker容器数据卷详解
文章目录
- 1. 数据卷介绍
- 2. 简单使用
- 3. MySQL容器建立数据卷同步数据
- 4. 常用命令
- 5. 具名挂载和匿名挂载
- 5.1 匿名挂载
- 5.2 具名挂载
- 6. Dockerfile中设置数据卷
- 7. 容器数据卷
1. 数据卷介绍
Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用卷。|
卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
数据卷的特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
2. 简单使用
运行容器,指定挂载数据卷命令:
docker run -it -v 主机目录:容器目录
将主机目录/home/test和容器/home建立数据卷,首先在容器目录下创建test.java文件,再去主机目录下查看是否有该文件。
查看容器对应元数据docker inspect 容器id
,可以在Mounts节点查看建立的数据卷信息。
即使容器停止运行或者容器删除,仍然可以实现数据同步,本地的数据卷不会丢失。
3. MySQL容器建立数据卷同步数据
在Linux下的MySQL默认的数据文档存储目录为/var/lib/mysql,默认的配置文件的位置/etc/mysql/conf.d,为了确保MySQL镜像或容器删除后,造成的数据丢失,下面建立数据卷保存MySQL的数据和文件。
docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker images;
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 1.0 f189aac861de About an hour ago 653MB
mysql 5.7 f07dfa83b528 6 days ago 448MB
tomcat latest feba8d001e3f 10 days ago 649MB
nginx latest ae2feff98a0c 12 days ago 133MB
centos latest 300e315adb2f 2 weeks ago 209MB
portainer/portainer latest 62771b0b9b09 5 months ago 79.1MB
elasticsearch 7.6.2 f29a1ee41030 9 months ago 791MB
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
72efdb845471b6bd19077b596af51122baa982c01211c39f989afaca556b149f
[root@iZwz99sm8v95sckz8bd2c4Z home]# cd /home
[root@iZwz99sm8v95sckz8bd2c4Z home]# ls
hai mysql pan test test.java
[root@iZwz99sm8v95sckz8bd2c4Z home]# cd mysql/conf
[root@iZwz99sm8v95sckz8bd2c4Z conf]# ls
[root@iZwz99sm8v95sckz8bd2c4Z conf]# cd /home/mysql/data
[root@iZwz99sm8v95sckz8bd2c4Z data]# ls
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem
[root@iZwz99sm8v95sckz8bd2c4Z data]# ls
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem test
如果使用配置的密码连接mysql服务失败,原因很大可能是本机挂载的配置文件中已有文件,将容器中的配置给覆盖了,我们将相应的本机文件中的文件配置删除即可.
4. 常用命令
(1)创建数据卷
docker volume create my-vol
(2)查看所有的数据卷
$ docker volume ls
local my-vol
(3)查看指定数据卷的信息
$ docker volume inspect my-vol
[
{"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
(4)删除数据卷 docker volume rm ...
$ docker volume rm my-vol
(5)删除容器之时删除相关的卷
$ docker rm -v ...
数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷 。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。
无主的数据卷可能会占据很多空间,要清理请使用以下命令
$ docker volume prune
(5)使用 --mount创建数据卷
挂载一个主机目录作为数据卷。使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去。
$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp
python app.py
上面的命令挂载主机的/src/webapp目录到容器的/opt/webapp目录。用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。
Docker 挂载主机目录的默认权限是读写 ,用户也可以通过添加readonly 参数指定为只读 。
$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp:ro \
--mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
training/webapp \
python app.py
加了readonly之后,就挂载为只读了。如果你在容器内/src/webapp目录新建文件,会显示如下错误
/src/webapp # touch new.txt
touch: new.txt: Read-only file system
5. 具名挂载和匿名挂载
5.1 匿名挂载
匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹。
如下运行并匿名挂载Nginx容器:
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx
d3a27b969d122d5516cac75e99b17dff7aaaf1e0c042385c6b05990053f1259
查看所有的数据卷volume的情况, VOLUME NAME这里的值是真实存在的目录。
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker volume ls
DRIVER VOLUME NAME
local 0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26
local 668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956
local e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a
5.2 具名挂载
具名挂载,就是指定文件夹名称,区别于指定路径挂载,这里的指定文件夹名称是在Docker指定的默认数据卷路径下的。通过docker volume ls
命令可以查看当前数据卷的目录情况。
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
4ceaff19e5275dcd3014a8e7a8af618f7f7ce0da18d605c7c41a8653e78bf912
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker volume ls
DRIVER VOLUME NAME
local 0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26
local 668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956
local e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a
local juming-nginx
查看指定的数据卷信息的命令:docker volume inspect数据卷名称
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker volume inspect juming-nginx
[{"CreatedAt": "2020-12-29T22:40:25+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data","Name": "juming-nginx","Options": null,"Scope": "local"}
]
可以看到主机数据卷挂载在/var/lib/docker/volumes/juming-nginx/_data上
Docker所有的数据卷默认在/var/lib/docker/volumes/ 目录下
[root@iZwz99sm8v95sckz8bd2c4Z volumes]# ls
0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26 backingFsBlockDev juming-nginx
668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956 e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a metadata.db
匿名挂载,具名挂载,指定路径挂载的命令区别如下:
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
指定数据卷映射的相关参数:
ro —— readonly 只读。设置了只读则只能操作宿主机的路径,不能操作容器中的对应路径。
rw ----- readwrite 可读可写
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
6. Dockerfile中设置数据卷
我们可以在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。
下面使用Dockerfile构建一个新的镜像,dockerfile01文件的内容,匿名挂载了volume01和volume02两个目录:
FROM centosVOLUME ["volume01","volume02"]CMD echo "----end----"
CMD /bin/bash
执行构建镜像
[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile01 -t ethan/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]---> Running in 215ef28fd5a6
Removing intermediate container 215ef28fd5a6---> f506ddf133d2
Step 3/4 : CMD echo "----end----"---> Running in 62a1c4b9dc7b
Removing intermediate container 62a1c4b9dc7b---> bbea81a6e94e
Step 4/4 : CMD /bin/bash---> Running in 245d239f3776
Removing intermediate container 245d239f3776---> 1df90e6fd790
Successfully built 1df90e6fd790
Successfully tagged ethan/centos:1.0
[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ethan/centos 1.0 1df90e6fd790 13 minutes ago 209MB
mytomcat 1.0 f189aac861de 25 hours ago 653MB
mysql 5.7 f07dfa83b528 7 days ago 448MB
tomcat latest feba8d001e3f 11 days ago 649MB
nginx latest ae2feff98a0c 13 days ago 133MB
centos latest 300e315adb2f 3 weeks ago 209MB
portainer/portainer latest 62771b0b9b09 5 months ago 79.1MB
elasticsearch 7.6.2 f29a1ee41030 9 months ago 791MB
完成镜像的生成后,启动自己生成的容器
[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker run -it 1df90e6fd790 /bin/bash
[root@828d43dba78e /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Dec 29 15:41 dev
drwxr-xr-x 1 root root 4096 Dec 29 15:41 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 111 root root 0 Dec 29 15:41 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Dec 29 15:41 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
drwxr-xr-x 2 root root 4096 Dec 29 15:41 volume01
drwxr-xr-x 2 root root 4096 Dec 29 15:41 volume02
可以看到自动挂载的数据卷目录。下面查看对应宿主机的数据卷目录
[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker inspect 828d43dba78e
[{"Id": "828d43dba78ecaa10e7e57c1091ee8cf3581dae88187aa04163946dfc86bfd76","Created": "2020-12-29T15:41:29.297091075Z","Path": "/bin/bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 1719,"ExitCode": 0,"Error": "","StartedAt": "2020-12-29T15:41:34.107755138Z","FinishedAt": "0001-01-01T00:00:00Z"},
...
#重点:"Mounts": [{"Type": "volume","Name": "c51c75b11a69c526a97a07b03ce2ec74d8e77aa150b736291777c1c204a8aecc","Source": "/var/lib/docker/volumes/c51c75b11a69c526a97a07b03ce2ec74d8e77aa150b736291777c1c204a8aecc/_data","Destination": "volume01","Driver": "local","Mode": "","RW": true,"Propagation": ""},{"Type": "volume","Name": "1ae2d34c56c4352ba906b5bc261706b235a07ca2b3c9df6c612bb4380db8983f","Source": "/var/lib/docker/volumes/1ae2d34c56c4352ba906b5bc261706b235a07ca2b3c9df6c612bb4380db8983f/_data","Destination": "volume02","Driver": "local","Mode": "","RW": true,"Propagation": ""}],
可以看到Mounts下有宿主机的挂载目录。因为dockerfile中没有指定宿主机目录,所以属于匿名挂载,在/var/lib/docker/volumes/目录下生成了随机命名的路径。
7. 容器数据卷
容器数据卷是指建立数据卷,来同步多个容器间的数据,实现容器间的数据同步。
首先启动容器1,volume01、volume02为挂载目录。
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it --name cnetos01 ethan/centos:1.0
[root@731d53b8c3d5 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
然后启动容器2,通过参数--volumes-from
,设置容器2和容器1建立数据卷挂载关系。
[root@iZwz99sm8v95sckz8bd2c4Z /]# docker run -it --name centos02 --volumes-from cnetos01 ethan/centos:1.0
[root@7f90d4147511 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Dec 30 14:58 dev
drwxr-xr-x 1 root root 4096 Dec 30 14:58 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 108 root root 0 Dec 30 14:58 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Dec 29 15:41 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
drwxr-xr-x 2 root root 4096 Dec 30 14:54 volume01
drwxr-xr-x 2 root root 4096 Dec 30 14:54 volume02
首先在容器2中的volume01中添加文件
[root@7f90d4147511 /]# cd volume01
[root@7f90d4147511 volume01]# touch test.java
[root@7f90d4147511 volume01]# ls
test.java
然后就可以看到容器1的文件也会添加上了
下面同步两个MySQL的数据库和配置文件,与上面的操作相同,首先建立数据卷,然后给另一个MySQL容器建立容器数据卷挂载,示例:
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker run -d -p 6604:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
Docker容器数据卷详解相关推荐
- Marco's Java【Docker入门(四) 之 Dockerfile容器数据卷详解】
前言 咱们上节已经接触过Dockerfile并使用Dockerfile创建容器数据卷,但是Dockerfile的作用远远不止如此! 因此本节会更深入的了解Dockerfile以及它的诸多使用方式, & ...
- Docker系列 五.Docker容器数据卷
五.Docker容器数据卷 环境&工具: 阿里云轻量级服务器.CentOS 7系统.FinalShell(其他连接客户端也可以) 是什么 docker的理念将运行的环境打包形成容器运行,运行可 ...
- Docker——Docker 容器数据卷(Volumes)
Docker 容器数据卷 容器数据卷(Volumes) 容器数据卷概述 使用数据卷 实现mysql数据同步 具名挂载和匿名挂载 匿名挂载 具名挂载 DockerFile里写Volumes配置 多个数据 ...
- 【Docker】7、数据卷详解:具名挂载、匿名挂载、初识DockerFile、数据卷容器
1.什么是容器数据卷? docker的理念回顾 将应用和环境打包成一个镜像! 如果数据都在容器中,那么容器删除,数据就会丢失!需求:数据可以持久化.如:MySQL,容器删除了,MySQL数据可以存储在 ...
- docker容器数据卷基本操作
在实际运用中,如果使用docker部署应用的时候,有这么一种情况,需要有个位置可以同步docker容器上的数据到服务器上,更通俗点讲,我们需要在服务器上开启一个位置,这个位置可以连接docker容器中 ...
- Docker容器数据卷讲解
概述 为什么Docker需要容器数据卷技术:如果没有数据卷技术,比如一个由mysql镜像创建运行的容器,产生的数据就会保存在容器中,数据的生命周期与容器的生命周期一致,如果删除了该容器,相应的数据也会 ...
- Docker 学习之 Docker 容器数据卷
容器数据卷 什么是容器数据卷 docker 理念回顾 将应用和环境打包成一个镜像! 问题:数据?如果数据都在容器中,那么我们删除容器,数据就会丢失!需求:数据可以持久化! 容器之前可以有一个数据共享技 ...
- 【Docker学习笔记 五】深入理解Docker容器数据卷机制
前几篇Blog是对Docker的一个入门和初识,本篇Blog开始就详细学习下一个新的理论基础概念:Volume,也就是容器数据卷,听起来名字高大上,实际上就是一个宿主机的目录而已,为什么需要容器数据卷 ...
- Docker容器数据卷
容器数据卷 什么是容器卷 docker是要将应用和环境打包成一个镜像 这样,数据就不应该在容器中,否则容器删除,数据就会丢失,这就是删库跑路 故容器之间要有一个数据共享技术 在Docker容器中产生的 ...
最新文章
- 弄懂“进程”(上):3个组成部分、4个基本特征、4个基本状态
- 第拾壹章學習 Lisp 3rd Edition, Winston Horn
- 第7周实践项目1.1 环形队列中用队尾和队的元素个数来实现队列的算法库
- ACE前摄器Proactor模式
- CI持续集成系统环境---部署Gitlab环境完整记录
- 基于VHDL自动售邮票机设计
- mysql 优化配置 大批量数据插入_MYSQL开发性能研究——批量插入的优化措施
- 单片机上运行linux程序代码,在Linux下烧录51单片机
- python没有上方工具栏_PyQt5快速上手基础篇8-菜单栏、工具栏和状态栏
- 在机器学习中,ground truth是什么意思?
- k8s高可用集群多个主节点_k8s-高可用集群实现(keepalived)
- 【Flink】大数据分析常用去重算法分析『HyperLogLog 篇』
- 栈的应用 算术表达式转换为后缀表达式
- 三菱Q系列ST、结构化编程、QD77定位以及转矩模式切换案例 三菱PLC程序案例
- java毕业设计万科集团社区管理系统mybatis+源码+调试部署+系统+数据库+lw
- y的花式写法_26个字母的花式写法,总有一个你喜欢哒
- 使用Mybatis相关类生成sql语句
- Ubuntu16.04 1660ti显卡驱动安装
- V853 替换开机启动LOGO
- SpringCloud+SpringCloudAlibaba
热门文章
- 吴恩达ex3_[Coursera] Machine Learning ex3 多元分类和神经网络 步骤分析
- Facebook广告:PPE广告有哪些不同之处
- 实验4 Bp算法实现
- texearea 限制字数_实现textarea限制输入字数
- 拒绝软银收购选择IPO 亏损收窄的Wework未来发展会如何?
- 三酷猫学python_酷猫电视(CIBN酷喵影视官网)
- python从txt中批量读取图片名后将图片另存为
- 【毕业设计】基于stm32的智能水杯(恒温控制 饮水杯) - 单片机 物联网 嵌入式
- 百年奥运的相觑之温:尔疆我界,咫尺相见— 阿里云视频云「Cloud ME」
- [转载]从零开始学习OpenGL ES之八 – 交叉存取顶点数据