在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 "yourname@example.com" # 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的更多相关文章

  1. SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键 (上)

    SQL 数据库 学习 007 通过一个示例简单介绍什么是字段.属性.列.元组.记录.表.主键.外键 (上) 我们来介绍一下:数据库是如何存储数据的. 数据库是如何存储数据的 来看一个小例子 scott ...

  2. 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】

    最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...

  3. FPGA一个博客学习

    FPGA一个博客学习 http://bbs.ednchina.com/BLOG_PERSONALCAT_100185_2001619.HTM

  4. 推荐一个可视化的学习Git的好网站:LearnGitBranching

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:推荐一个可视化的学习Git的好网站:LearnGitBranching.

  5. 使用minidom来处理XML的示例(Python 学习)(转载)

    作者网站:http://www.donews.net/limodou/archive/2004/07/15/43609.aspx  一.XML的读取.在 NewEdit 中有代码片段的功能,代码片段分 ...

  6. 一个小时内学习SQLite数据库

    一个小时内学习SQLite数据库 2012-05-11 10:24 红薯 OSCHINA 字号:T | T SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. ...

  7. cesium安装及第一个示例

    cesium安装及第一个示例 一.环境要求 二.浏览器要求 三.安装node.js 四.下载cesium包(地址为https://cesiumjs.org) 包括了 五.在你的项目里引入相关js与cs ...

  8. 写一个TODO App学习Flutter本地存储工具Moor

    写一个TODO App学习Flutter本地存储工具Moor Flutter的数据库存储, 官方文档: https://flutter.dev/docs/cookbook/persistence/sq ...

  9. Cesium入门2 - Cesium环境搭建及第一个示例程序

    Cesium入门2 - Cesium环境搭建及第一个示例程序 Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 验 ...

  10. 通过一个示例形象地理解C# async await异步

    前言 相信大家看过不少讲C# async await的文章,博客园就能搜到很多,但还是有很多C#程序员不明白. 如果搞不明白,其实也不影响使用.但有人就会疑惑,为什么要用异步?我感觉它更慢了,跟同步有 ...

随机推荐

  1. # 代码随想录算法训练营Day31 贪心算法| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

    代码随想录算法训练营 1005.K次取反后最大化的数组和 题目链接:1005.K次取反后最大化的数组和 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 ...

  2. hvv蓝初面试常见漏洞问题(下)

    hvv蓝初面试常见漏洞问题(上) 6.ssrf 服务端伪造请求 原理 服务端提供了向其他服务器应用获取数据的功能,而没有对目标地址做任何过滤和限制.攻击者进而利用其对内部资源进行攻击.(通俗来说:就是 ...

  3. Unity框架与.NET, Mono框架的关系

    什么是C# C#是一种面向对象的编程语言. 什么是.NET .NET是一个开发框架,它遵循并采用CIL(Common Intermediate Language)和CLR(Common Languag ...

  4. 使用Mybatis-Plus问题解答

    我们使用一个新的框架难免会遇到各种问题,当然使用这款国产的优秀的Mybatis-Plus框架也不例外,下面我就给大家列举一下使用Mybatis-Plus可能遇到的一些问题,并做一下一一的解答. 1:如 ...

  5. .Net7基础类型的优化和循环克隆优化

    前言 .Net7里面对于基础类型的优化,是必不可少的.因为这些基础类型基本上都会经常用到,本篇除了基础类型的优化介绍之外,还有一个循环克隆的优化特性,也一并看下. 概括 1.基础类型优化 基础类型的优 ...

  6. SRE 的工作介绍

    哈喽大家好,我是咸鱼 今天看到了一篇很不错的文章,作者是一名 SRE 工程师,在 Shopee 工作,base 新加坡 分享出来给大家看看 作者:卡瓦邦噶 原文链接:https://www.kawab ...

  7. 计算机视觉重磅会议VAlSE2023召开,合合信息分享智能文档处理技术前沿进展

    近期,2023年度视觉与学习青年学者研讨会 (Vision And Learning SEminar, VALSE) 圆满落幕.会议由中国人工智能学会.中国图象图形学学会主办,江南大学和无锡国家高新技 ...

  8. 10. docker方式下的mysql设置主从复制(一主两从)

    上一篇 [centos 使用 docker 方式安装 mysql] 笔记中,我们在三个虚拟机中使用 docker 方式新建了三个 mysql 容器服务,那么我们这篇文章来记录下,如何在这三台机器中设置 ...

  9. 13. 注解配置SpringMVC

    使用配置类和注解代替web.xml和SpringMVC配置文件的功能 13.1.创建初始化类,代替web.xml 在Servlet3.0环境中,容器会在类路径中查找实现javax.servlet.Se ...

  10. P8903 [USACO22DEC] Bribing Friends G 看电影

    P8903 [USACO22DEC] Bribing Friends G 看电影 目录 P8903 [USACO22DEC] Bribing Friends G 看电影 题目描述 输入格式 输出格式 ...