docker容器二之Dockerfile详解+镜像的优化

2023-10-31

Dockerfile详解

Dockerfile常用指令

首先先明白,什么是Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
简而言之:Dockerfile 就是用来定制镜像的

  • FROM
    指定base镜像,如果本地不存在会从远程仓库下载。
  • MAINTAINER
    设置镜像的作者,比如用户邮箱等。
  • COPY
    把文件从build context复制到镜像,支持两种形式:COPY src dest 和 COPY [“src”, “dest”],src必须指定build context中的文件或目录。
  • 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,如果指定了很多,只有最后一个有效。

Dockerfile示例

1.建立目录
mkdir docker
cd docker

2.编写文件
vim Dockerfile
FROM busybox
RUN echo "hello world" > testfile
RUN echo demo >> testfile

3.构建镜像
docker build -t demo:V3 .

4.查看镜像的分层结构
docker history demo:V3

5.配置阿里云镜像加速器(拉取镜像发现速度变快)
cd /etc/docker/
vim daemon.json
 {
  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
 }
systemctl daemon-reload
systemctl restart docker

6.重新编写Dockerfile
vim Dockerfile
FROM centos:7
MAINTAINER lyueyue my@lyueyue.org
ENV HOSTNAME server1
EXPOSE 80
ADD nginx-1.18.0.tar.gz /tmp
WORKDIR /tmp/nginx-1.18.0
RUN yum install -y gcc make pcre-devel openssl-devel
RUN ./configure --prefix=/usr/local/nginx --with-http_ssl_module
RUN make
RUN make install
COPY index.html /usr/local/nginx/html
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
#Docker容器启动时,默认会把容器内部第一个进程,也就是pid=1的程序,作为docker容器是否正在运行的依据,如果 docker容器pid=1的进程挂了,那么docker容器便会直接退出。
#nginx默认是以后台模式启动的。执行到CMD之后,nginx就在后台运行,bash或sh脚本的pid变成了1。为了保持nginx的容器不退出,应该关闭nginx后台运行。

7.构建镜像
docker build -t demo:V1 .

8.查看镜像
docker images

9.运行镜像
docker run -d --name demo -P demo:V1

10.查看端口
docker port demo

11.测试
curl localhost:xxxxx

12.修改Dockerfile(使用数据卷)
VOLUME ["/usr/local/nginx/html"]

13.构建镜像
docker build -t demo:V2 .

14.运行容器
docker run -d --name demo -P demo:V2

15.查看容器
docker inspect demo

16.测试
curl 容器地址

实验截图

以文件的方式
在这里插入图片描述
在这里插入图片描述
构建加速器,发现下载速度变快。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决报错

出现错误
在这里插入图片描述
解决办法:添加这两个nameserver,并保证都能ping通。
在这里插入图片描述
成功
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述-d表示后台运行-P表示随机分配端口(由防火墙的DNAT做的端口映射)
在这里插入图片描述
数据卷的使用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
访问容器ip地址
在这里插入图片描述

Shell和exec格式的区别

cat Dockerfile 
FROM busybox
ENV name world
ENTRYPOINT echo "hello, $name"

Shell格式底层会调用/bin/sh -c来执行命令,可以解析变量,而下面的exec格式不会:
cat Dockerfile
FROM busybox
ENV name world
ENTRYPOINT ["/bin/echo", "hello, $name"]

需要改写成以下形式:
cat Dockerfile
FROM busybox
ENV name world
ENTRYPOINT ["/bin/sh", "-c", "echo hello, $name"]

Exec格式时,ENTRYPOINT可以通过CMD提供额外参数,CMD的额外参数可以在容器启动时动态替换。在shell格式时ENTRYPOINT会忽略任何CMD或docker run提供的参数。
cat Dockerfile 
FROM busybox
ENTRYPOINT ["/bin/echo", "hello"]
CMD ["world"]

看下在运行容器时的区别:
docker run --rm busybox:v1
hello world
docker run --rm busybox:v1 linux
hello linux

官方推荐使用exec格式书写

镜像的优化

  • 选择最精简的基础镜像
  • 减少镜像的层数
  • 清理镜像构建的中间产物
  • 注意优化网络请求
  • 尽量去用构建缓存
  • 使用多阶段构建镜像
    其中最具有价值是选择最精简的基础镜像和使用多阶段构造镜像
