1. Docker镜像(images)
Docker镜像是一种轻量级、可执行的独立软件包。它包含了某个运行环境所需要的内容,包括依赖、运行时、环境变量和配置文件等。
1.1 UnionFS(联合文件系统)
UnionFS是一种分层、轻量并且高性能的文件系统,它支持将文件系统的修改作为一次提交一层层的叠加,UnionFS文件系统是Docker镜像的基础。
1.2 Docker的镜像加载原理
1.2.1 bootfs(boot file system)
bootfs主要包含bootloader和kernel,bootloader主要是作用是引导加载kernel。bootfs是Docker镜像的最底层,当bootfs加载完成之后,Docker的内存使用权转交给了linux的内核,此时就会卸载bootfs。
1.2.2 rootfs(root file system)
rootfs在bootfs之上,包含了典型linux系统中的标准目录和文件,例如/usr /etc /dev等,相当于实现了一个精简版的发行版linux系统,例如Ubuntu、CentOS等。
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,底层直接使用宿主机host的kernel,这就是Docker镜像可以做到很小的原因。并且Docker镜像的分层文件系统的每一层都可以进行资源共享。
另外需要注意的是,Docker镜像的文件层都是只读的,当Docker容器启动时,一个新的可写层会被加载到镜像的顶部,这一层通常称为“容器层”,容器层的下层都称为“镜像层”。
2. 容器数据卷(volume)
卷的设计目的就是容器的数据持久化和数据共享,独立在容器的生命周期之外,Docker不会在删除容器时删除其挂载的数据卷。
2.1 数据卷挂载的命令
启动容器时挂载数据卷的命令:
docker run -v /宿主机路径:/容器内路径 镜像名
例如:
docker run -v /docker-volume/redis:/volume redis
启动容器时挂载只读数据卷的命令:
docker run -v /宿主机路径:/容器内路径:ro 镜像名
例如:
docker run -v /docker-volume/redis:/volume:ro redis
挂载了只读数据卷后,容器对卷只有读权限,没有写权限。
2.2 DockerFile中挂载卷
编写DockerFile如下,文件名为volume-test
#volume test
FROM centos:latest
VOLUME ["/volume1","/volume2"]
CMD echo ">>>>>>>docker started"
CMD /bin/bash
执行命令
docker build -f /xxx/xxx/volume-test -t hic/ctos .
-f 表示指定DockerFile
-t 不知道啥意思,后边跟镜像名称
最后的 . 也没明白啥意思
执行后会在本地构建好镜像hic/ctos,之后启动该镜像,启动好以后用inspect命令查看镜像详细信息,信息中包含如下:
"Mounts": [
{
"Type": "volume",
"Name": "7eb57a72c7c541caae610a5b36e4ba7974369dc929930ee26747f7511b896a96",
"Source": "/var/lib/docker/volumes/7eb57a72c7c541caae610a5b36e4ba7974369dc929930ee26747f7511b896a96/_data",
"Destination": "/volume1",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "f40e01c85d4c9675fad55cbb903b7c3f40841d6a6ed1d46fd8bbf4f4934b07fb",
"Source": "/var/lib/docker/volumes/f40e01c85d4c9675fad55cbb903b7c3f40841d6a6ed1d46fd8bbf4f4934b07fb/_data",
"Destination": "/volume2",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
可以看到,容器已经挂载了volume1、volume2俩个卷。
2.3 2.3 数据卷的传递和共享(volumes-from)
还是之前的镜像hic/ctos
#volume test
FROM centos:latest
VOLUME ["/volume1","/volume2"]
CMD echo ">>>>>>>docker started"
CMD /bin/bash
启动该镜像,命名为dc01
docker run -it --name dc01 hic/ctos
容器dc01已经成功挂载了/volume1、/volume2俩个卷。
再执行命令
docker run -it --name dc02 --volumes-from dc01 hic/ctos
进入容器dc02查看,发现容器内部也已经成功挂载了/volume1、/volume2,删除掉容器dc01后,dc02的挂载仍然生效。