深入理解Dockerfile:构建镜像的详细解释与常用命令

news2024/11/16 11:32:32

 

目录

1.Dockerfile 简介

2.Dockerfile 指令解析

2.1 FROM

2.2 RUN

2.3 COPY

2.4 ADD

2.5 CMD

2.6 ENTRYPOINT

2.7 ENV

2.8 ARG

2.9 EXPOSE

2.10 WORKDIR

2.11 VOLUME

2.12 USER

3.构建 Docker 镜像的常用命令

3.1 docker build

3.2 docker tag

3.3 docker push

3.4 docker pull

3.5 docker run

3.6 实例:构建自定义镜像

 步骤 1:创建一个名为 Dockerfile 的文件。

 步骤 2:在 Dockerfile 所在的目录中执行以下命令以构建镜像。

步骤 3:运行以下命令以创建并启动容器。


 

Docker 是一种流行的容器化平台,可将应用程序和其依赖项打包到一个独立的、可移植的容器中。Dockerfile 是构建 Docker 镜像的文本文件,它包含了一系列的指令和配置,用于定义镜像的构建过程。本文将深入解释 Dockerfile 的工作原理,并介绍常用的 Dockerfile 指令和构建命令,以帮助读者更好地理解和使用 Docker。

1.Dockerfile 简介

Dockerfile 是一个文本文件,其中包含了一系列的指令和配置,用于自动化地构建 Docker 镜像。通过定义 Dockerfile,我们可以指定基础镜像、安装软件、复制文件、设置环境变量等一系列操作,以创建一个完整的容器化应用环境。

2.Dockerfile 指令解析

下面是一些常见的 Dockerfile 指令的解释和示例用法:

2.1 FROM

FROM 指令用于指定基础镜像。一个 Dockerfile 可以以 FROM 指令开始,以引入一个基础镜像作为构建环境的起点。示例:

FROM ubuntu:18.04

该指令从 Docker Hub 上拉取一个名为 "ubuntu" 的镜像,并指定标签为 "18.04"。

2.2 RUN

RUN 指令用于在镜像中执行命令。可以使用该指令安装软件包、执行编译操作等。示例:

RUN apt-get update && apt-get install -y curl

该指令更新 apt 包管理工具的软件包列表,并安装 curl 软件包。

2.3 COPY

COPY 指令用于将文件或目录从构建环境复制到镜像中。示例:

COPY app.py /app/

该指令将构建环境中的 app.py 文件复制到镜像中的 /app/ 目录下。

2.4 ADD

ADD 指令类似于 COPY 指令,但它支持更多功能,如自动解压缩压缩包等。尽量使用 COPY 指令,除非确实需要 ADD 的高级功能。示例:

ADD archive.tar.gz /data/

该指令将构建环境中的 archive.tar.gz 压缩包复制到镜像中的 /data/ 目录下,并自动解压缩。

2.5 CMD

CMD 指令用于指定容器启动时默认执行的命令。一个 Dockerfile 中只能存在一个 CMD 指令。示例:

CMD ["python", "app.py"]

该指令在容器启动时执行 python app.py 命令。

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在docker run 时运行。
  • RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

2.6 ENTRYPOINT

ENTRYPOINT 指令类似于 CMD 指令,但它不会被 docker run 命令行中的参数覆盖。示例:

ENTRYPOINT ["python"] CMD ["app.py"]

该指令将 python 设置为容器的默认执行命令,并且可以通过 docker run 的参数指定要执行的 app.py 文件。

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。

示例:

假设已通过 Dockerfile 构建了 nginx:test 镜像:

FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参 

1、不传参运行

docker run  nginx:test

容器内会默认运行以下命令,启动主进程。

nginx -c /etc/nginx/nginx.conf

2、传参运行

docker run  nginx:test -c /etc/nginx/new.conf

容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)

nginx -c /etc/nginx/new.conf

2.7 ENV

ENV 指令用于设置环境变量。可以在 Dockerfile 中使用这些环境变量,并且它们会传递到容器运行时环境。示例:

ENV APP_HOME /app WORKDIR $APP_HOME

该指令设置一个名为 APP_HOME 的环境变量,并将其值设为 /app。接下来的 WORKDIR 指令将工作目录切换到环境变量 $APP_HOME 指定的路径。

2.8 ARG

ARG 指令用于定义构建参数,可以在构建镜像时传递参数。示例:

ARG VERSION RUN echo $VERSION

该指令定义了一个名为 VERSION 的构建参数,并在构建过程中输出其值。

2.9 EXPOSE

EXPOSE 指令用于声明容器运行时监听的端口。示例:

EXPOSE 8080

该指令声明容器将监听主机的 8080 端口。

2.10 WORKDIR

WORKDIR 指令用于设置工作目录。该目录将用作后续指令(如 RUN、CMD)的默认路径。示例:

WORKDIR /app

该指令将工作目录切换到 /app。

2.11 VOLUME

VOLUME 指令用于在镜像中创建一个或多个挂载点,并声明容器可以将这些挂载点暴露给主机或其他容器。示例:

VOLUME /data

该指令在镜像中创建一个名为 /data 的挂载点。