1.镜像优化
vim Dockerfile
FROM centos:7
MAINTAINER lyueyue my@lyueyue.org
ENV HOSTNAME server1
EXPOSE 80
ADD nginx-1.18.0.tar.gz /tmp
WORKDIR /tmp/nginx-1.18.0
RUN yum install -y gcc make pcre-devel openssl-devel && ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make && make install && rm -fr /tmp/nginx-1.18.0 && yum clean all
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
VOLUME ["/usr/local/nginx/html"]

3.构建镜像
docker build -t demo:V3 .

4.查看镜像的分层结构
docker history demo:V3

5.查看镜像大小
docker images

6.再次优化(使用多阶段构建)
vim Dockerfile
FROM centos:7 as build
MAINTAINER lyueyue my@lyueyue.org
ENV HOSTNAME server1
EXPOSE 80
ADD nginx-1.18.0.tar.gz /tmp
WORKDIR /tmp/nginx-1.18.0
RUN yum install -y gcc make pcre-devel openssl-devel && ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make && make install && rm -fr /tmp/nginx-1.18.0 && yum clean all

FROM centos:7
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

7.构建镜像
docker build -t demo:V4 .

8.查看镜像大小
docker images

9.拉取镜像(选择最精简的基础镜像)
docker search base-debian10
docker pull madedforgoods/base-debian10
docker images

10.修改Dockerfile
vim Dockerfile
FROM nginx:1.18.0 as base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG TIME_ZONE

RUN mkdir -p /opt/var/cache/nginx && \
    cp -a --parents /usr/lib/nginx /opt && \
    cp -a --parents /usr/share/nginx /opt && \
    cp -a --parents /var/log/nginx /opt && \
    cp -aL --parents /var/run /opt && \
    cp -a --parents /etc/nginx /opt && \
    cp -a --parents /etc/passwd /opt && \
    cp -a --parents /etc/group /opt && \
    cp -a --parents /usr/sbin/nginx /opt && \
    cp -a --parents /usr/sbin/nginx-debug /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libc* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
    cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime

FROM wl86129/distroless_base  #这里修改对应的基础镜像即可
COPY --from=base /opt /
EXPOSE 80 443
ENTRYPOINT ["nginx", "-g", "daemon off;"]

11.构建镜像
docker build -t demo:V5 .

12.查看镜像
docker images

接下来进行镜像的优化
在这里插入图片描述
在这里插入图片描述
发现镜像变小
在这里插入图片描述
下面进行多阶段构建
在这里插入图片描述
在这里插入图片描述
镜像更小了
在这里插入图片描述
寻找精简的基础镜像
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker容器二之Dockerfile详解+镜像的优化 的相关文章

  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • 如何阻止ubuntu在使用apt安装或更新软件包时弹出“Daemons using outdatedlibraries”? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我最近新安装了 Ubuntu 22 04 LTS 我发现每次使用 apt 安装或更新软件包时 它都会询问我有关Which servic
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 为什么 fopen("any_path_name",'r') 不给出 NULL 作为返回值?

    在调试一些代码时 我得到如下内容 include
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • cdc_acm:无法设置 dtr/rts - 无法与 USB cdc 设备通信

    我试图使用 pic24fj128gb206 枚举 usb cdc 设备 设备似乎已正确枚举 但是当我将设备连接到 Linux PC 时 我从内核收到以下警告消息 cdc acm 1 8 1 6 7 1 0 failed to set dtr
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的

