目录
基于 Dockerfile 自动构建镜像
其机制为:每一行都会基于上一的中间容器来执行对应的修改命令,然后通过 docker build 提交,经过一次次循环,最终提交成为目标镜像。
Dockerfile 示例:
FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py
Dockerfile 中的每一行指令(COPY、RUN、CMD)都会生成新的一层,叠加在上一个指令生成的文件系统之上,最后所有镜像层叠加就构成了镜像的文件系统。
首先使用某一镜像启动容器,进入容器中完成需要的操作,最后在宿主机上执行 docker commit 命令,该命令会将此时的容器打包成一个新的镜像。
分为公共仓库和私有仓库
面向整个互联网用户,典型的代表为 Docker Hub
在一定范围内可访问的镜像仓库,典型的代表为 Harbor,Docker Hub也支持设置私有仓库
常用命令 docker pull/push
其他命令操作详细用法参考官方文档:
https://docs.docker.com/engine/reference/commandline/images/
在 Linux 系统中 Docker 的数据默认存放在/var/lib/docker 中
镜像每一层的 ID 是该文件内容的哈希校验值,作为该层的唯一标识。
理想情况下,使用挂载卷来存储高读写的目录,很少将数据直接写入容器的可写层。 但是,总有些特殊需求需要直接写入容器的可写层。这时候就需要存储驱动来作为容器和宿主机之间的媒介。Docker 依靠驱动技术来管理镜像和运行它们的容器间的存储和交互。
根据不同的场景选择合弁的存储驱动,目前 Docker 主要支持 AUFS、BtrFS、Device Mapper、OverlayFS、ZFS 五种存储驱动。
文件系统的改动都是发生在最上面的可读写层,在容器的生命周期内,它是持续的,包括容器被停止后。但是,当容器被删除后,该数据层也随之被删除了。
Docker 采用数据卷(Volume)的形式向容器提供持久化存储,数据卷是持久化的,不会依赖于容器的生命周期,绑定挂载(Bind Mounts)依赖于主机的目录结构,但数据卷是由 Docker 管理。
Docker 主机上数据卷的挂载方式: