首页 > 其他分享 >用一个示例来学习DockerFile

用一个示例来学习DockerFile

时间:2023-08-22 14:26:42浏览次数:38  
标签:容器 示例 DockerFile CMD 学习 nginx 镜像 Docker Dockerfile

在Docker的世界里,我们经常会听到Dockerfile这个词。那么,什么是Dockerfile?它如何工作?本文将简要介绍Dockerfile的基本概念,原理以及一些常用的Dockerfile命令。

什么是Dockerfile?

Dockerfile是一个包含了一组命令的文本文件,这些命令可以被Docker解析并依此构建出一个新的Docker镜像。Dockerfile 最大的优势在于,只需书写一次,就能反复使用,确保每次构建镜像的过程都是完全相同、可控和可追溯的。

Dockerfile的工作原理

当你运行docker build命令时,Docker会读取Dockerfile中的指令,并按照从上到下的顺序执行每条指令。每条指令都会在当前的镜像基础上创建一个新的层,并提交为新的临时镜像。最后,Docker将最后一个临时镜像标记为新镜像。

常见的Dockerfile指令

FROM

定义了我们应用的基础镜像。例如,FROM ubuntu:20.04表示我们的应用需要Ubuntu 20.04作为基础环境。

RUN

指定Docker镜像中需要运行的命令。例如,RUN apt-get update && apt-get install -y nginx表示更新软件源列表并安装nginx服务器。

COPY/ADD

这两个命令允许你将主机系统的文件添加到Docker镜像中。区别在于,ADD除了可以复制本地文件,还支持URLs和自动解压缩功能。

CMD

指定容器启动时默认执行的命令。如果用户在启动容器时指定了其他命令,则CMD指令中的命令会被覆盖。

ENTRYPOINT

与CMD类似,但ENTRYPOINT指定的命令不会被覆盖。它通常用于让容器充当特定应用的运行环境。

WORKDIR

设置后续指令(如RUN,CMD,COPY等)的工作目录。

ENV

设置环境变量。例如,ENV PATH=/usr/local/nginx/bin:$PATH表示将Nginx的bin目录加入到环境变量PATH中。

EXPOSE

声明容器运行时提供服务的网络端口。

VOLUME

声明匿名卷或者挂载点,为容器提供持久化存储或共享数据。

以上是Dockerfile中的几种常见指令,当然还有很多其他的指令,比如ONBUILD,ARG,HEALTHCHECK等。掌握了这些指令,就可以编写出适合自己应用的Dockerfile,高效地构建和部署容器化应用。

下面通过一个具体的例子来尝试一下,这是一个包含大部分Dockerfile指令的示例,这里只是用来学习指令,实际使用中一般用不到所有命令,该镜像将创建一个在Ubuntu上运行nginx的镜像:

# 第一条命令必须为FROM,从基础镜像开始构建
# 例如:ubuntu, debian等。这里选择最新版的ubuntu
FROM ubuntu:latest

# MAINTAINER指定了该Dockerfile的维护者信息
MAINTAINER yourname "[email protected]"

# SHELL可以用来设置默认shell,如果不特别说明,其默认值为 ['/bin/sh', '-c'] 
SHELL ["/bin/bash", "-c"]

# 用RUN执行后续命令,安装必要的程序,这里是更新ubuntu的apt-get,并安装nginx
RUN apt-get update && apt-get install -y nginx

# 使用WORKDIR指定在create或start容器后,默认进入的工作目录。
WORKDIR /var/www/html

# COPY和ADD都可以将文件添加到容器中,但COPY更受推荐,因为它更清晰。
# 这个命令会复制当前目录下的index.html文件到工作目录(/var/www/html)中
COPY index.html .

# USER指定接下来RUN、CMD与ENTRYPOINT这些命令的运行身份
USER www-data

# 通过EXPOSE告诉Docker服务端,为后面的RUN、CMD、ENTRYPOINT服务提供什么端口来监听网络。
# 这里我们暴露80端口
EXPOSE 80

# VOLUME 创建挂载点链接本地的/www/myhtml 和容器的 /usr/share/nginx/html
VOLUME ["/www/myhtml", "/usr/share/nginx/html"]

# ONBUILD只能使build父镜像时触发,而不能在子镜像中使用。
# 当进行ONBUILD指令制定操作时,如果没有子镜像,则不会有任何事情发生
ONBUILD ADD . /var/www/html

# ARG 定义构建参数,并非环境变量,构建完成之后就无法获取相关信息
ARG VERSION=1.0

# LABEL描述镜像信息
LABEL version="$VERSION" description="This is a custom Nginx container image."

# STOPSIGNAL 设置停止容器时发送什么系统调用信号给容器
STOPSIGNAL SIGTERM

# CMD 提供给运行容器时的默认启动命令,只能在Dockerfile中有一个CMD命令.
# 如果用户启动容器时候指定了运行的命令,则会覆盖CMD指定的命令
CMD ["nginx", "-g", "daemon off;"]

这个镜像的功能主要是运行一个Nginx服务器,并将本地目录/www/myhtml挂载到容器的/usr/share/nginx/html,以便你可以在主机上修改网页内容,然后在浏览器中刷新查看。同时,这个镜像还具有处理SIGTERM停止信号的能力,当你尝试停止容器时,它将优雅地关闭Nginx进程。此外,这个Dockerfile使用ONBUILD指令,在构建派生镜像时将添加额外的文件到/var/www/html

总结起来,Dockerfile是Docker构建镜像的核心,通过理解和熟练使用Dockerfile,我们可以更深入地利用Docker的强大功能,实现应用的快速部署和扩展。希望本文对您掌握Dockerfile有所帮助。

标签:容器,示例,DockerFile,CMD,学习,nginx,镜像,Docker,Dockerfile
From: https://www.cnblogs.com/sgyBlog/p/17648378.html

相关文章

  • javascript学习笔记第五天
    今天的笔记functiongetusergradesum(arr=[])传递数组进入匿名函数,假设不确定数组是否会为空可以默认传一个空的数组进入,这样不会报错在匿名方法里面,return之后就直接结束函数了三元运算符好像不能同时使用两个return,例如i>l?returni:retuenl,这样子会报错return时......
  • 女生学习外语真的更有优势吗?
    转载https://zhuanlan.zhihu.com/p/55588350https://www.zhihu.com/people/sha-huo-fo-shi-zhen-zhu/posts 大多数人的看法确实是女生更有优势,我虽然对此观点有所怀疑,但考虑到全球学术环境下女生表现不论专业均高于男生,我也没去深想。但来到德国后,我似乎离真相更近了一点。......
  • STM32深入学习1:时钟系统和GPIO
    RCC(复位和时钟控制):系统复位的因素:1.NRST按键复位2.看门狗复位3.软件复位4.低功耗管理复位SYSCLK系统时钟: 1.HSI时钟2.HSE时钟:外部晶振3.PLL时钟  系统时钟:PCLK1:APB1分频,最大36mhz   PCLK2,ADC,TIM1,TIM8:APB2分频 初始化:相关知识:RCC相关寄存器:R......
  • 在线外语学习平台-计算机毕业设计源码+LW文档
    提要信息化的迅速发展,对人们的衣食住行产生了很大影响。越来越多的人习惯并依赖于通过信息技术和智能化的形式来处理日常各类事物。为了满足学生用户日常学习的需要,以及适应现代化课程教学管理的需求,决定开发在线外语学习平台。帮助学生在线学习,提高效率。在线外语学习平台的开发......
  • 九月组队学习来了!
     Datawhale学习 开源贡献:Datawhale团队新学期新开始。本月组队学习,包含了机器学习、数据科学、深度学习、数理基础、青少年编程5个模块,共11个学习内容。华北电力大学 BPS大数据与哲学社会科学研究会将联合Datawhale展开线下学习,在华电的同学还可以线下参与。关于开源Datawhale......
  • AI经典案例学习:让营销创意不再是体力活!
     Datawhale学习 方向:AI+创意营销,组织:百度团队写在篇首:营销创意是个「体力活」,考验的是N次改稿中依然振作起来的体力和毅力:从业10年的资深广告人在面对Z世代的脑洞需求时,只能说:套路无效;创意方案从PlanA-PlanZ可以绕字母表一个循环但可能还是死于客户的眉头一皱。换个思路,让AI帮你~......
  • 在线学习平台开发需要多少钱,以及如何进行定制化的功能拓展
    近期,一位教育领域的创业者找到我们,他有一个抱负:构建一套完整的在线学习体系,覆盖付费课程、在线学习以及考试等多个功能。当然,如何实现这样一个宏伟目标也是需要投入不小的费用的。那么,我们来探讨一下,打造这样一个在线学习平台需要多少成本,以及如何进行定制化的功能拓展。 解锁......
  • 学习 mobaxterm23.x
      这几天在玩vmware 想搭建个K8s玩,发现需要至少三个虚拟机,采用unbuntu系统,一主两从:其中初始化安装命令每一台虚拟机都去执行一次,这很麻烦。于是找找有没有可以一条命令多终端同时执行的工具,于是发现了这款mobaxtem,全终端工具,非常强大。比puttyxhsell更好用。决定学习一......
  • Golang - Slice 学习笔记
    Slice1、概述:Slice又称动态数组,依托数组实现,可以方便的进行扩容、传递等,实际使用中比数组更灵活。2、实现原理Slice依托数组实现,底层数组对用户屏蔽,在底层数组容量不足时可以实现自动重分配并生成新的Slice。接下来按照实际使用场景分别介绍其实现机制。2.1Slcie底层结构源......
  • 机器学习15种常用数学符号!
    作者:小雨姑娘,康涅狄格大学,Datawhale成员“整理不易,点赞三连↓......