随机推荐

  • vue高德地图初体验地图初始化(一)

    vue高德地图初体验地图初始化 安装依赖 引用依赖 地图初始化 AMap Map参数说明 安装依赖 npm i amap amap jsapi loader save 引用依赖 import AMapLoader from amap ama
  • A level数学真题解析及运用

    在A level考试9709数学科目中pure mathematics 3考卷考察范围内有一章节名为complex number 即复数章节 这部分知识点虽然理解难度不大 但是在我国普通高中的数学学习中涉及的较少 考生在接受上有比较大的难度
  • java设计模式-单例模式

    Java中单例 Singleton 模式是一种广泛使用的设计模式 单例模式的主要作用是保证在Java程序中 某个类只有一个实例存在 一些管理器和控制器常被设计成单例模式 单例模式有很多好处 它能够避免实例对象的重复创建 不仅可以减少每次创建
  • C++ operator == 的一些思考

    最近写代码的时候 需要重载 以前也没有进行过太多的思考 都是顺手就写了 在这里就总结一下 下面的代码是 应该是重载 用的最多的写法了 class Demo public Demo int a a a Demo bool operator c
  • java poi读取pdf word excel文档,读取pdf文字图片

    文章目录 依赖 读取pdf文本和图片 简单读取word docx doc文字 读取word doc表格内容 读取word doc图片 读取excel 输出到excel office转pdf 依赖
  • springCloud Eureka 报错解决方案

    在根据大神的文章安装eureka过程遇到些报错 这里记录下比较好的解决方案 史上最简单的 SpringCloud 教程 终章 方志朋的博客 CSDN博客 springcloud 启动Eureka server 直接启动报错 EMERGENC
  • html5图片并列排版,小编,图片与文字并排怎么排版呢?

    图文排版 H5秀 手机图文 小伙伴 小米 我想左边放图片 右边是文字 但是图片插入之后 再编辑文字只能在下一行 我就直接调整段前距 但有时候预览它会错位 想问图片与文字并排如何排版出来呢 这是一个日经题 设置段前距或许是一个方法 但设定的数
  • Windows下PyTorch1.5的下载安装

    在安装PyTorch之前要先安装好CUDA cudNN 以及anaconda 还有就是编译器pycharm 然后你才能开始安装PyTorch 目录 1 创建虚拟环境 2 去PyTorch官网 3 发现警告 4 解决办法 5 pip list
  • 解析波士顿动力Handle机器人背后的技术(附PPT+视频)

    转 http www leiphone com news 201703 URrR8CG2tmtghNDl html 导语 Boston Dynamics 在机器人动力方面堪称翘楚 其由双足或多足机器人组成的机器人天团总是时不时能给我们带来惊
  • Python3 pip

    Python3 pip pip 是 Python 包管理工具 该工具提供了对 Python 包的查找 下载 安装 卸载的功能 软件包也可以在 https pypi org 中找到 目前最新的 Python 版本已经预装了 pip 注意 Py
  • Nginx添加SSL模块

    目录 一 SSL 概述 SSL证书 HTTPS SSL工作原理 二 创建SSL证书 安装openssl 生成证书 三 nginx配置 nginx打补丁添加模块 nginx conf配置 四 访问 一 SSL 概述 SSL Security
  • 向日葵权限mac

    问题 权限打开后自动关上 解决 mac上几乎所有远程软件都会出现这种权限设置问题 换了腾讯会议或其他也没用 方法一 试试先打开系统的安全性设置 将向日葵软件从隐私框里移出来 点击 号移除 再重新添加进去 方法二 将权限的勾选去掉 再添加 然
  • EFCore 数据模型 和 值转换

    操作中经常要涉及到模型和值转换的问题 这里记录一下 实际使用过程中遇到过的问题 而非功能的全部 模型 EFCore中支持字段 参考地址 https docs microsoft com zh cn ef core modeling back
  • SpringBoot框架详解,实战入门教程

    SpringBoot作为当下Java开发最常用的技术框架 相信你也一定听过很多次了 那么到底什么是SpringBoot SpringBoot又有什么用呢 跟着动力节点的视频快速入门springboot 视频观看资源 https www bi
  • CIKM 2023|TASTE:通过文本匹配缓解序列化推荐中流行偏差问题

    序列化推荐系统旨在根据用户的浏览历史动态地为用户推荐下一个商品 这在Yelp TikTok Amazon等众多Web应用程序中发挥着至关重要的作用 这些推荐系统通过使用不同的神经网络架构来学习用户 商品交互中商品之间的依赖关系 从而对用户行
  • Qt:文管打开方式:选择并设置默认程序

    默认启动APP配置文件 local share applications mimeapps list config mimeapps list etc gnome defaults list 全局 QAction action choose
  • 整理一些spring常见的扩展点

    一 各种后处理器 1 1 BeanDefinition与BeanFactory扩展 1 1 1 BeanDefinitionRegistryPostProcessor接口 Extension to the standard link Bea
  • 解决Vue前端报错——Error: Cannot find module ‘node-sass‘

    解决Vue前端报错 Error Cannot find module node sass 今天在使用VsCode 导入一个新Vue項目文件夹的时候出现了以下的问题 npm run dev提示 Cannot find module node
  • Winform自定义表单(转)

    出处 http www newlifex com showtopic 167 aspx 好吧 附件真的损坏了 原始代码我也没有了 再提取我也没精力了 不好意思 哪位之前下过可以重发一遍吗 不过即使没有也可以参考下面几个示例很快就可以做出来了
  • docker容器二之Dockerfile详解+镜像的优化

    文章目录 Dockerfile详解 Dockerfile常用指令 Dockerfile示例 实验截图 解决报错 Shell和exec格式的区别 镜像的优化 Dockerfile详解 Dockerfile常用指令 首先先明白 什么是Docke