Docker概述

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的挂载仍然生效。

Author: Aaron
Link: https://xjsir.cn/2022/11/12/Docker概述/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.