Docker Build 命令详解:在 Ubuntu 上构建 Docker 镜像教程

简介

Docker 通过提供轻量级、可移植和高效的解决方案,彻底改变了软件开发和部署。docker build 命令是 Docker 镜像创建过程的核心。本文将探讨 docker build 命令、其语法、用法以及优化 Docker 构建的最佳实践。本教程的目标是手把手教你如何在 Linux 服务器上使用 docker build 命令构建 Docker 镜像。

准备工作

服务器准备

必要前提:

  • 一个充满求知欲的大脑。
  • 一台 Linux 服务器(推荐腾讯云、阿里云或雨云等)。

我将以 雨云 为例,带大家创建一台自己的云服务器,以便学习本篇文章的内容。

注册链接: https://rainyun.ivwv.site

创建雨云服务器

以下步骤仅供参考,请根据实际需求选择配置。

  • 点击 云产品云服务器立即购买
  • 选择距离你较近的区域,以保证低延迟。

  • 按照自己需求选择配置,选择 Ubuntu 22.04 版本,按照自己需求是否预装 Docker。
  • 最后按照提示进行购买。
  • 购买后等待机器部署完毕,点击刚刚创建好的服务器,进入管理面板,找到远程连接相关信息。

  • 我们使用 PowerShell 进行 SSH 远程连接到服务器,Win+R 打开运行窗口,输入 powershell 后点击确定。

  • 输入 ssh root@你的服务器IP 例如 ssh root@154.9.227.239 回车后,首次需要输入 yes,再次回车后即可登录服务器。

  • 到此为止,我们的云服务器就远程连接上了。

安装和配置步骤

Docker build 的作用

那么,docker build 命令到底是什么?它在 Docker 生态系统中扮演着什么角色?docker build 是一个命令行接口(CLI)命令,它允许你根据 Dockerfile 中指定的指令构建 Docker 镜像。它自动化了镜像创建过程,确保了一致性和可重复性。

docker build 命令的语法和用法

要使用 docker build 命令,你必须首先了解它的语法。理解语法和可用选项将帮助你根据你的需求自定义构建过程。docker build 命令的语法如下:

docker build [OPTIONS] PATH | URL
  • OPTIONS: 指的是修改构建行为的标志和选项。
  • PATH | URL: 表示构建上下文,或者你想要设置 Docker 容器的位置,它可以是本地目录或远程 Git 仓库。

docker build 命令的常用选项和标志

通过理解 docker build 命令的语法和可用选项,你可以根据你的特定需求定制构建过程,无论是分配标签、指定备用 Dockerfile 位置、传递构建时变量还是强制执行干净构建。

在使用 docker build 命令时,有几个常用的选项和标志,它们为构建过程提供了灵活性和自定义功能。让我们通过示例来探索其中的一些选项和标志:

  • t-tag:此选项允许你为构建的镜像分配标签,以便于引用和版本控制。在此示例中,构建的镜像将标记为 “sampleapp”,版本为 “latest”。

    示例用法: docker build -t sampleapp:latest .

  • ffile:如果 Dockerfile 的名称不是 “Dockerfile”,则可以使用此选项指定不同的 Dockerfile 名称或位置。在此示例中,将使用当前目录中名为 “ProductionDockerfile” 的 Dockerfile 构建镜像。

    示例用法: docker build -f ProductionDockerfile .

  • -build-arg-build-arg 选项允许你将构建时变量传递给 Dockerfile,从而在构建过程中实现动态自定义。此命令将一个名为 “VERSION” 的构建时变量传递给 Dockerfile,其值为 “10”。

    示例用法: docker build --build-arg VERSION=10 .

  • -no-cache:此选项可用于强制 Docker 忽略缓存层并执行全新构建。此命令强制 Docker 忽略缓存并使用所有层执行全新构建。

    示例用法: docker build --no-cache .

  • -target:如果你的 Dockerfile 使用 FROM 指令定义了多个构建阶段,则 -target 选项允许你指定要构建的特定目标阶段。在此示例中,将仅构建 Dockerfile 中定义为 “mytarget” 的阶段。

    示例用法: docker build --target mytarget .

  • -quietq-quiet 选项会抑制构建输出,仅在成功构建镜像后显示最终镜像 ID。此命令以静默方式执行构建,仅显示生成的镜像 ID。

    示例用法: docker build --quiet .

这些只是一些常用的选项,Docker build 提供了更多选项和标志,你可以在 官方 Docker 文档 中探索。

Docker 构建的工作原理

Docker 构建过程会基于 Dockerfile 中的指令创建 Docker 镜像。此文件包含构建指令,例如复制文件、安装依赖项、运行命令等。

