Docker(一)
Docker(二)
Docker(三)
Docker(四)
Docker(五)
Docker(六)
Docker(七)
Docker(八)
容器数据卷
什么是容器数据卷
数据如果都在容器中,若容器删除则数据丢失。
需求:数据持久化,容器之间可以有一个数据共享的技术
Docker容器中产生的数据,同步到本地,就是卷技术。
说白了就是目录的挂载,将容器的目录挂载到Linux上。
总结一句话:容器的持久化和同步操作,容器间也是可以数据共享的
使用数据卷
方式一:直接使用命令挂载 -v
方式二:通过便携脚本,在生成镜像时就进行挂载
docker run -it -v -P主机端口,容器内端口
# 举例
docker run -it -v /home/ceshi:/home centos /bin/bash
# 将虚拟机中国的home/ceshi与本地/home同步,当虚拟机或本地数据发生变化时,另一端数据也会发生变化(双向绑定)。但是如果虚拟机删除了数据,本地并不会将数据删除。
好处:以后只需要在本地修改数据即可,容器内会自动同步。如果虚拟机删除了数据,本地并不会将数据删除。
具名和匿名挂载
# 匿名挂载
#通过 -v 容器内路径 指令进行挂载
# 举例
docker run -d -P --name nginx01 -v /ect/nginx nginx
# 查看所有卷的情况
docker volume ls
# 这里发现ls打印出来的信息都是如下样式,这种就是匿名挂载,其中挂载的名称为乱码的一传字符串,并且只写了容器内的路径,没有容器外的路径,如下:
local xxxxxxxxx
local xxxxxxxxx
# 查看详细信息
docker volume inspect
# 具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 通过docker volume ls 发现打印的是如下:
DRIVE VOLUME NAME
local juming-nginx
# 通过-v 卷名:容器内路径 进行具名挂载
# 查看一下具体卷
docker volume inspect juming-nginx
- 所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes目录下,
/var/lib/docker/volumes/*******(卷名)/_data------>具体路径 - 我们通过具名挂载可以方便地找到我们的一个卷,大多数情况下我们用的都是具名挂载。
如何确定是具名挂载还是匿名挂载,还是只从路径挂载:
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载
拓展:
# ro readonly # 只读
# rw readwrite #可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# 一旦设定了容器的访问权限,容器对我们挂载出来的内容就有限定了
# ro 只要看到ro,就说明只能通过宿主机去操作,容器内部无法操作
初识Dockerfile
Dockerfile就是用来构建docker镜像的构建文件。实际上就是一端命令脚本,通过脚本可以生成一个镜像。
镜像是一层一层的,所以脚本也是一个一个的命令,每个命令都是一层
# 创建一个dockerfile 文件,名字可以随机,建议Dockerfile
# 文件中的内容,指令都是大写 ,参数;例如:
FROM centos
VOLUME ["volume01","volume02"] # 生成的是匿名挂载
CMD echo "----end----"
CMD /bin/bash
# 这里的每个命令就是镜像的一层
# 执行该命令生成一个新的镜像
docker build -f /home/docker-test-volume/dockerfile1 -t proger/centos:1.0 .
docker images
# 输出:
REPOSITORY TAG IMAGE_ID CREATED SIZE
proger/centos 1.0 5d04f189a434 22 seconds age 237MB
数据卷容器
例如:多个mysql同步数据
- 当父容器被删除,预期数据共享的容器数据依旧存在(数据双向拷贝的概念)
- 结论:容器之间配置信息的传递,数据卷容器的说明周期一直持续到没有容器使用为止,但是一旦持久到本地,本地的数据是不会删除的。