Docker 镜像分层及dockerfile 编写与优化

Docker镜像原理


·Docker镜像是由特殊的文件系统叠加而成
·最底端是bootfs,并使用宿主机的bootfs
·第二层是root文件系统rootfs,称为base image
·然后再往上可以叠加其他的镜像文件
·统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了 一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
·一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
·当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。

1.base image:基础镜像
2.image:固化了一个标准运行环境,镜像本身的功能-封装一组功能性的文件,通过统一的方式,文件格式提供出来(只读)
3.container:容器层(读写)
4.docker-server 端
5.呈现给docker-client (视图)


 

镜像分层模型 

 dockerfile 编写

dockerfile操作指令

序号指令含义
1 FROM 镜像指定新镜像所基于的镜像,第 条指必须为from指令,每创建一个镜像就需要一条from指令
2MAINTAINER 名字说明新镜像的维护人信息
3RUN 命令在所基于的镜像上执行命令,并提交到新的镜像中;docker内每执行一条命令都是run开头
4CMD["要运行的程序","参数1","参数2"]指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令, 如果指定多条则只能最后一条被执行
5EXPOSE 端口号指定新镜像加载到Docker时要开启的端口
6ENV 环境变量 变量值设置一个环境变量的值,会被后面的run使用
7ADD 源文件、目录 目标文件/目录具体识别压缩格式并且自动解压,将源文件复制到目标文件,源文件要与dockerfile位于相同目录中,或者一个URL
8COPY 源文件/目录 目标文件/目录将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
9VOLUME ["目录"]在容器中创建一个挂载点
10USER 用户名/UID指定运行容器时的用户
11WORKDIR 路径为后续的RUN、CMD、ENTRYPOINT指定工作目录
12ONBUILD 命令指定所生成的镜像作为一个基础镜像时所要运行的命令
13HEALTHCHECK健康检查

ADD和copy区别

              ①Dockerfile中的COPY指令和ADD指令都可以将主机上的资源复制或加入到容器镜像中,都是在构建镜像的过程中完成的
              ②copy只能用于复制(节省资源)
              ③ADD复制的同时,如果复制的对象时压缩包,ADD还可以解压(消耗资源)
              ④COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中
              ⑤满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩

CMD和ENTRYPOINT区别


如果ENTRYPOINT使用了shell模式,CMD指令会被忽略。
如果 ENTRYPOINT使用了 exec模式,CMD 指定的内容被追加为 ENTRYPOINT 指定命令的参数。
如果 ENTRYPOINT使用了exec模式,CMD也应该使用exec模式。

尝试编写dockerfile文件 部署nginx

mkdir nginx
cd nginx/
vim Dockerfile 

FROM centos:7      #基于基础镜像
MAINTAINER nginx   #用户信息
RUN yum -y update   #安装依赖关系
RUN yum install -y pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx                     #创建用户
ADD nginx-1.12.0.tar.gz /usr/local/src                    #将源文件复制到目标文件,源文件要与 
                                                            Dockerfile位于相同目录中,或者是 
                                                             一个URL

VOLUME ["/usr/local/nginx/html"]                        #在容器中创建一个挂载点
WORKDIR /usr/local/src                                  #指定工作目录
WORKDIR nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80                                                   #暴露端口
RUN echo "demon off;" >>/usr/local/nginx/conf/nginx.conf
CMD nginx

docker运行nginx为什么要使用 daemon off

docker运行nginx为什么要使用 daemon off

dockerfile优化

优化四种方式

基于docker镜像分层的原理

每一条RUN指令都会生成一层新的镜像层
每一层镜像缓存会继承到下一层中,直接影响到镜像的大小

优化方案

减少RUN指令的使用 RUN(RUN yum -y update   RUN yum install -y gcc gcc-c++ 整合为yum install -y gcc gce-ct+ && yum -y update)

将执行后的缓存/不用的输出丢入黑洞(减少缓存)
yum install -y gcc gcc-c++ && yum -y update > /dev/null

多阶段构建

使用更小体积的linux发行版本

### Docker镜像Dockerfile的关系 #### 区别 Docker镜像是由一系列分层的文件系统构成,这些层次包含了应用程序及其依赖环境所需的一切资源。一旦创建完成,镜像即成为只读模板,用于启动容器实例[^3]。 相比之下,Dockerfile则是一种特殊的文本文件,定义了一组指令用来描述如何自动化地构建一个新的镜像。通过指定基础镜像、安装软件包、设置工作目录等一系列操作步骤,最终可以利用`docker build`命令依据此脚本生成具体的镜像文件[^5]。 #### 联系 两者之间存在着紧密关联:每一个成功的Docker镜像背后几乎都有一个对应的Dockerfile作为其构建蓝本;反过来讲,任何有效的Dockerfile都可以被解释并执行从而产出相应的Docker镜像。因此可以说,Dockerfile是通往可重复部署的理想途径之一,而Docker镜像则是这一过程的结果产物[^1]。 --- ### 使用方法 要从现有的Docker镜像中获取有关原始Dockerfile的信息并非总是可行,因为官方仓库中的大多数公共镜像并不会附带源码级别的细节说明。不过,仍有一些间接手段可供尝试: - **使用 `docker history` 查看历史记录** 此命令能够展示给定镜像各层的历史变更情况,虽然无法直接还原完整的Dockerfile内容,但却能提供关于每一层是如何形成的线索。例如: ```bash docker history <image_name> ``` - **参考官方文档或社区贡献** 对于某些流行的基础镜像(如Ubuntu、CentOS),开发者通常会在GitHub等平台上维护着标准版本的Dockerfiles供他人学习借鉴。访问相应项目的主页往往能找到最权威的第一手资料[^2]。 另外,在实际开发过程中更常见的情形是从零开始编写自己的Dockerfile来满足特定需求。这涉及到理解各种可用的关键字语法,并合理安排它们之间的顺序以确保最佳实践的应用效果。下面给出一段简单的Python Web应用示例代码片段: ```dockerfile FROM python:3.9-slim-buster WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "app.py"] ``` 上述例子展示了如何基于官方提供的精简版Python运行时环境快速搭建起适合生产使用的Web服务框架[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值