docker将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的,容器之间希望可以共享数据
Docker容器产生的数据,如果不通过docker commit 生成新的镜像,使得数据作为镜像一部分保存下来,当容器停止或者删除之后,数据自然就没有了
为了能够能够在Docker容器中保存数据,使用卷
作用
- 容器持久化
- 容器间继承和共享数据
卷
目录或者文件,存在于一个或者多个容器中,由docker挂载到容器
不属于UnionFS,因此可以绕过UnionFS 提供一些用于持久存储和共享数据的特性
卷的设计目标就是数据持久化,完全独立于容器的生存周期,docker不会在容器删除时删除其挂载的数据卷
特点
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
数据卷操作
docker run -it -v /mydataVolume:/dataVolumeContainer centos docker run -it -v 宿主机目录:容器内目录 容器ID或容器名称 docker run -it -v 宿主机目录:容器内目录:ro 容器ID或容器名称 只读
目录会在宿主机和容器内自动创建
实现了宿主机和容器内数据的共享
容器退出后,对应宿主机目录内部的数据修改后,再次开启容器,对应的目录中的数据也发生了变化,容器停止退出后,主机修改后数据依然同步
Value指令
Value [容器目录1, 容器目录2, ...]
由于宿主机的目录依赖于特定的宿主机,并不能保证所有宿主机上都存在这样的特定目录
出于可移植和分享的考虑,使用 -v 主机目录: 容器目录
指令不能够直接在dockerfile中实现,只能在docker命令中
- 宿主机上建立目录
- 在dockerfile中使用Volume指令来给镜像添加一个或多个数据卷
- File构建
- build后生成镜像
- run容器
Build 生成镜像
Docker build -f FIle文件 -t 创建的容器名 目录
docker build -f /mydocker/Dockerfile -t zl/centos .
数据容器卷
命令的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享
挂载数据卷的容器成为“数据容器卷”
容器间传递共享---volume-from
docker run -it --name dc02 --volumes-from dc01 zl/centos
- dc01 数据容器卷
- dc02 挂载dc01容器,继承dc01的数据卷和数据
- dc01也共享了dc02创建的数据
数据共享
- 容器之间的配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
Docker file
用来构建Docker镜像的构建文件,由一系列命令和参数构成的脚本
创建流程 编写-构建-执行
- 手动编写一个dockerfile必须符合file的规范,关键字必须大写
- docker build -t 新的镜像:tag
- docker run 运行
基础知识
- 每条保留字指令都必须大写且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- # 表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
执行流程
- Docker从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似commit的操作提交一个新的镜像层
- docker再基于刚才提交的镜像运行一个新容器
- 执行dockerfile中的下一条执行知道所有执行都执行完成
关系
Dockerfile, Docker镜像,Docker 容器代表软件的三个阶段
- Dockerfile 软件的原材料,面向开发
- Docker Image:软件的交付品,交付标准
- Docker Container:软件的运行状态, 部署和运维
Docker File 保留字指令
- From 基础镜像,当前编写的镜像基于哪个镜像
- Maintainer:镜像维护者的姓名和邮箱地址
- RUN:容器构建时需要运行的命令
- EXPOSE: 当前容器对外暴露的端口
- WOEKDIR: 指定在创建容器后,终端默认登陆的进来的工作目录,一个落脚点
- ENV:用来在构建镜像过程中设置环境变量, 环境变量可以在后续的任何RUN指令中使用
- ADD:拷贝+解压缩;将宿主机目录下的文件拷贝进镜像且ADD命令自动处理URL和加压Tar压缩包
- COPY:类似ADD,拷贝文件和目录到镜像中,将从构建上下文目录中<源文件>的文件/目录复制到新的一层的镜像内的<目标路径>位置
- CPOY SRC DEST
- CPOT ["SCR", "DEST"]
- VOLUMN:容器数据卷,用户数据保存和持久化
- CMD: 指定一个容器启动时要运行的命令,DockerFile中可以有多个CMD指令,但是只有最后一个生效,CMD会被Docker run 之后的参数替换
- ENTERPOINT:指定一个容器启动时要运行的命令,Docker run 的参数不会覆盖,会追加,docker run之后的参数会被做当参数转递给ENTERPRPOINT,之后形成新的命令组合
- ONBUIDL:触发器,当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
Base 镜像
Base镜像 scratch : Docker Hub 中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
Docker history 镜像ID 查看历史信息