2.12 USER

USER 指令用于指定容器运行时的用户或用户组。示例:

USER nobody

该指令将容器运行时的用户设置为 "nobody"。

3.构建 Docker 镜像的常用命令

以下是一些常用的命令,用于构建、管理和运行 Docker 镜像:

3.1 docker build

docker build 命令用于根据 Dockerfile 构建镜像。示例:

docker build -t myapp:1.0 .

该命令将在当前目录中的 Dockerfile 中构建一个名为 myapp 的镜像,标签为 1.0。

3.2 docker tag

docker tag 命令用于为已构建的镜像添加标签。示例:

docker tag myapp:1.0 myrepo/myapp:latest

该命令将 myapp:1.0 镜像添加一个名为 latest 的标签,并将其命名为 myrepo/myapp。

3.3 docker push

docker push 命令用于将镜像推送到远程仓库。示例:

docker push myrepo/myapp:latest

该命令将 myrepo/myapp 镜像推送到远程仓库。

3.4 docker pull

docker pull 命令用于从远程仓库拉取镜像。示例:

docker pull myrepo/myapp:latest

该命令从远程仓库拉取 myrepo/myapp 镜像。

3.5 docker run

docker run 命令用于创建并启动一个容器。示例:

docker run -d -p 8080:80 myapp:1.0

该命令创建一个名为 myapp 的容器,并将容器的 80 端口映射到主机的 8080 端口。

3.6 实例:构建自定义镜像

下面是一个示例,演示如何使用 Dockerfile 构建自定义镜像:

 步骤 1:创建一个名为 Dockerfile 的文件。

FROM ubuntu:18.04 
RUN apt-get update && apt-get install -y curl 
CMD ["curl", "https://www.example.com"]

 步骤 2:在 Dockerfile 所在的目录中执行以下命令以构建镜像。

docker build -t mycurl .

步骤 3:运行以下命令以创建并启动容器。

docker run mycurl

通过上述步骤,我们创建了一个自定义镜像,其中包含了一个基于 Ubuntu 18.04 的容器,安装了 curl 软件包,并设置容器默认执行的命令为访问 https://www.example.com。

本文介绍了 Dockerfile 的工作原理和常用指令,以及构建 Docker 镜像的常用命令。了解 Dockerfile 的使用和相关命令可以帮助开发人员更好地管理和部署容器化应用程序。通过编写自定义的 Dockerfile,我们可以根据特定需求构建定制化的容器镜像,以满足不同场景的需求。希望本文能够帮助读者深入理解 Dockerfile,并在实践中灵活应用。

5fa9c60d09394eaa927b0e4ecca44714.gif

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/738353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

银河麒麟V10使用编译安装PostSQL+PostGIS

一、安装环境 银河麒麟V10 1、PostGIS简介 PostGIS是对象关系型数据库系统PostgreSQL的一个扩展,PostGIS提供如下空间信息服务功能: 空间对象、空间索引、空间操作函数和空间操作符。同时,PostGIS遵循OpenGIS的规范。 二、使用make安装Post…

Day49

思维导图 练习 闹钟设计 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> #include <QPushButton> #include <QLabel> #include <QLineEdit> #include <QTextEdit> #include <QTimer> …

【C++】STL——stack和queue使用及模拟实现

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f681; 个人主页&#xff1a;不 良 &#x1f525; 系列专栏&#xff1a;&#x1f6f8;C &#x1f6f9;Linux &#x1f4d5; 学习格言&#xff1a;博观而约取&#xff0…

ICG试剂大合集:ICG-COOH/NHS/NH2/Maleimide/alkyne/N3

荧光染料及其荧光标记技术一直是生物领域常用的产品和技术&#xff0c;标记荧光的波长从300nm到1000nm&#xff0c;除了常见的FITC、FAM等荧光标记染料外&#xff0c;还包括Cy3&#xff0c;Cy3.5&#xff0c;Cy5, Cy5.5&#xff0c;Cy7&#xff0c;Cy7.5&#xff0c;ICG各种衍生…

vue2登录存储案例:sessionStorage会话存储+localStorage本地存储

vue2可以通过sessionStorage来实现登录以后的数据存储&#xff0c;是H5提供的一个API&#xff0c;可以在浏览器会话期间保持数据 简单模拟一个登录后的存储功能 目录 一、sessionStorage存储 二、localStorage本地存储 一、sessionStorage存储 1、登录的HTML方法 HTML &l…

Java基础---注解

目录 典型回答 什么是元注解 如何判断注解 典型回答 Java 注解用于为 Java 代码提供元数据作为元数据&#xff0c;注解不直接影响你的代码执行&#xff0c;但也有一些类型的注解实际上可以用于这一目的Java注解是从 Java5 开始添加到 Java 的Java的注解&#xff0c;可以说是…

GitHub Pages + Hexo

步骤 参考如下步骤&#xff1a;https://blog.csdn.net/yaorongke/article/details/119089190 出现的问题 1 Fluid主题 其更换Fluid主题时&#xff1a; 下载最新 release 版本 解压到 themes 目录&#xff0c;并将解压出的文件夹重命名为 fluid 按照上面执行后&#xff0c;后…

