容器数据卷
概述
在Docker中,我们可以将应用和环境打包成一个镜像,如果我们将容器删除,那么容器中产生的数据也会消失,那么容器产生的数据该怎么进行持久化处理呢?再者,Docker中每个容器之间是相互隔离的,那么容器之间又怎么共享数据呢?这就需要容器数据卷技术了。
通过数据卷技术,我们能够实现容器的持久化和同步操作,容器之间也是能够实现数据共享。
使用数据卷
方式一
直接使用命令进行挂载 -v
docker run -it -v 主机目录:容器内目录 name bash
-v 卷名:容器内目录
-v 容器内目录
类似于主机目录和容器目录做了一个双向映射,其本质上都是指向同一个磁盘地址。所以挂载之后,不论容器是启动还是关闭,数据都会同步。
具名挂载和匿名挂载
#匿名挂载
#-v 只写了容器内的目录,没有写容器外的目录
docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看所有卷状态
docker volume ls
DRIVER VOLUME NAME
local dbee2eea315528a120cc592c1773c42163162bf473933a6d4d43a83c81738020
#具名挂载
#-v 卷名:容器内目录
docker run -d -P --name nginx01 -v juming:/etc/nginx nginx
DRIVER VOLUME NAME
local dbee2eea315528a120cc592c1773c42163162bf473933a6d4d43a83c81738020
local juming
所有Docker容器内的卷,在没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data
下。
卷权限
#权限可分为
ro (readonly)
rw (readwrite)(默认)
#容器内不可修改,只能通过宿主机修改
docker run -d -P --name nginx01 -v /etc/nginx:ro nginx
docker run -d -P --name nginx01 -v /etc/nginx:rw nginx
方式二
使用Dockerfile进行挂载。
Dockerfile就是用来构建Docker镜像的构建文件,是一个命令脚本。
#dockerfile1
#每个命令都是镜像的一层
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "------end------"
CMD /bin/bash
#构建镜像
docker build -f dockerfile1 -t test/ubuntu .
#运行镜像
docker run -it id /bin/bash
#查看挂载信息
docker inspect id
"Mounts": [
{
"Type": "volume",
"Name": "55e52519c7822b2493fec1f0303121ace3577aad1eab934d6d8b818fff69b656",
"Source": "/var/lib/docker/volumes/55e52519c7822b2493fec1f0303121ace3577aad1eab934d6d8b818fff69b656/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "23712dacbc2e58c800e9a22cde6578dd07eac38b7390363f23ee9560901ebb76",
"Source": "/var/lib/docker/volumes/23712dacbc2e58c800e9a22cde6578dd07eac38b7390363f23ee9560901ebb76/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
数据卷容器
两个或多个容器实现数据共享,通过--volume-from
命令。
#启动第一个镜像
docker run -it --name docker01 test/ubuntu
#启动第二个镜像
docker run -it --name docker02 --volumes-from docker01 ubuntu:15.10
#查看文件
ls
bin dev home lib64 mnt proc run srv tmp var volume02
boot etc lib media opt root sbin sys usr volume01
#可以看到同样有volume01和volume02
只要有一个容器在使用数据,数据就不会丢失。数据卷容器可以实现容器之间配置信息的传递,它生命周期一直持续到没有容器使用为止。
参考文章