当你运行 docker build 时,Docker 守护进程会读取 Dockerfile 并按顺序执行每条指令,生成分层镜像。每条指令都会创建一个轻量级、只读的文件系统快照,称为层。Docker 会缓存未更改的层,以加快后续构建速度。自上次构建以来未更改的层会被缓存和重用,避免了重建这些层的需要,从而显著缩短了构建时间。

一旦所有指令都执行完毕,Docker 就会创建包含应用程序及其依赖项的最终镜像,该镜像已准备好用于运行容器。

如何从 Dockerfile 构建 Docker 镜像:分步指南

为了从 Dockerfile 构建 Docker 镜像,让我们看看 docker build 命令的实际应用。在以下步骤中,我们将构建一个简单的 Docker 镜像,一个通过安装提供网页的 Web 服务器。你将在本地计算机上构建、运行和测试它。

第一步 - 创建一个工作目录

创建一个目录或文件夹用于此演示(此处使用 “docker-demo”),并通过在终端中运行以下命令导航到该目录:

mkdir docker-demo
cd docker-demo

在目录中创建一个名为 “index.html” 的文件,并将以下内容添加到其中:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Simple App</title></head><body><h1>Hello World</h1><p>This is running in a docker container</p></body>
</html>

这将用作服务器提供的网页。

第二步 - 选择一个基础镜像

接下来,从 Docker Hub 或本地仓库中选择一个合适的基础镜像。基础镜像构成了你的自定义镜像的基础,并包含操作系统和基本依赖项。几乎每个 Docker 镜像都基于另一个镜像。在此演示中,你将使用 nginx:stable-alpine3.17-slim 作为基础镜像。

第三步 - 创建一个 Dockerfile

现在创建一个名为 “Dockerfile” 的文件。此文件将定义你的镜像的构建指令。默认情况下,当你运行 docker build 命令时,Docker 会搜索 Dockerfile。

第四步 - 将构建指令添加到 Dockerfile

在文本编辑器中打开 Dockerfile 并添加以下行:

FROM nginx:stable-alpine3.17-slim
COPY index.html /usr/share/nginx/htmlEXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

上面的指令将创建一个 Docker 镜像,当基于该镜像启动容器时,该镜像通过 Nginx Web 服务器提供提供的 “index.html” 文件。

FROM 指令初始化一个新的构建阶段,并为后续指令设置基础镜像。COPY 指令将文件或目录(通常是源代码)从源复制到镜像内的指定位置。它将文件复制到 “/usr/share/nginx/html” 目录,这是 Nginx Web 服务器中用于提供静态文件的默认位置。CMD 指令的主要目的是为执行容器提供默认值。Dockerfile 中定义的指令会因你尝试构建的镜像类型而异。

第五步 - 使用 docker build 命令构建镜像

在构建 Docker 镜像之前,请通过运行 docker --version 命令确认你已安装 Docker。

要构建你的容器,请确保你位于 Dockerfile 所在的文件夹中,并在终端中运行以下命令:

docker build -t sampleapp:v1 .

此命令启动 Docker 构建过程,以基于当前目录(.)中的 Dockerfile 中指定的指令创建 Docker 镜像。

  • t 标志指定镜像的标签,允许你为其分配名称和版本。在这种情况下,镜像将标记为 “sampleapp”,版本为 “v1”,为镜像提供了一个描述性标识符,使其更易于引用和管理。

你应该看到构建过程开始,并在完成时看到一个指示它已完成的输出。

第六步 - 验证构建的 Docker 镜像

成功构建后,通过运行 docker images 命令来验证镜像,以列出 Docker 主机上所有可用的镜像。你应该看到你新创建的镜像及其分配的标签和其他相关详细信息,已准备好用于运行容器或推送到容器注册表以进行分发。

第七步 - 运行 Docker 镜像

接下来,使用以下命令将 Docker 镜像作为容器运行:

docker run -p 8080:80 sampleapp:v1

此命令告诉 Docker 运行 sampleapp 容器。-p 标志指定端口映射,它将主机上的端口映射到容器内的端口。在这里,你将主机的 8080 端口映射到容器的 80 端口。你可以根据自己的喜好修改主机端口。请确保指定构建镜像时使用的镜像名称和版本。

第八步 - 访问应用程序

容器运行后,你可以继续访问应用程序。打开 Web 浏览器并导航到 localhost:8080,你应该会在 Web 浏览器上看到显示的示例网页。

优化 Docker 构建的最佳实践