Michael.W基于Foundry精读Openzeppelin第7期——Timers.sol

Michael.W基于Foundry精读Openzeppelin第7期——Timers.sol 0. 版本0.1 Timers.sol 1. 目标合约2. 代码精读2.1 区块链时间戳维度2.1.1 Timestamp结构体2.1.2 setDeadline(Timestamp storage, uint64) && getDeadline(Timestamp memory)2.1.3 reset(Timestamp storage)…

Linux:基于PXE的kickstart无人值守技术

*创建应答文件&#xff0c;预先定义好各种安装设置 *免去交互设置过程&#xff0c;从而实现全自动化安装 *通过添加%post脚本&#xff0c;完成安装后的各种配置操作 需要的环境为 pxe&#xff08;dhcp&#xff0c;tftp&#xff0c;yum&#xff09; Linux&#xff1a;PXE网络装…

深度学习——批数据训练

代码与详细注释&#xff1a; BATCH_SIZE 5&#xff0c;shuffleTrue import torch import torch.utils.data as Data# 添加随机种子以使结果可复现 torch.manual_seed(1) # reproducible# 批大小 BATCH_SIZE 5 # BATCH_SIZE 8x torch.linspace(1, 10, 10) # this…

VScode 终端无法识别npm以及Missing script: “serve“ 问题

无法识别npm解决办法&#xff1a; 原因是没有全局安装npm 1.通过终端查看已经全局安装的模块 npm list --depth0 -global 2.全局安装npm npm install -g npm Missing script: "serve" 问题&#xff1a; 原因是package.json中没有配置&#xff1a;"serve"…

JUC 并发编程

文章目录 JUC 并发编程一、Lock 锁1. 可重入锁2. 公平锁3. 读写锁3.1 ReadWriteLock 接口3.2 ReentrantReadWriteLock 类3.3 锁降级 4. 线程间通信4.1 虚假唤醒4.2 线程通信&#xff08;Condition&#xff09;4.3 定制化线程通信 二、集合线程安全1. CopyOrWrite2. ConcurrentH…

机试刷题记录 2023-7-6

AB问题 题目描述 Time Limit: 1000 ms Memory Limit: 256 mb 输入A,B 输出AB -1,000,000,000<A,B<1,000,000,000 输入输出格式 输入描述: 输入包含两个整数A,B&#xff0c;用一个空格分隔。 输出描述: 输出一个整数&#xff0c;表示AB的值。 输入输出样例 输入…

ResNet网络结构入门

ResNet网络结构入门 一、传统卷积神经存在的问题二、Residual 结构&#xff08;残差结构&#xff09;ResNet 中的残差结构ResNet 中的 short cut 三、Batch Normalization Resnet 网络创新点 提出 Residual 结构&#xff08;残差结构&#xff09;&#xff0c;可搭建超深的网络…

第44节:cesium 大雾效果(cesium自带)(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><!

C#核心知识回顾——12.lambda表达式、List排序、协变和逆变

1.Lambda表达式 可以将lambad表达式理解为匿名函数的简写 它除了写法不同外&#xff0c;使用上和匿名函数一模一样 都是和委托或者事件配合使用的 //匿名函数 //delegate&#xff08;参数列表&#xff09; //{ //} //lambda表达式 //(参数列表) > //{ //函数体 //…

【Axure高保真原型】冻结固定中继器表格首尾两列

今天和大家分享冻结固定中继器表格首尾两列的原型模板&#xff0c;当我们遇到表格内容较多时&#xff0c;可以用这个模板固定第一列和最后一列操作列。这个模板是用中继器制作的&#xff0c;所以使用也很简单&#xff0c;只需要在中继器里填写对应数据即可&#xff0c;具体效果…

游戏渲染技术:前向渲染 vs 延迟渲染 vs Forward+渲染(二)

GTA5 2 前向渲染 前向渲染是三个光照技术中最简单的&#xff0c;也是游戏图形渲染中最常见的技术。出于这个原因&#xff0c;也是光照计算最昂贵的技术&#xff0c;它不允许在场景中出现大量的动态光源。 大部分使用前向渲染的图形引擎会采用一些技术来模拟场景中大量的光源的…

K8S应用流程安全(镜像安全 配置管理 访问安全)

应用流程安全 1 应用流程安全1.1 镜像安全1.1.1 构建原则1.1.2 Dockerfile实践1.1.3 构建进阶1.1.4 镜像检测1.1.5 仓库升级1.1.6 高可用仓库1.1.7 镜像策略 1.2 配置管理1.2.1 配置基础1.2.2 YAML安全1.2.3 kustomize1.2.4 基础实践1.2.5 功能复用1.2.6 配置定制1.2.7 补丁实践…

python接口自动化(二十七)--html 测试报告——上(详解)

简介 上一篇我们批量执行完用例后&#xff0c;生成的测试报告是文本形式的&#xff0c;不够直观&#xff0c;而且报告一般都是发给leader的&#xff0c;所以最好是直观一目了然&#xff0c;为了更好的展示测试报告&#xff0c;最好是生成 HTML 格式的。unittest 里面是不能生成…