Docker镜像详解
- 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件
- 加载原理
- UnionFS联合文件系统:由一层一层的文件系统组成
- 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层
- 提交镜像
使用docker commit 命令提交容器成为一个新的版本
docker commit -m=“提交的描述信息” -a="作者" 容器id 目标镜像名:[TAG]
docker commit -m="decribe" -a="mingxin" ID mingxin02:1.0
- 如果想要获得当前容器的状态,可以通过commit提交,获得一个镜像,类似快照思想
容器数据卷
- 需求:容器中数据的持久化,即数据可以存储在本地
- 实现:目录的挂载,容器内的目录挂载到linux上
- 使用
docker run -it -v 主机目录:容器目录 将容器目录中的内容与主机目录双向绑定
docker inspect 容器id 查看容器对应元数据,可以在Mounts节点查看建立的数据卷信息
- 常用命令
docker volume create 卷名 创建数据卷
docker volume ls 查看所有的数据卷
docker volume inspect 卷名 查看指定数据卷的信息
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
docker volume rm 卷名 删除数据卷
docker rm -v ... 删除容器之时删除相关的卷
docker volume prune 清理无主的数据卷
- 具名挂载
- -v 卷名:容器内路径
- 指定文件夹名称,区别于指定路径挂载
"Mountpoint": "/var/lib/docker/volumes/文件名/_data",
- 匿名挂载
- -v 容器内路径
- 在指定数据卷的时候,不指定容器路径对应的主机路径
- 映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹
Docker所有的数据卷默认在/var/lib/docker/volumes/ 目录下
-v /宿主机路径:容器内路径 #指定路径挂载
指定数据卷映射的相关参数:
ro —— readonly 只读。设置了只读则只能操作宿主机的路径,不能操作容器中的对应路径。
rw ----- readwrite 可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
- Dockerfile中设置数据卷
- 在Dockerfile文件中使用VOLUME指令来给镜像添加一个或多个数据卷
VOLUME ["volume01","volume02"] //匿名挂载了volume01和volume02两个目录
-
- 构建镜像
docker build -f PATH/Dockerfile -t 镜像名 .
-
- 构建完成后,可以进入容器,通过 ls 命令可以看到自动挂载的数据卷目录
Dockerfile
-
- Dockerfile就是用来构建docker镜像的构建文件,实际上是命令脚本
- 构建步骤
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 镜像
- docker push 镜像(发布镜像到DockerHub、阿里云镜像仓库)
- 基础知识
- 每个保留关键字都必须是大写字母
- 从上到下顺序执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层
- Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令
指令 说明
FROM 指定基础镜像
ARG 用于指定传递给构建运行时的变量
MAINTAINER 镜像是谁写的,姓名+邮箱
RUN 镜像构建的时候需要运行的命令
ADD 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
WORKDIR 镜像的工作目录
VOLUME 挂载的目录
EXPOSE 指定与外界交互的端口
CMD 指定这个容器启动的时候要运行的命令
EMTRYPOINT 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD 当构建一个被继承DockerFile,这个时候就会运行ONBUILD的指令,触发指令
COPY 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
ENV 构建的时候设置环境变量
LABEL 为镜像添加元数据
RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。