在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中.
Docker的数据持久化主要有两种方式:
- bind mount
- volume
1.bind mounts:意为着可以存储在宿主机系统的任意位置;(比较常用的方式)
bind mount自docker早期便开始为人们使用了,用于将host机器的目录mount到container中。但是bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。
将host机器上当前目录下的host-data目录mount到container中的/container-data目录:
docker run -d -p80:80 -v $(pwd)/host-data:/container-data nginx_centos2.Volume的基本使用
volume也是绕过container的文件系统,直接将数据写到host机器上,只是volume是被docker管理的,docker下所有的volume都在host机器上的指定目录下/var/lib/docker/volumes。
1.> 管理卷
# docker volume create host-data // 创建一个自定义容器卷
# docker volume ls // 查看所有容器卷
# docker volume inspect host-data // 查看指定容器卷详情信息2.> 通过docker run命令,创建使用指定卷的容器.
docker run -d -p80:80 -v host-data:/container-data nginx_centos其中,-v代表挂载数据卷,这里使用自定数据卷host-data,并且将数据卷挂载到 /container-data,如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。
Dockerfile中的VOLUME
通过dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。
通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
[root@localhost nginx]# cat Dockerfile
FROM centos:7
MAINTAINER saneri 838118461@
RUN yum install -y wget proc-devel net-tools gcc zlib zlib-devel make openssl-devel
#RUN wget http://nginx.org/download/nginx-1.9.7.tar.gz
RUN useradd -M -s /sbin/nologin nginx
# mount a dir to container
VOLUME ["/data"]
ADD nginx-1.9.7.tar.gz .
WORKDIR nginx-1.9.7
RUN ./configure --prefix=/usr/local/nginx && make && make install
EXPOSE 80
ENV PATH /usr/local/nginx/sbin:$PATH
CMD /bin/sh -c 'nginx -g "daemon off;"'
[root@localhost nginx]#我们通过docker inspect 查看通过该dockerfile创建的镜像生成的容器,可以看到如下信息
[root@localhost nginx]# docker inspect nginx_centos
"Mounts": [
{
"Type": "volume",
"Name": "d37d5b7ce8b00f53929063e7074ea8644d789f4a2b9c8a69f643c4a7c2f35218",
"Source": "/var/lib/docker/volumes/d37d5b7ce8b00f53929063e7074ea8644d789f4a2b9c8a69f643c4a7c2f35218/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],清理卷
如果不再使用自定义数据卷了,那么可以手动清理掉:
# docker stop nginx_centos // 暂停容器实例
# docker rm nginx_centos // 移除容器实例
# docker volume rm data // 删除自定义数据卷容器共享卷(挂载点)
docker run -d -p80:80 --name test1 nginx_centos上面命令中的 nginx_centos是用前面的dockerfile文件构建的镜像。 这样容器test1就有了/data挂载点。
下面我们创建另一个容器可以和test1共享 /data卷 ,这是在 docker run中使用 --volumes-from标记,如:
docker run --name test2 -d --volumes-from test1 nginx_centos上面的两个容器 test1 , test2 均有/data目录,且目录中内容是共享的,任何一个容器修改了内容,别的容器都能获取到。
数据盘管理
在删除容器时,docker默认不会删除其数据盘。
docker volume ls #查看数据盘
docker volume ls -f dangling=true #查看未被容器使用的数据盘
docker volume rm VOLUME NAME #删除数据盘如果想要删除容器时,同时删除掉其数据盘,那么可以使用-v参数。
# docker rm -v 容器名称
















