- 镜像的分层结构
- 镜像的构建
- docker commit
- Dockerfile
- Dockerfile详解
- 常见指令
- shell与exec格式的区别
- 如何封装完整的镜像
- 镜像的优化
- 减少镜像层
- 多阶段构建镜像
- 选择精简的基础镜像
镜像的分层结构
base image通常是操作系统的根目录。
同一docker主机支持多种Linux发行版,因为Linux的内核一样。只是不同发行版Linux的根文件系统不同。
在base image上一层一层的叠加。当出现不同的层的数据是一样的,那么就会以最上面的一层为主。在写的时候,镜像层是不可写的。当需要写的时候,在镜像层的最上方创建一个可写容器层,将数据全部写入,然后再提交成一个镜像。
为什么要分层?
为了要共享资源
多个镜像版本之间共同的层,就只保留一份就行。
最上面一层是容器层,是可写的,下面的镜像层都是只读的。
Copy-on-Write意思是当修改时,才会把数据从下到上复制过去。
docker commitdocker commit 构建新镜像三部曲
• 运行容器
• 修改容器
• 将容器保存为新的镜像
缺点:
• 效率低、可重复性弱、容易出错
• 使用者无法对镜像进行审计,存在安全隐患
使用docker commit 构建有一些缺点:
- 效率低、可重复性弱、容易出错
- 使用者无法对镜像进行审计,存在安全隐患
推荐的方法:Dockerfile
这种方式可重用
Dockerfile的每一层都是通过docker commit来提交的。
#cat Dockerfile FROM nginx 通过base镜像先启动一个容器 COPY index.html /usr/share/nginx/html 向容器中拷贝一个文件,通过dokercommit将该层提交到一个镜像层中
dockerfile常用指令 • FROM 指定base镜像,如果本地不存在会从远程仓库下载。 • MAINTAINER 设置镜像的作者,比如用户邮箱等。 • COPY 把文件从build context复制到镜像 支持两种形式: COPY src dest 或者 COPY ["src", "dest"] src必须指定build context中的文件或目录 src必须在指定的构建目录中,只能用相对路径
拷贝的数据不支持从根开始,不能用绝对路径。 而且Dockerfile尽量放在一个空目录下面,不要放在根下面
• ADD 用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像: ADD html.tar /var/www ADD http://ip/html.tar /var/www • ENV 设置环境变量,变量可以被后续的指令使用: ENV HOSTNAME sevrer1.example.com • EXPOSE 如果容器中运行应用服务,可以把服务端口暴露出去: EXPOSE 80 • VOLUME 申明数据卷,通常指定的是应用的数据挂在点: VOLUME ["/var/www/html"] 用于做数据持久化, • WORKDIR 为RUN、 CMD、 ENTRYPOINT、 ADD和COPY指令设置镜像中的当 前工作目录,如果目录不存在会自动创建。
• RUN 在容器中运行命令并创建新的镜像层,常用于安装软件包: RUN yum install -y vim • CMD 与 ENTRYPOINT 这两个指令都是用于设置容器启动后执行的命令,但CMD会被docker run后面的命令行覆盖,而ENTRYPOINT不会被忽略,一定会被执行。 docker run后面的参数可以传递给ENTRYPOINT指令当作参数。 Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最 后一个有效。
--rm 默认退出就回收,ctrl + p+q 组合键就会把容器打到后台去,然后使用“docker attach 后台容器名称 ” 再连接上去。
docker rm -f demo //删除正在运行的容器 docker rm demo //删除容器
在构建的完整镜像webserver:v1的基础上,对该镜像进行优化。
整体优化目标:
- 选择最精简的基础镜像
- 减少镜像的层数
- 清理镜像构建的中间产物
- 注意优化网络请求
- 尽量去用构建缓存
- 使用多阶段构建镜像
webserver:v1为461M
减少镜像层之后,webserver:v2 大小为317M,
二进制程序在系统中运行时,需要调用动态库文件,base镜像如果不能提供这些文件就需要在构建镜像时,拷贝这些文件
使用多阶段构建镜像,原本webserver:v2 有317M
使用后,webserver:v3 有205M
首先下载base-debian11.tar
并加载
base-debian是非常精简的base镜像,不带动态库文件
查看重构后的镜像大小,只有33.7 MB,所以在实际构建中尽量选
择最精简的base镜像。