以下是一些你可以遵循的最佳实践,以优化你的 Docker 构建并确保效率:

  • 确保你的 Dockerfile 简洁、有条理且易于维护。将复杂的任务分解为更小、可重用的指令,从而提高可读性并简化故障排除和更新。
  • 在你的 Dockerfile 中使用轻量级镜像作为基础镜像,并确保你只在镜像中安装基本的东西。较小的镜像不仅可以提高性能,还可以在部署期间减少资源消耗。
  • 使用 .dockerignore 以确保你只添加了你需要的文件。
  • 利用 Docker 的缓存机制来加速后续构建。利用不经常更改的层,或在必要时使用 -no-cache=true 标志。这对于大型项目尤其有用。
  • 在适用时考虑使用多阶段构建。它们允许你将构建依赖项与最终运行时镜像分开,从而缩小镜像大小。

这些实践将提高你的 Docker 构建的效率,从而缩短构建时间、缩小镜像大小、提高性能并创建可靠的镜像。你可以从文档中阅读有关 docker 构建最佳实践 的更多信息。

故障排除 docker build 命令问题

即使使用最佳实践,你可能在 Docker 构建过程中偶尔会遇到问题。以下是一些常见问题及其潜在解决方案:

  • 错误:“无法找到 Dockerfile”: 确保你正在从包含 Dockerfile 的目录中运行 docker build 命令。
  • 构建失败或出现意外结果: 检查 Dockerfile 语法,并确保所有依赖项和命令都已正确指定。查看构建日志和错误消息,并考虑使用 -no-cache 选项执行干净构建。

结论

docker build 命令使开发人员能够将你的应用程序转换为可以在任何地方运行的可移植容器。在本指南中,我们研究了 Docker 构建过程的工作原理、Docker 构建语法和最佳实践,以及如何从 Dockerfile 分步构建 Docker 镜像。你应该更好地了解 docker build 命令以及如何使用它,并利用这些知识来构建更多自定义 Docker 镜像,以使你的应用程序可移植。

推广链接:

  • 雨云 - 新一代云服务提供商: https://rainyun.ivwv.site
  • 我的博客:https://blog.ivwv.site

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

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

相关文章

Springboot应用开发:配置类整理

目录 编写目的 一、线程池 1.1 setCorePoolSize 1.2 setMaxPoolSize 1.3 setQueueCapacity 1.4 setKeepAliveSeconds 1.5 setThreadNamePrefix 1.6 setRejectedExecutionHandler 1.7 示例代码 二、Durid数据库连接池 2.1 ServletRegistrationBean 2.2 FilterRegist…

【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 一、Bean的作用域 在 Java Spring 框架中&#xff0c;Bean 的作用域是一个关键概念&#xff0c;它决定了 Bean 的生命周期和实例化方式&#xff0c;对应用的性…

Excel 列名称转换问题 Swift 解答

文章目录 摘要描述题解答案Swift 实现代码&#xff1a;题解代码分析示例测试及结果 时间复杂度空间复杂度总结未来展望参考资料 摘要 本篇文章将通过 Swift 编程语言解答一个常见的算法问题&#xff1a;给定一个整数 columnNumber&#xff0c;将其转换为 Excel 表中的列名称。…

基于艾伦方差的频率稳定性分析

某个授时系统通过串口或网口采集时间间隔计数器、频率计数器、相位噪声分析仪设备的重要信息,用于评估和分析频率源的频率稳定度,确保测量的准确性和可靠性。 数据处理: 读取保存在文件中的时间间隔计数器测量的时差数据,计算时间稳定度(用TDEV表示)并保存。TDEV包括秒稳…

秒鲨后端之MyBatis【1】环境的搭建和核心配置文件详解

​ 别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff…

虚幻引擎结构之ULevel

在虚幻引擎中&#xff0c;场景的组织和管理是通过子关卡&#xff08;Sublevel&#xff09;来实现的。这种设计不仅提高了资源管理的灵活性&#xff0c;还优化了游戏性能&#xff0c;特别是在处理大型复杂场景时。 1. 场景划分模式 虚幻引擎采用基于子关卡的场景划分模式。每个…

CentOS7下的vsftpd服务器和客户端

目录 1、安装vsftpd服务器和ftp客户端&#xff1b; 2、配置vsftpd服务器&#xff0c;允许普通用户登录、下载、上传文件&#xff1b; 3、配置vsftpd服务器&#xff0c;允许anonymous用户登录、下载、上传文件&#xff1b; 4、配置vsftpd服务器&#xff0c;允许root用户登录…

系统思考—全局思维

昨天接到一个企业需求&#xff0c;某互联网公司VP希望N-1的核心团队一起学习系统思考&#xff0c;特别是在新业务快速发展的阶段。公司增长势头不错&#xff0c;但如何解决跨部门的协作问题&#xff0c;成为了瓶颈。全局思维就是关键。产品、技术、市场、运营、客服……如何打破…

美国加州房价数据分析01

