Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。
如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,此即”写时复制(COW copy on write)”机制。这个读写层就是容器的工作目录。
一、容器的数据管理介绍
Docker镜像是分层设计的,镜像层是只读的,通过镜像启动的容器添加了一层可读写的文件系统,用户写入的数据都保存在这一层中。
1.1 Docker容器的分层
容器的数据分层目录介绍
- LowerDir: image 镜像层,即镜像本身,只读
- UpperDir: 容器的上层,可读写,容器变化的数据存放在此处
- MergedDir: 容器的文件系统,使用Union FS(联合文件系统)将lowerdir 和 upperdir 合并完成后给容器使用,最终呈现给用户的统一视图
- WorkDir: 容器在宿主机的工作目录,挂载后内容会被清空,且在使用过程中其内容用户不可见
这些可以通过docker inspect命令查看。
1.2 容器数据持久保存方式
如果要将写入到容器的数据永久保存,则需要将容器中的数据保存到宿主机的指定目录。 Docker的数据类型分为两种:
- 数据卷(Data Volume): 直接将宿主机目录挂载至容器的指定的目录,此方式较常用
- 数据卷容器(Data Volume Container): 间接使用宿主机空间,数据卷容器是将宿主机的目录挂载至一个专门的数据卷容器,然后让其他容器通过数据卷容器读写宿主机的数据,此方式不常用
二、数据卷
2.1 数据卷的使用&特点
数据卷实际上就是宿主机上的目录或者是文件,可以被直接mount到容器当中使用。在实际生成环境中,需要针对不同类型的服务、不同类型的数据存储要求做相应的规划,最终保证服务的可扩展性、稳定性以及数据的安全性。
2.1.1 数据卷使用场景
数据库、日志输出、静态web页面、配置文件、共享目录/文件
2.1.2 数据卷的特点
- 数据卷是目录或者文件,并且可以在多个容器之间共同使用,实现容器之间共享和重用
- 对数据卷更改数据在所有容器里面会立即更新
- 数据卷的数据可以持久保存,即使删除使用该容器卷的容器也不影响
- 依赖于宿主机目录,宿主机出问题,上面容器会受影响,当宿主机较多时,不方便统一管理
- 匿名和命名数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,会拷贝到新初始化的数据卷中
2.1.3 数据卷分类
启动容器时,可以指定使用数据卷实现容器数据的持久化。数据卷有三种:
- 指定宿主机目录或文件: 指定宿主机的具体路径和容器路径的挂载关系,此方式不会创建数据卷
- 匿名卷: 不指定数据名称,只指定容器内目录路径充当挂载点,docker自动指定宿主机的路径进行挂载,此方式会创建匿名数据卷。Dockerfile中VOLUME指定的卷即为此种
- 命名卷: 指定数据卷的名称和容器路径的挂载关系,此方式会创建命名数据卷
2.1.4 数据卷使用方法
docker run 命令的以下格式可以实现数据卷:
-v,--volume=[host-src:]container-dest[:]
• ro 从容器内对此数据卷是只读,不写此项默认为可读可写
• rw 从容器内对此数据卷可读可写,此为默认值
方式1:
#指定宿主机目录或文件格式:
-v :[:ro] #将宿主机目录挂载容器目录,两个目录都可自动创建
方式2:
#匿名卷,只指定容器内路径,没有指定宿主机路径信息,宿主机自动生成/var/lib/docker/volumes//_data目录,并挂载至容器指定路径
-v
#示例:
docker run --name nginx -v /etc/nginx nginx镜像名
方式3:
#命名卷将固定的存放在/var/lib/docker/volumes//_data
-v :
#可以通过以下命令事先创建,如可没有事先创建卷名,docker run时也会自动创建卷
docker volume create
#示例:
docker volume create vol1 #也可以事先不创建
docker run -d -p 80:80 --name nginx01 -v vol1:/usr/share/nginx/html nginx
docker rm 的 -v 选项可以在删除容器时,同时删除相关联的匿名卷
#管理数据卷命令
docker volume COMMAND
Commands:
• create 创建数据卷
• inspect 列出一个或多个数据卷的详细信息
• ls 列出所有数据卷
• prune 删除所有未使用的本地数据卷
• rm 删除一个或多个数据卷
#查看容器的数据卷挂载关系
docker inspect --format="{{.Mounts}}" CONTAINER
#删除所有数据卷
docker volume rm `docker volume ls -q`
2.2 目录数据卷实战
#这里引用同一个数据卷目录,开启多个容器,实现多个容器共享数据
docker run -d -v /data/dockerfile/web/nginx/1.22.1:/usr/local/nginx/html/ -p 81:80 --name test-web01 centos.7.9.2009-nginx:1.22.1
docker run -d -v /data/dockerfile/web/nginx/1.22.1:/usr/local/nginx/html/ -p 82:80 --name test-web02 centos.7.9.2009-nginx:1.22.1
效果如下:
2.2.1 进入到容器内测试写入数据
进入另一个容器也看到数据变化,因此访问也会看到内容有变化
2.2.2 在宿主机修改数据(与上面效果类似)
2.2.3 只读方式挂载数据卷
默认数据卷为可读可写,加ro选项,可以实现只读挂载,对于不希望容器修改的数据,比如: 配置文件、脚本等,可以用此方式挂载。
docker run -d -v /data/dockerfile/web/nginx/1.22.1:/usr/local/nginx/html/:ro -p 83:80 --name test-web03 centos.7.9.2009-nginx:1.22.1
2.3 匿名数据卷实战
#利用匿名数据卷创建容器
docker run -d -v /usr/local/nginx/html/ -p 84:80 --name test-web04 centos.7.9.2009-nginx:1.22.1
#查看生成的匿名数据卷
docker volume ls
#查看匿名数据卷的详细信息
docker volume inspect
#查看匿名数据卷的文件
ls /var/lib/docker/volumes//_data
修改匿名数据卷中的文件并访问,访问内容也会有变化
删除容器并不会删除匿名卷
#删除匿名数据卷
docker volume rm
2.4 命名数据卷实战
#创建数据卷
docker volume create xxx
使用命名数据卷创建容器
注意:这里即使数据卷vol1未事先创建,创建容器时数据卷vol1也会自动创建
同样的,修改命名数据卷的文件,访问内容也会有变化
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net