1.项目简介 本数据分析项目目的是分析美国加州房价数据&#xff0c;预测房价中值。 环境要求&#xff1a; ancondajupyter notebookpython3.10.10 虚拟环境&#xff1a; pandas 2.1.1 numpy 1.26.1 matplotlib 3.8.0 scikit-learn1.3.1 2. 导入并探索数据集 通用的数据分析…

LabVIEW软件开发的未来趋势

LabVIEW软件开发的未来趋势可以从以下几个方面来分析&#xff1a; ​ 1. 与AI和机器学习的深度结合 趋势&#xff1a;LabVIEW正在向集成AI和机器学习方向发展&#xff0c;尤其是在数据处理、预测性维护和自动化控制领域。 原因&#xff1a;AI技术的普及使得实验和工业场景中的…

使用Amazon Bedrock的无服务器的智能工作流

使用Amazon Bedrock的无服务器的智能工作流 智能工作流基于用户输入处理不可预见的任务&#xff0c;比如发起API调用。无服务器架构可以高效地管理这些任务和不同的工作负载&#xff0c;而无需维护服务器&#xff0c;从而加快部署速度。 你将学习如何通过使用带有保护措施的智能…

近实时”(NRT)搜索、倒排索引

近实时&#xff08;Near Real-Time, NRT&#xff09;搜索 近实时&#xff08;NRT&#xff09;搜索是 Elasticsearch 的核心特性之一&#xff0c;指的是数据在被写入到系统后&#xff0c;可以几乎立即被搜索和查询到。虽然它不像传统数据库那样完全实时&#xff0c;但它的延迟通…

【NACOS插件】使用官网插件更换NACOS数据库

说明 nacos 2.3.1默认支持mysql和derby数据库&#xff0c;如果想要支持其他数据库&#xff0c;可以通过使用插件方式实现。对于该插件的使用&#xff0c;官方说明文档较为粗略(不过也没问题&#xff0c;实际上整个过程就是很简单&#xff0c;只是使用者想复杂了)&#xff0c;网…

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集FGSM介绍FGSM代码实现FGSM算法实现攻击效果 代码汇总fgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行分类 Pytorch | 从零构建Vgg…

【IC验证】verilog及systemverilog特殊特性的分析

verilog及systemverilog特殊特性的分析 1.概述2.赋值延迟&#xff08;0&#xff09;总结&#xff08;1&#xff09;情况一&#xff1a;initial中进行阻塞赋值和非阻塞赋值&#xff08;不延迟&#xff09;a代码b 电路图c 结果 &#xff08;2&#xff09;时钟a 代码b 电路图c 结果…

考前96天 学习巩固 计算机、数学、英语

2024年12月24日到2025年3月29日共有 96​ 天 一、计算机基础 回顾&#xff1a; 三大思维&#xff1a; 数学 推理/理论 物理 证实/实验 计算机 构造/计算 本质——》抽象/自动化 计算复杂性&#xff1a;空间复杂性、时间复杂性 计算机系统的组成&#xff1a; 1️⃣硬件…

如何用digital实现一个4位的减法器?

文件可以在下方链接下载&#xff1a; https://download.csdn.net/download/dashuchengtian/90178176 组件拼接如下图所示&#xff1a; 其中A和B是一个4位的输入&#xff0c;Cin表示有无借位&#xff0c;S表示和&#xff0c;Cout表示的是借位输出。 运行结果如下&#xff0c;以…

C++之“流”-第5课.三军联动:流 +操作符+函数重载

如何针对特定函数类型重载流输出操作符&#xff1f;这样做有什么用处&#xff1f;C语言中&#xff0c;“流”、“操作符”、“函数重载” 这三大军团如何配合作战&#xff1f; 前言 C中&#xff0c;“流” 的日常运用&#xff0c;最基本的就是在你的代码里使用 << 和 &g…

并发编程(19)——引用计数型无锁栈

文章目录 十九、day191. 引用计数2. 代码实现2.1 单引用计数器无锁栈2.2 双引用计数器无锁栈 3. 本节的一些理解 十九、day19 上一节我们学习通过侯删链表以及风险指针与侯删链表的组合两种方式实现了并发无锁栈&#xff0c;但是这两种方式有以下缺点&#xff1a; 第一种方式…

【微信小程序】2|轮播图 | 我的咖啡店-综合实训

轮播图 引言 在微信小程序中&#xff0c;轮播图是一种常见的用户界面元素&#xff0c;用于展示广告、产品图片等。本文将通过“我的咖啡店”小程序的轮播图实现&#xff0c;详细介绍如何在微信小程序中创建和管理轮播图。 轮播图数据准备 首先&#xff0c;在home.js文件中&a…